python cv2.Videocapture() 不起作用,cap.isOpened() 返回 false

Posted

技术标签:

【中文标题】python cv2.Videocapture() 不起作用,cap.isOpened() 返回 false【英文标题】:python cv2.Videocapture() does not work, cap.isOpened() returns false 【发布时间】:2017-07-01 20:11:36 【问题描述】:

cv2.Videocapture() 在使用网络摄像头时工作正常,但在尝试从硬盘读取时显示错误 cap.isOpened() 返回 false

import cv2
import numpy as np
background=cv2.imread('background.png')
cap = cv2.VideoCapture('car video.mp4')
cap.open('car video.mp4')
print cap.isOpened()
while 1:
    ret,img=cap.read()
    cv2.imshow('a',img)
    print img.shape


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

cap.release()
cv2.destroyAllWindows()

显示这个错误

    cv2.imshow('a',img)
    error: ..\..\..\..\opencv\modules\highgui\src\window.cpp:266: error:       (-215)        size.width>0 && size.height>0 in function cv::imshow

我的opencv版本3.0.0,python 2.7,windows10 32位

【问题讨论】:

首先,移除 cap.open() 调用;这是多余的。其次,检查您的视频是否与您的代码位于同一目录中。第三,删除其文件名中的空格。试试 car_video.mp4 我更改文件名并删除 cap.open() 。但错误信息保持不变 用双引号将文件名括起来 此链接对我有很大帮助并解决了我的问题。 ***.com/questions/23119413/… 【参考方案1】:

您需要 ffmpeg 编解码器才能读取视频。

【讨论】:

是的,谢谢。一开始我没有复制ffmpeg编解码文件 你能告诉我如何添加ffmpeg编解码器文件吗? 将所有文件从 *OpenCV\3rdparty\ffmpeg* 复制到 *C:\Python27* 或 PATH 中的目录.可能还需要重命名 opencv_ffmpeg.dll 文件。对于 OpenCV 版本 X.Y.Z opencv_ffmpeg.dll ==> opencv_ffmpegXYZ.dll 对于 64 位 OpenCV 版本 X.Y.Z opencv_ffmpeg.dll ==> opencv_ffmpegXYZ_64.dll 我正在使用 opencv 3.0.0 和 win 32 所以重命名文件就像这个 opencv_ffmpeg300.dll【参考方案2】:

我在 anaconda3 虚拟环境中使用 opencv 时遇到了同样的错误。 我检查了当前 opencv 版本的构建信息,ffmpeg 被标记为 "no"

解决这个问题

    我从我的 conda 环境中卸载了 opencv (conda uninstall opencv)

    使用 conda-forge 频道安装了最新的 ffmpeg (conda install -c conda-forge ffmpeg)

    命名版本构建频道

    ffmpeg 4.0.2 ha6a6e2b_0 conda-forge

    然后使用 conda-forge 通道再次安装 opencv (conda install -c conda-forge opencv)

    命名版本构建频道

opencv 3.4.1 py36_blas_openblash829a850_201 [blas_openblas] conda-forge

执行此操作后重新启动 python 控制台并导入 cv2。

【讨论】:

查看构建信息:python -c "import cv2; print(cv2.getBuildInformation())"【参考方案3】:

试试

pip install opencv-contrib-python

它对我有用

【讨论】:

【参考方案4】:

我不确定您的文件名是否正确。我从未见过像 'car video.mp4' 这样的文件目录。当您使用基于零的索引时,您的网络摄像头和 cv2.VideoCapture 工作正常;但是 VideoCapture 无法读取像 'car(space)video.mp4' 这样的文件,工作代码是这样的;

import numpy as np
import cv2

cap = cv2.VideoCapture('video.mp4')

while(cap.isOpened()):

    ret, frame = cap.read()

    if ret==True:

        cv2.imshow('frame',frame)

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

# Release everything if job is finished
cap.release()
cv2.destroyAllWindows()

【讨论】:

以上是关于python cv2.Videocapture() 不起作用,cap.isOpened() 返回 false的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV(Python中的cv2)VideoCapture在删除后不释放相机

python cv2.videocapture打不开怎么回事

Facecam 视频无法使用 cv2.VideoCapture() 打开并且无法读取

如何使用 cv2.VideoCapture() 远程打开来自不同计算机摄像头的实时视频流?

模块“cv2”没有“VideoCapture”成员

cv2.VideoCapture 参数未作为输入