Python 如何使用opencv拍照并同时可视化网络摄像头
在下面的代码中,我在Python 如何使用opencv拍照并同时可视化网络摄像头,python,python-3.x,opencv,Python,Python 3.x,Opencv,在下面的代码中,我在QLabel中显示了pc的网络摄像头。 但是,当尝试使用self.boton1按钮拍照时,他不会拍照。 Self.boton1连接到def-take()功能,这是我用来拍照的功能 但它不起作用我希望你能帮助我: 尝试将self.boton1.clicked.connect(self.take(self.capture))放在setup\u camera()函数中,将捕获的数据作为参数传递给take()函数。捕获但它不起作用 from PyQt5.QtWidgets impor
QLabel
中显示了pc的网络摄像头。
但是,当尝试使用self.boton1
按钮拍照时,他不会拍照。
Self.boton1
连接到def-take()
功能,这是我用来拍照的功能
但它不起作用我希望你能帮助我:
尝试将self.boton1.clicked.connect(self.take(self.capture))
放在setup\u camera()
函数中,将捕获的数据作为参数传递给take()
函数。捕获但它不起作用
from PyQt5.QtWidgets import QMainWindow,QApplication
import cv2
from PyQt5 import QtCore
import numpy as np
from PyQt5 import QtGui
from PyQt5 import uic
class Main(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
uic.loadUi("f.ui",self)
self.boton1.clicked.connect(self.take)
self.video_size = QtCore.QSize(320,240)
self.setup_camera()
uic.loadUi("f.ui",self)
def setup_camera(self):
self.capture = cv2.VideoCapture(0)
self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, 160)
self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT,self.video_size.height())
#self.Bfoto.clicked.connect(lambda:self.take(self.capture))
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.display_video_stream)
self.timer.start(30)
def display_video_stream(self):
_,frame =self.capture.read()
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
frame = cv2.flip(frame,1)
image = QtGui.QImage(frame,frame.shape[1],frame.shape[0],frame.strides[0],QtGui.QImage.Format_RGB888)
self.label.setPixmap(QtGui.QPixmap.fromImage(image))
def take(self):
print("value")
cap = videoCapture(0)
leido,frame = cap.read()
if leido ==True:
cv2.imwrite("photo.png",frame)
print("ok")
else:
print("error")
cap.release()
app = QApplication([])
m = Main()
m.show()
app.exec_()
f、 用户界面
主窗口
0
0
671
519
主窗口
530
400
75
23
福托
100
30
481
311
文本标签
0
0
671
21
我希望通过按下self.boton
按钮,可以触发def take()
功能并拍照
问题
python代码主要有两个问题。
1.您在init()块中加载了两次f.ui
因此,在第二个uic.loadUi()中,上一次的初始化被清除,这就是为什么按钮单击事件不起作用的原因
二,
在此块中,您可以使用上一个self.capture对象,这样您就可以只处理一个对象,这使它变得简单。由于该对象只应在退出该程序时释放,因此不需要在此处使用cap.release()
解决方案
米特拉。新错误:
文件“C:\Users\Angel\Desktop\s.py”,第30行,在display\u video\u stream frame=cv2.cvtColor(frame,cv2.COLOR\u BGR2RGB)cv2.error:OpenCV(4.0.0)C:\projects\OpenCV python\OpenCV\modules\imgproc\src\COLOR.cpp:181:错误:(-215:断言失败)_函数“cv::cvtColor”中的src.empty()
@kousikMiltra新错误:C:\projects\opencv python\opencv\modules\imgproc\src\color.cpp:181:错误:(-215:断言失败)_函数“cv::cvtColor”中的src.empty()
您使用的是哪个版本的opencv?你能把“显示视频流”的代码块发给我吗?米特拉。新错误:文件“C:\Users\Angel\Desktop\s.py”,第30行,在display\u video\u stream frame=cv2.cvtColor(frame,cv2.COLOR\u BGR2RGB)cv2.error:OpenCV(4.0.0)C:\projects\OpenCV python\OpenCV\modules\imgproc\src\COLOR.cpp:181:错误:(-215:断言失败)_函数“cv::cvtColor”中的src.empty()
@kousikMiltra新错误:C:\projects\opencv python\opencv\modules\imgproc\src\color.cpp:181:错误:(-215:断言失败)_函数“cv::cvtColor”中的src.empty()
您使用的是哪个版本的opencv?你能把“显示视频流”的代码块发给我吗?
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>671</width>
<height>519</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QPushButton" name="boton1">
<property name="geometry">
<rect>
<x>530</x>
<y>400</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>foto</string>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>100</x>
<y>30</y>
<width>481</width>
<height>311</height>
</rect>
</property>
<property name="text">
<string>TextLabel</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>671</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
def __init__(self):
QMainWindow.__init__(self)
uic.loadUi("f.ui",self)
self.boton1.clicked.connect(self.take)
self.video_size = QtCore.QSize(320,240)
self.setup_camera()
uic.loadUi("f.ui",self)
def take(self):
print("value")
cap = videoCapture(0)
leido,frame = cap.read()
if leido ==True:
cv2.imwrite("photo.png",frame)
print("ok")
else:
print("error")
cap.release()
self.boton1.clicked.connect(self.take)
self.video_size = QtCore.QSize(320,240)
self.setup_camera()
#uic.loadUi("f.ui",self)
if leido ==True:
cv2.imwrite("photo.png",frame)
print("ok")
else:
print("error")
cap.release()