OpenCV imshow()可以防止Qt / python崩溃

时间:2017-03-29 13:14:01

标签: python sockets opencv video pyqt

我正在使用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))

1 个答案:

答案 0 :(得分:2)

您需要刷新事件队列,以便更新GUI。在QtGui.QApplication.processEvents()功能后添加setPixamp

它与cv2.waitKey()一起使用,因为它在内部已刷新绘制事件,允许刷新Qt GUI。但我建议不要依赖此 hack ,并使用processEvents明确刷新Qt事件。

您可能还希望将此处理循环放在其自己的线程中,以使GUI /主线程保持响应。