OpenCV imshow() 防止 Qt / python 崩溃

Posted

技术标签:

【中文标题】OpenCV imshow() 防止 Qt / python 崩溃【英文标题】:OpenCV imshow() prevents Qt / python crashing 【发布时间】:2017-08-23 00:06:52 【问题描述】:

我正在使用 python 和 pyQt 编写一个 GUI,以通过 UDP 套接字读取数据包,通过 OpenCV 对其进行处理,然后最终使用 Qt 将其显示为实时图像。我在 while 循环外创建了一个 UDP 套接字,同时使用 sock.recvfrom 方法读取 while 循环内的数据包。在同一个 while 循环中,我处理数据并将其转换为 OpenCV 格式,并使用 OpenCV imshow() 方法显示实时视频以进行实验。一切都很好并且工作顺利,但是当我尝试使用 QImage 和 QPixmap 通过 QLabel 显示视频时,事情变得很奇怪。如果 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))

【问题讨论】:

您可能需要仔细检查您的问题...您似乎对imshowimread 感到困惑。您还可以标记代码(您的函数名称) 谢谢三木,你是对的!我更新了我的问题。某些原因我在写作时对这两者感到困惑,但我的意思是 imshow()。 你在一个循环中......我认为你只需要在setPixmap 之后刷新事件队列调用(相当于 pyQt)QApplication::processEvents();。可能cv2.waitKey 函数在内部做了类似的事情 你是对的!我在setPixmap() 之后添加了QtGui.QApplication.processEvents(),它成功了!谢谢! 很高兴它有帮助。然后发布了答案;) 【参考方案1】:

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

它适用于cv2.waitKey(),因为它在内部已经刷新了允许刷新 Qt GUI 的绘画事件。但我建议不要依赖这个hack,并使用processEvents 显式刷新Qt 事件。

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

【讨论】:

以上是关于OpenCV imshow() 防止 Qt / python 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

imShow 上的 OpenCV 崩溃仅适用于 USB 网络摄像头

分别显示多个 OpenCV imshow() 窗口

OpenCV读取图像创建窗口显示图像

opencv imshow()

opencv imshow plt imshow

图像识别(11)——LED灯光点捕获+基于QT平台绘制轨迹