Python 为什么介绍性OpenCV视频教程中的示例会出现错误?首选的解决方法是什么?
在测试OpenCV介绍性视频教程中的时,我的视频(.m4v和.mov)在完成后总是会冻结一点,然后抛出以下错误消息:Python 为什么介绍性OpenCV视频教程中的示例会出现错误?首选的解决方法是什么?,python,linux,opencv,video,Python,Linux,Opencv,Video,在测试OpenCV介绍性视频教程中的时,我的视频(.m4v和.mov)在完成后总是会冻结一点,然后抛出以下错误消息: --------------------------------------------------------------------------- error Traceback (most recent call last) <ipython-input-33-6ff11ed068b5> i
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-33-6ff11ed068b5> in <module>()
15
16 # Our operations on the frame come here
---> 17 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
18
19 # Display the resulting frame
error: /home/user/opencv-2.4.9/modules/imgproc/src/color.cpp:3737: error: (-215) scn == 3 || scn == 4 in function cvtColor
由于我最终想在某些场合循环播放视频,以下内容对我来说是最好的解决方案
import numpy as np
import cv2
cap = cv2.VideoCapture('/path/to/vid.mp4')
frame_counter = 0
loop = True
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
frame_counter += 1
if frame_counter == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT):
if loop == True:
frame_counter = 0
cap = cv2.VideoCapture(video_name)
else:
break
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
如果不需要循环播放视频,只需使用
if frame_counter == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT):
break
或Padraic的溶液(稍加修改)
try/except语句确实提供了一个短暂的延迟,视频在关闭前冻结。播放完成后,if语句将立即关闭它
我仍然感兴趣的是,如果有人能够解释,而错误消息是在第一时间遇到的,因为padraic说,这不是他的机器上的情况
编辑:所以我注意到我误读了教程,应该使用
while(cap.isOpened())
而不是while(True)
,但是我仍然在while(cap.isOpened())中遇到同样的错误。是的,自从我发布之后,我尝试了ogv、mp4和avi。它们都给出相同的错误消息。我正在使用Ipython笔记本,以防出现问题,我会将其添加到问题中。抛出错误消息后,我还必须强制关闭视频。我也可以重新运行脚本和冻结的视频将变得活跃,并开始再次播放。之后,我从源代码处通过anaconda和opencv安装了python。我想这不是一个大问题,但我很好奇为什么会发生这种情况,如果可能的话,我想摆脱它。是的,我在spyder中尝试从ipython控制台运行,但遇到了相同的错误。这可能是因为我的相机驱动程序,即使我不是从相机拍摄?
if frame_counter == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT):
break
try:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
except cv2.error:
break