由Pyinstaller构建的exe文件无法使用cv2.VideoWriter保存视频

时间:2019-12-23 03:01:23

标签: python pyinstaller opencv3.0

我已经编写了一个名为videoSave.py的python脚本来读取相机并保存视频。代码如下:

import cv2


def saveCam():
    video = cv2.VideoCapture(0)
    ret, img = video.read()

    h, w = img.shape[:2]
    videoSaver = cv2.VideoWriter("videoSave_test.avi", cv2.VideoWriter_fourcc(*'DIVX'), 10, (w, h))

    key = 0
    while key != 27:
        ret, img = video.read()
        if not ret:
            break

        cv2.imshow('img', img)
        key = cv2.waitKey(1) & 0xFF
        videoSaver.write(img)

    videoSaver.release()


if __name__ == '__main__':
    saveCam()

直接运行此脚本时效果很好。它可以显示相机获得的图像并将内容保存到视频文件中。

然后我使用命令pyinstaller -F videoSave.py将此脚本构建到exe文件中。我可以得到exe文件。当执行该操作时,我可以看到相机获得的图像,但是它保存的视频文件具有零尺寸

我的环境是:
Python 3.7.4
Windows 7
Pyinstaller 3.5
opencv 4.1.2

2 个答案:

答案 0 :(得分:1)

我已经解决了此问题,方法是将Anaconda3 \ envs \ your_env_name中的opencv_video_ffmpeg412_64.dll复制到exe文件所在的目录中。但是我不知道为什么。

答案 1 :(得分:1)

您必须将opencv_videoio_ffmpeg420_64.dll打包到.exe中

为此,请以这种方式使用--add-binary选项(我认为您也可以使用--add-data选项):

pyinstaller --onefile videoSave.py --add-binary venv\Lib\site-packages\cv2\opencv_videoio_ffmpeg420_64.dll;.

当然,您必须指定自己的.dll路径(.dll有时可能具有其他名称)。

请注意,最后是“;”。在Windows和“:”上。在大多数的Unix系统上,按照here的规定进行操作(部分:“捆绑内容,在哪里搜索”)

根据此issue,似乎是因为Pyinstaller没有在.exe中打包opencv_ffmpeg340.dll,这对于保存视频文件是必要的。

看起来您可以手动复制.dll并将其粘贴到.exe所在的文件夹中,程序会读取该文件,这将说明@ToughMind提供的解决方案