Python OpenCV函数在PyQt GUI窗口中转换的OpenCV窗口上不起作用
我正在使用OpenCV进行图像处理,并将图像嵌入PyQt GUI窗口中。我已经独立使用了OpenCV代码,它工作得很好。我还可以在OpenCV中创建以下窗口和对象,并通过cv2.cvtColor成功地将它们转换为其他颜色空间,然后转换为QPixmap并显示它们 当我尝试对OpenCV图像执行任何操作而不是转换颜色空间时,就会出现问题。我尝试过简单的OpenCV操作,例如cv.Smooth,甚至使用cv.CreateImage创建阈值图像,但这些都不起作用。我不确定执行这些操作是否需要很长时间,QTGui是否超时。 请帮帮我,我不明白怎么了。我在下面提供了我的代码片段:Python OpenCV函数在PyQt GUI窗口中转换的OpenCV窗口上不起作用,python,qt,opencv,image-processing,pyqt,Python,Qt,Opencv,Image Processing,Pyqt,我正在使用OpenCV进行图像处理,并将图像嵌入PyQt GUI窗口中。我已经独立使用了OpenCV代码,它工作得很好。我还可以在OpenCV中创建以下窗口和对象,并通过cv2.cvtColor成功地将它们转换为其他颜色空间,然后转换为QPixmap并显示它们 当我尝试对OpenCV图像执行任何操作而不是转换颜色空间时,就会出现问题。我尝试过简单的OpenCV操作,例如cv.Smooth,甚至使用cv.CreateImage创建阈值图像,但这些都不起作用。我不确定执行这些操作是否需要很长时间,Q
import cv2
import cv2.cv as cv
import numpy as np
import from PyQt4 import QtGui, QtCore
class Video():
def __init__(self,capture):
self.capture = capture
self.capture.open(1)
self.currentFrame=np.array([])
self.capture.set(3,800)
self.capture.set(4,600)
self.capture.set(5,30)
def processImage(self):
try:
while(True):
ret, readFrame=self.capture.read() # Grab next frame
if(ret==True):
print "processImage grabbed a frame"
#readFrame=cv2.cvtColor(readFrame,cv2.COLOR_BGR2HSV) < -- This works fine
#readFrame=cv2.cvtColor(readFrame,cv2.COLOR_HSV2RGB) < -- This works fine
cv.Smooth(readFrame,readFrame,cv.CV_BLUR,3) < -- Any functions like this cause problems
print 'It made it this far' # < -- This never gets printed because cv.Smooth doesn't properly execute
except TypeError:
print "ERROR: processImage couldn't get a frame"
def convertFrame(self):
""" converts frame to format suitable for QtGui """
try:
height,width=self.currentFrame.shape[:2]
img=QtGui.QImage(self.currentFrame,width,height,QtGui.QImage.Format_RGB888)
img=QtGui.QPixmap.fromImage(img)
self.previousFrame = self.currentFrame
return img
except:
return None
这可能与Qt GUI调用processImage有关,并且在上一个函数返回之前继续调用processImage会花费很长时间来处理图像并超时吗
请帮忙 甚至没有人试图回答这个问题,真的吗?如果你曾经遇到过这种情况,需要解决它,下面是解决问题的方法: 始终使用cv2类而不是旧的cv类 在我的代码中,我试图使用cv.QueryFrame,它返回一个cvMat,pyqt由于某种原因不喜欢这种数据类型 您需要将所有旧的cv函数转换为新的cv2函数。调用capture.read而不是cv.QueryFramecapture将返回一个VideoCapture对象,这是pyqt可以处理的数据类型 找出使用cv2的对应函数有点麻烦,但一旦你让它工作起来,它就值得了
class Gui(QtGui.QMainWindow):
def __init__(self,parent=None):
QtGui.QWidget.__init__(self,parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.video = Video(cv2.VideoCapture()) # Which device to capture frames from
self._timer = QtCore.QTimer(self)
self._timer.timeout.connect(self.play)
self._timer.start(27)
self.update()
def play(self):
try:
self.video.processImage()
self.ui.videoFrame.setPixmap(self.video.convertFrame())
self.ui.videoFrame.setScaledContents(True)
except TypeError:
print "No frame"
def main():
app = QtGui.QApplication(sys.argv)
ex = Gui()
ex.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()