首页 > 解决方案 > 通过 .exe 启动时,Python OpenCV 不读取视频输入

问题描述

我目前正在努力完成我学校的最后一份工作。它包括一个我在 Tkinter 中制作的简单 GUI,用于简化文件添加和保存,以及一个使用 OpenCV python 库实现的对象检测器 YOLOv3。我正在尝试使用 Auto-Py-2-Exe 将其放入 .exe 文件中,Auto-Py-2-Exe 是带有 GUI 的 PyInstaller。
当代码通过基本的 Python IDE 运行时,它运行良好。当它在 exe 中时会出现问题:OpenCV 似乎无法识别和读取 Tkinter 提供的文件路径。我尝试更改视频文件(.mkv、.mp4)的编解码器但没有成功。我尝试过不同版本的 OpenCV(4.2 和 3.8)。我让它打印消息,但它不是

程序在打印 frame.shape 处崩溃:

错误:

AttributeError: 'NoneType' object has no attribute 'shape'

带来错误的代码:

def start(filepath):
    print(f"filepath: {filepath}")
    W = None
    H = None
    print("### Loading yolo... ###")
    net = cv.dnn.readNetFromDarknet(configPath,weightsPath)

    #net.setPreferableBackend(cv.dnn.DNN_BACKEND_CUDA)
    #net.setPreferableTarget(cv.dnn.DNN_TARGET_OPENCL)

    ln = net.getLayerNames()
    ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]

    print("### Done loading... ###")

    print ("Begining to Analayze")
    cap = cv.VideoCapture(filepath)
    #cap = cv.VideoCapture(0)
    while True:
        start_time = time.time()
        status,frame = cap.read()
        print(f"frame shape: {frame.shape}")
        frame = cv.resize(frame, (640,480))

提前致谢!

标签: pythonopencvpyinstaller

解决方案


如果有人想知道...问题是由不包括 ffmpeg348_64.dll 的 PyInstaller 引起的。将此库添加到 .exe 位置后,脚本就可以工作了。


推荐阅读