类似于OpenCV 2.4 VideoCapture not working on Windows
结果是一个带有灰色图像的窗口大约 2 秒,然后关闭并显示“视频结束”
import cv2
import imutils
vidPath = "filename.mp4"
video = cv2.VideoCapture(vidPath)
index = 0;
while True:
print (index)
index += 1
ret, frame = video.read()
if ret == False:
print("End of video")
break
frame = imutils.resize(frame, width = 500)
cv2.imshow("Video", frame)
video.release()
cv2.destroyAllWindows()
'ret' 在索引打印达到大约 900 后总是返回 false,窗口上根本没有任何有用的显示。相关视频大约有 2 分钟长。
Windows 10,Python 版本 3.5,OpenCV 版本 3.4.3 (contrib) 安装通过
pip install opencv-contrib-python
我已经检查了 cv2.getBuildInformation(),FFMpeg 是 YES(预构建的二进制文件)
我已将 opencv_ffmpeg313.dll 复制到 python (user/AppData/Local/Programs/Python/Python35-32/Scripts) 和 (user/AppData/Local/Programs/Python/Python35-32)
的路径>
为了以防万一,我还制作了名为 opencv_ffmpeg313_64.dll 的副本
我还尝试了几个不同的视频,多个 .mp4、.avi 等。 我已经用尽了我为这个问题找到的所有修复方法,但仍然能解决问题。
最佳答案
抱歉,我没有注意到您问题的所有细节...
问题是你在 imshow
函数之后丢失了:
cv2.waitKey(10)
其中 10 是等待的毫秒数。 waitKey 函数不仅检查键盘事件并返回按下的键,而且还刷新您执行 imshow 的窗口(如果您有多个窗口,则所有窗口)。类似于一些GUI库中的spin函数...
这解释了为什么窗口是灰色的。在某个时候它会结束读取视频并退出(900 帧后)。 30 fps 视频中的 900 帧只有 30 秒......如果它持续大约 2 分钟,它可能是 7.5 fps ......否则它可能有错误的帧。要检查这一点,您可以检查 FPS property and the frame count property .有了这个:
fps = video.get(cv2.CAP_PROP_FPS)
amountOfFrames = video.get(cv2.CAP_PROP_FRAME_COUNT )
你甚至可以做一个更“花哨”的播放,将 fps 用作 waitKey 函数中的参数,如下所示:
cv2.waitKey(int(1000./float(fps))) # 1000 milliseconds / fps
关于Python OpenCV-contrib v3.4.3 VideoCapture.read() 返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52516689/