我尝试使用opencv从摄像机获取网络摄像头数据,然后在PyQt图形用户界面中显示这些数据。在使用Tkinter之前,我已经使用.after函数访问Tkinter主窗口循环。但是,PyQt似乎没有相同的可用性,为了让另一个循环与应用程序一起运行,您需要使用一个单独的线程。所以我想到的是:
import sys
import cv2
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4.QtGui import QImage
import time
class VideoCapture(QtGui.QWidget):
def __init__(self, parent = None):
QtGui.QWidget().__init__()
self.camera = None
self.camera = cv2.VideoCapture(0)
b, self.frame = self.camera.read()
self.label = QtGui.QLabel()
self.workThread = WorkThread(self)
self.connect(self.workThread, QtCore.SIGNAL('update_Camera'), self.draw)
self.workThread.start()
def closeEvent(self, event):
self.workThread.stop()
def draw(self):
print "I should Redraw"
height, width, channel = self.frame.shape
bpl = 3 * width
self.qImg = QImage(self.frame.data, width, height, bpl, QImage.Format_RGB888)
pix = QtGui.QPixmap(self.qImg)
self.label.setPixmap(pix)
self.label.show()
class WorkThread(QtCore.QThread):
def __init__(self, parent):
QtCore.QThread.__init__(self)
self.parent = parent
def __del__(self):
self.wait()
def run(self):
while True:
self.emit(QtCore.SIGNAL('update_Camera'), "_")
self.terminate()
app = QtGui.QApplication(sys.argv)
test = VideoCapture()
test.draw()
sys.exit(app.exec_())
我的想法很简单:我将创建一个带有循环的线程,该线程发出一个信号,告诉主应用程序进行更新。(很明显,我不想要一个带有while True循环的线程,但我只是为了方便而使用它,并计划一旦我能保证这个想法可行,就替换它)。但是,信号似乎没有注册,因为draw()函数从未被调用。你知道我做错什么了吗?在
我对OpenCV一无所知,所以我只能猜测问题所在。在
我猜你只是读了一次视频数据。如果它是一个视频流,那么你必须不断地读取和解释数据。在
因为你每秒只更新这么多次,所以你可以用定时器来代替线程。定时器可能更容易和更安全地使用。在
^{pr2}$我一直在研究和你的问题非常相似的事情。我修改了你的代码,并在我的Windows电脑上进行了测试
这里的关键点是,您必须将cv2 camera对象放入
WorkThread
,读取run()方法中主while循环中的每个帧,最后将图像发送到QWidget对象以显示它。通过这种方式,您可以获得图像捕获和显示的连续迭代。在相关问题 更多 >
编程相关推荐