【发布时间】: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(),它成功了!谢谢! -
很高兴它有帮助。然后发布了答案;)
标签: python sockets opencv video pyqt