OpenCV视频播放到最后一帧报错:error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’
笔者自学OpenCV,在运行网上的示例代码时发现的问题:
import cv2
capture = cv2.VideoCapture('demo_video.mp4')
while(capture.isOpened()):
ret, frame = capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', gray)
if cv2.waitKey(1) == ord('q'):
cv2.destroyAllWindows()
break
运行时控制台报错:
error: OpenCV(4.0.1) C:\ci\opencv-suite_1573470242804\work\modules\imgproc\src\color.cpp:181: error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor’
同时播放界面卡死,彻底关闭需要重启iPython内核。
参考https://blog.youkuaiyun.com/archer_wu2/article/details/85628536 ,考虑到可能是视频末尾读取帧不正确导致的。
查看变量管理器发现,在播放时按下’q’键退出,控制台不会报错,ret变量值为True;播放到末尾时,控制台报错,ret变量值为False。
到这里问题的原因就比较明朗了——
ret(return value缩写)是一个布尔值,表示当前这一帧是否获取正确。视频播放到最后一帧后,程序并没有停止读取文件,而是继续读取(此时视频文件内已经没有数据供程序读取了),读不出数据,自然就报错了。
找到了问题,解决方案也就有了:读完最后一帧以后,ret == False时跳出while循环,结束程序就行了
import cv2
capture = cv2.VideoCapture('demo_video.mp4')
while(capture.isOpened()):
ret, frame = capture.read()
#视频播放到最后一帧不会自动停止,而是会继续读取,读不到数据,导致报错
#所以在视频文件读入后立即加入一步判断,如果不能读入数据则跳出循环
if ret == True:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)
else:
break
if cv2.waitKey(1) == ord('q'):
break
capture.release()
cv2.destroyAllWindows()
运行,没有报错,播放界面能够自动关闭。
第一次发博客没啥经验,还请各位大佬多多海涵。
参考网站:
http://codec.wang/#/opencv/start/03-open-camera
https://blog.youkuaiyun.com/archer_wu2/article/details/85628536
附:建议按’q’退出之前把输入法切成英文,否则窗口有可能出现短暂的莫名卡顿(虽然我也没发现有别的不良影响)。