OpenCV视频播放到最后一帧报错:error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor‘

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.csdn.net/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.csdn.net/archer_wu2/article/details/85628536

附:建议按’q’退出之前把输入法切成英文,否则窗口有可能出现短暂的莫名卡顿(虽然我也没发现有别的不良影响)。

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值