【问题标题】:OpenCv Video Display PyQt5OpenCv 视频显示 PyQt5
【发布时间】:2017-05-29 01:42:51
【问题描述】:

我正在使用 opencv3、python 3 和 pyqt5。我想制作一个简单的 GUI,当在主窗口上单击按钮时,我想在其中打开一个新窗口来播放视频以及其他一些小部件。我过去使用QPixmap 来显示图像,所以我创建了一个标签并尝试在循环中设置像素图中的帧。循环工作正常,但我无法显示视频/新窗口。 我想在新窗口中执行的循环如下所示:

    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 类型以设置到像素图中。 我只是 pyQt 的初学者,所以不知道我做错了什么。我已经阅读了有关在新窗口和QtApplication.processEvents() 中使用信号、线程的信息,但不知道它们是如何工作的以及它们如何适应我的问题。 如果有人可以为我设定正确的方向,并指出一些资源来为我的应用程序使用 OpenCV 和 python 创建良好的界面,那将会很有帮助。

【问题讨论】:

    标签: python user-interface opencv pyqt pyqt5


    【解决方案1】:

    它没有运行的原因是你的while循环阻塞了Qt的事件循环。基本上,您被困在 while 循环中,并且您永远不会将控制权交还给 Qt 以重绘屏幕。

    您的 update() 调用没有按照您的想法进行;它正在更新对象存储的数据,但在程序重新进入事件循环之前,此更改不会显示。

    可能有多种方法可以处理这个问题,但我看到了两个不错的选择,第一个更容易实现:

    1) 在 while 循环的每次迭代中调用 QApplication.processEvents()。这会强制 Qt 更新 GUI。这将比 2) 更容易实现。

    2) 将函数移动到单独的类中,并使用 QThread 结合 moveToThread() 来更新数据,并使用信号/插槽与 GUI 线程通信。这将需要稍微重构您的代码,但这可能对您的代码整体有好处。现在,生成数据的代码大概在您的 MainWindow 类中,而根据Qt's Model-View design pattern,两者应该分开。对于小型一次性应用来说不是很重要,但随着应用规模的扩大,有助于保持代码库的可理解性。

    【讨论】:

    • 它目前正在使用 QApplication.processEvents() 但在 fps 非常低的情况下似乎非常低效。我觉得使用像素图不是要走的路。你能推荐我可能研究的任何其他小部件吗?
    • 当然,这就是我显示视频的方法:camera_scene_ = new QGraphicsScene(this); camera_pixmapitem_ = new QGraphicsPixmapItem(); camera_scene_->addItem(camera_pixmapitem_); camera_view_ = new QGraphicsView(this); camera_view_->setScene(camera_scene_);
    • @user244791(忽略上述)这是 C++ 表示法,但您应该能够将其翻译成 Python。我在MainWindow 类中创建QGraphicsSceneQPixMapItemQGraphicsView 对象;在循环的每次迭代中,调用QPixMap::fromImage(frame),然后调用QGraphicsScene::setPixMap(qpixmap),最后调用QGraphicsView.update()。不确定这会给您带来任何加速,但值得一试。您也许应该考虑在循环中添加 sleep 语句,因为现在没有任何限制速率。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 2020-05-11
    相关资源
    最近更新 更多