Python cv2.error:完成视频播放后出现OpenCV(3.4.3)错误
我想读取现有视频,将其转换为灰度并播放灰度视频。代码如下Python cv2.error:完成视频播放后出现OpenCV(3.4.3)错误,python,opencv,Python,Opencv,我想读取现有视频,将其转换为灰度并播放灰度视频。代码如下 import cv2 import numpy as np # read the video cap = cv2.VideoCapture('input.avi') while(True): ret, frame = cap.read() # convert it into grayscale gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.ims
import cv2
import numpy as np
# read the video
cap = cv2.VideoCapture('input.avi')
while(True):
ret, frame = cap.read()
# convert it into grayscale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
灰度视频一直播放到最后。播放完成后,会弹出以下错误-
Traceback (most recent call last):
File "D:\L1.py", line 11, in <module>
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.error: OpenCV(3.4.3) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
回溯(最近一次呼叫最后一次):
文件“D:\L1.py”,第11行,在
灰色=cv2.CVT颜色(边框,cv2.COLOR\u BGR2GRAY)
cv2.error:OpenCV(3.4.3)C:\projects\opencvpython\OpenCV\modules\imgproc\src\color.cpp:181:error:(-215:断言失败)_函数“cv::cvtColor”中的src.empty()
为什么会出现这种错误?有什么解决办法吗
我正在使用python 3.6和opencv 3.4,循环将在视频结束后继续尝试获取帧。您可以检查
cap
是否返回图像,或者是否如下图所示中断。另外,别忘了发布视频
import cv2
import numpy as np
# read the video
cap = cv2.VideoCapture('input.avi')
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
# convert it into grayscale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
循环将在视频结束后继续尝试获取帧。您可以检查
cap
是否返回图像,或者是否如下图所示中断。另外,别忘了发布视频
import cv2
import numpy as np
# read the video
cap = cv2.VideoCapture('input.avi')
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
# convert it into grayscale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
我喜欢OpenCV教程都从
cap.read()
中获取返回值,但不必检查它。读取最后一帧后,程序将返回并尝试读取另一帧。那里没有一个,因此它为frame
返回None
,为布尔ret
返回False
。检查其中任何一个并在检测到其中一个时中断循环将解决您的问题。我喜欢OpenCV教程都从cap.read()
获取返回值,但不必费心检查它。读取最后一帧后,程序将返回并尝试读取另一帧。那里没有一个,因此它为frame
返回None
,为布尔ret
返回False
。检查其中任何一个,如果检测到其中一个,则中断循环将解决您的问题。您应该提交此文件。它比他们的版本要好得多,并且肯定会为尝试学习教程的人节省很多麻烦。谢谢,可以。但奇怪的是,我看到他们在“保存视频”部分检查ret
,而不是在“从文件播放视频”部分。我想知道while(cap.isOpened()):
过去是否足够。如果我没记错的话,cap.isOpened()
即使在读取最后一帧之后(直到调用cap.release()
),仍然是真的,所以您仍然需要检查ret
。我并没有注意到,为了保存视频,他们对其进行了不同的编码。真有趣。:)你应该提交这个。它比他们的版本要好得多,并且肯定会为尝试学习教程的人节省很多麻烦。谢谢,可以。但奇怪的是,我看到他们在“保存视频”部分检查ret
,而不是在“从文件播放视频”部分。我想知道while(cap.isOpened()):
过去是否足够。如果我没记错的话,cap.isOpened()
即使在读取最后一帧之后(直到调用cap.release()
),仍然是真的,所以您仍然需要检查ret
。我并没有注意到,为了保存视频,他们对其进行了不同的编码。真有趣。:)