opencvを使ってカメラからWebカメラデータを取得しようとしていて、それをPyQt GUIに表示しようとしています。これまでTkinterを使って、Tkinterメインウィンドウのループに.after関数でアクセスしました。しかし、PyQtは同じユーザビリティを持っていないようで、別のループをアプリケーションで実行させるためには別のスレッドを使う必要があります。だから、これは私が出ているものです:OpenCVからPyQtへのWebカメラ映像の取得
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_())
私の考えは簡単だった:私はちょうど更新するメインアプリケーションを伝える信号を発するループでスレッドを作成します。 (当然のことながら、私は真のループを持つスレッドを望んでいませんが、私は便宜のために使用しています。ただし、draw()関数が呼び出されないため、シグナルは登録されていないようです。私は間違って何をやっているの?