opencv를 사용하여 카메라에서 웹캠 데이터를 가져 와서 PyQt GUI에 표시하려고합니다. 필자는 Tkinter를 사용하여 Tkinter 메인 윈도우 루프에 .after 기능을 사용하여 액세스했습니다. 그러나 PyQt는 동일한 유용성을 가지지 않는 것 같으며 애플리케이션으로 실행되는 또 다른 루프를 가지기 위해 별도의 스레드를 사용해야한다. 그래서 내가 함께 온 것입니다 :OpenCV에서 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 루프가있는 스레드를 원하지 않지만이 아이디어가 효과가 있다는 것을 보증 할 수있게되면 그것을 대체하기 위해 계획을 편리하게 사용했습니다.) 그러나 draw() 함수가 호출되지 않기 때문에 신호가 등록 된 것으로 나타나지 않습니다. 어떤 생각이 내가 뭘 잘못하고있어?