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))
【问题讨论】:
您可能需要仔细检查您的问题...您似乎对imshow
和imread
感到困惑。您还可以标记代码(您的函数名称)
谢谢三木,你是对的!我更新了我的问题。某些原因我在写作时对这两者感到困惑,但我的意思是 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 崩溃的主要内容,如果未能解决你的问题,请参考以下文章