Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCv视频显示PyQt5_Python_User Interface_Opencv_Pyqt_Pyqt5 - Fatal编程技术网

Python OpenCv视频显示PyQt5

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()

我正在使用opencv3、python 3和pyqt5。我想制作一个简单的GUI,当在主窗口上单击一个按钮时,我想打开一个新窗口来播放视频以及其他一些小部件。过去我使用了
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()
。不确定这会给你带来什么提速,但值得一试。您可能需要考虑将<代码>睡眠>代码>语句添加到循环中,因为现在没有任何限制流量的方法。