Python OpenCv视频显示PyQt5
我正在使用opencv3、python 3和pyqt5。我想制作一个简单的GUI,当在主窗口上单击一个按钮时,我想打开一个新窗口来播放视频以及其他一些小部件。过去我使用了Python OpenCv视频显示PyQt5,python,user-interface,opencv,pyqt,pyqt5,Python,User Interface,Opencv,Pyqt,Pyqt5,我正在使用opencv3、python 3和pyqt5。我想制作一个简单的GUI,当在主窗口上单击一个按钮时,我想打开一个新窗口来播放视频以及其他一些小部件。过去我使用了QPixmap来显示图像,因此我创建了一个标签,并尝试在循环中设置pixmap中的帧。循环工作正常,但我无法显示视频/新窗口。 我想在新窗口中执行的循环如下所示: def setupUi(): vid=cv2.VideoCapture('file') ret, frame=vid.read()
QPixmap
来显示图像,因此我创建了一个标签,并尝试在循环中设置pixmap中的帧。循环工作正常,但我无法显示视频/新窗口。
我想在新窗口中执行的循环如下所示:
def setupUi():
vid=cv2.VideoCapture('file')
ret, frame=vid.read()
while ret:
Qimg=convert(frame)
self.label.setpixmap(Qimg)
self.label.update()
ret,frame=vid.read()
convert()
是我自己编写的一个函数,它将cv帧转换为QImage
类型,以设置为pixmap。
我只是pyQt的初学者,所以不知道我做错了什么。我读过关于为新窗口使用信号、线程和QtApplication.processEvents()的内容,但不知道它们是如何工作的,以及它们如何适应我的问题。
如果有人能为我指明正确的方向,并指出一些资源,以便使用OpenCV和python为我的应用程序创建良好的界面,那将非常有帮助 这没有运行的原因是while循环阻塞了Qt的事件循环。基本上,你被困在while循环中,你永远不会把控制权交还给Qt来重新绘制屏幕 你的update()调用没有做你认为应该做的事情;它正在更新对象存储的数据,但在程序重新进入eventloop之前,此更改不会显示 可能有多种处理方法,但我认为有两种很好的选择,第一种更容易实现: 1) 在while循环的每次迭代中调用QApplication.processEvents()。这将强制Qt更新GUI。这将比2)简单得多
2) 将函数移动到单独的类中,并使用QThread和moveToThread()组合来更新数据,并使用信号/插槽与GUI线程通信。这将需要对代码进行一点重新构造,但这可能对您的代码总体上是有好处的。现在,生成数据的代码大概在您的MainWindow类中,而这两个类应该根据需要保持分开。对于小型一次性应用程序来说,这不是很重要,但随着应用程序规模的增长,这将有助于保持代码库的可读性。它目前正在使用QApplication.processEvents(),但fps非常低,效率非常低。我觉得使用pixmaps不是一个好办法。你能给我推荐一些其他的小部件吗?当然,这就是我用来显示视频的方法:camera\u scene\u=new QGraphicscene(this);camera_pixmapitem_u=新的QGraphicsPixmapItem();摄影机\场景->添加项(摄影机\像素项目);摄像机视图=新的QGraphicsView(本);摄像机/视图->设置场景(摄像机/场景)@USER 24791(忽略上面)这是用C++符号表示的,但是你应该能够把它翻译成Python。我在我的
主窗口
类中创建qgraphicscene
、QPixMapItem
和QGraphicsView
对象;在循环的每次迭代中,调用QPixMap::fromImage(frame)
,然后调用qgraphicscene::setPixMap(QPixMap)
,最后调用QGraphicsView.update()
。不确定这会给你带来什么提速,但值得一试。您可能需要考虑将<代码>睡眠>代码>语句添加到循环中,因为现在没有任何限制流量的方法。