【问题标题】:OpenCV imshow() prevents Qt / python crashingOpenCV imshow() 防止 Qt / python 崩溃
【发布时间】: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(),它成功了!谢谢!
  • 很高兴它有帮助。然后发布了答案;)

标签: python sockets opencv video pyqt


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 2020-05-25
    • 2021-02-26
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2013-05-30
    相关资源
    最近更新 更多