我正在使用python和pyQt编写GUI,通过UDP套接字读取数据包,通过OpenCV处理,最后使用Qt将其显示为实时图像。我在while循环之外创建了一个UDP套接字,同时使用sock.recvfrom方法读取while循环内的数据包。在同一个while循环中,我处理数据并将其放入OpenCV格式,并使用OpenCV imshow()方法显示实验的实时视频。一切都很好,工作顺利,但当我尝试通过QLabel使用QImage和QPixmap显示视频时,事情变得奇怪。如果存在OpenCV imshow(),则代码可以正常使用OpenCV cv2.imshow()窗口顶部的QLabel中显示的其他QPixmap。但是,如果我取出OpenCV imshow(),UI将冻结,没有任何显示导致“python没有响应”。我还没有提出一个很好的理由,为什么会发生这种情况,我也尝试保持/更改cv2.waitkey()时间而不成功。任何帮助将不胜感激。
import socket
import cv2
from PyQt4 import QtCore, QtGui, uic
while True:
data, addr = self.sock.recvfrom(10240)
# after some processing on data to get im_data ...
self.im_data_color_resized = cv2.resize(im_data, (0, 0), interpolation = True)
# using OpenCV to show the video (the entire code works with cv2.imshow but not without it)
cv2.imshow('Real Time Image', self.im_data_color_resized)
cv2.waitKey(10)
# using QLabel to show the video
qtimage = cv2.cvtColor(self.im_data_color_resized, cv2.COLOR_BGR2RGB)
height, width, bpc = qtimage.shape
bpl = bpc * width
qimage = QtGui.QImage(qtimage.data, width, height, bpl, QtGui.QImage.Format_RGB888)
self.imageViewer_label.setPixmap(QtGui.QPixmap.fromImage(qimage))
答案 0 :(得分:2)
您需要刷新事件队列,以便更新GUI。在QtGui.QApplication.processEvents()
功能后添加setPixamp
。
它与cv2.waitKey()
一起使用,因为它在内部已刷新绘制事件,允许刷新Qt GUI。但我建议不要依赖此 hack ,并使用processEvents
明确刷新Qt事件。
您可能还希望将此处理循环放在其自己的线程中,以使GUI /主线程保持响应。