【问题标题】:VideoCapture() opencv python pyinstaller not openingVideoCapture()opencv python pyinstaller未打开
【发布时间】:2017-11-08 23:17:50
【问题描述】:

我正在尝试使用 pyinstaller 在 python 2.7 中使用 PyQt4 制作一个简单 GUI 的 .exe 来播放视频。

以下是我的问题的详细信息:

带有两个按钮的简单布局,一个用于加载视频,另一个用于播放视频。在我的 IDE 中,视频可以完美加载和播放。视频会在另一个窗口中弹出并在结束时关闭。

在程序上运行pyinstaller后,运行.exe后弹出GUI界面。打开文件对话框正常工作,但视频不会播放。

在我的 IDE 中,我可以通过从 opencv 安装目录中删除 opencv_ffmpeg2412_64.dll 来重现该错误。删除目录中的任何其他内容似乎不会影响 IDE 中视频的可播放性。所以我认为 pyinstaller 没有找到 opencv_ffmpeg2412_64.dll。我试图手动将其复制到 pyinstaller 生成的 dist 文件夹中。我还尝试将其挂钩并将其包含在 specFile 中。我一定是做错了什么或者找错地方来尝试解决这个问题。

任何关于如何解决此问题的想法将不胜感激。谢谢!

编辑:

如果可以提供任何帮助,这是我的代码的主要部分。这只是对我试图放在 .exe 文件中的更大 GUI 的测试。由于前向兼容性问题,我正在使用旧版本的 cv2。

#imports
import sys

from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4 import QtCore
from PyQt4.QtGui import QFileDialog

import cv2
import numpy

import mainwindow


class MainWindow(QMainWindow, mainwindow.Ui_MainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

        self.Load_B.clicked.connect(self.open)
        self.Play_B.clicked.connect(self.play)

    def play(self):


        cap = cv2.VideoCapture(self.video)
        while(True):
            (grabbed, frame) = cap.read()
            if not grabbed:
                break            
            currentframe = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            height, width = currentframe.shape[:2]
            cv2.namedWindow("Preview", cv2.WINDOW_NORMAL) 
            cv2.imshow("Preview",currentframe)  

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break  
        cap.release()
        cv2.destroyAllWindows()  

    def open(self):
        self.video=QFileDialog.getOpenFileName(self,"Video file",filter="Video 
    Files (*.mp4)")


app = QApplication(sys.argv)
app.aboutToQuit.connect(app.deleteLater)
form = MainWindow()
form.show()
app.exec_()

【问题讨论】:

  • 你能告诉我们你的代码吗?您是否收到任何错误(哪些错误)?程序是否崩溃或冻结或只是不做你想做的事?视频是否加载但不播放或没有任何反应?
  • 它不会崩溃或冻结,但是它不会显示视频弹出,它在我的 IDE 中做得很好。视频加载(我将 self.video 打印到控制台)但它不播放。我也可以进入 play() 函数并在 cv2.VideoCapture(self.video) 语句之前而不是之后打印一些东西。所以它无法识别该功能。
  • 您的代码看起来不错。您是否在您的规范文件中使用了--add-binary 命令将其指向 dll?

标签: python opencv video


【解决方案1】:

正如 Garth5689 所说,--add-binary 运行良好,我使用的是 python 3.5。所以这适用于 python 2 和 3。在我的示例中:-F = 一个文件,-w = 没有 cmd 窗口。

pyinstaller -F -w yourpythonscript.py --add-binary C:\PATH\Python\Python35-32\Lib\site-packages\cv2\opencv_videoio_ffmpeg411.dll;.

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,这对我有用:

    在构建 exe 时,使用 BHawk 指出的 --add-binary 选项将 dll 从 site-packages 文件夹复制到 dist 文件夹。

    示例:
    pyinstaller program.spec --add-binary <PATH_TO_PYTHON>\Lib\site-packages\cv2\opencv_ffmpeg320_64.dll;.

    【讨论】:

    • 就我而言(现在是 2020 年 5 月),要查找的文件名为 opencv_videoio_ffmpeg420_64.dll
    猜你喜欢
    • 2014-09-02
    • 2021-05-03
    • 2021-09-10
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 2018-07-26
    • 2013-01-22
    相关资源
    最近更新 更多