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
    评论
### 回答1: 这个错误是由OpenCVcv::cvtColor函数引起的。错误信息是“cpp:182: error: (-215:assertion failed) !_src.empty() in function 'cv::cvtcolor'”,意思是源图像为空,无法进行颜色空间转换。 解决这个问题的方法是检查源图像是否为空,如果为空,则需要加载正确的图像文件或创建正确的图像对象,并确保图像对象包含图像数据。如果仍然存在问题,可以尝试检查图像路径或名称是否正确,或者查看代码中是否有其他与图像相关的错误。 ### 回答2: 这个错误是OpenCV库中的一个断言错误。断言是程序的一种自我保护机制,它检查某个条件是否成立。如果条件不成立,断言将引发错误并停止程序。 在这个错误中,断言检查SRC图像是否为空。如果SRC为空,那么函数cvtColor无法使用该图像进行颜色转换。因此,它引发异常并停止程序。 该错误通常出现在以下情况下: 1.使用空图像作为函数cvtColor的输入。这可能是由于代码中的某些逻辑或算法错误导致的。 2.在函数cvtColor之前,未正确加载输入图像。这通常是由于文件路径或图像数据加载错误导致的。 为了解决这个问题,我们可以使用以下方式: 1.检查代码中与输入图像相关的逻辑或算法是否正确。确保没有任何错误导致图像为空。 2.检查输入图像的路径或数据加载是否正确。确保可以正确访问图像数据。 3.使用assert函数来代替OpenCV库中的断言函数。这将使程序能够在发生错误时优雅地终止,而不是引发异常并停止程序。 4.在处理图像之前,进行异常处理。如果SRC为空,不执行颜色转换并提供适当的错误消息。 ### 回答3: 这是一种计算机程序错误,它表示在OpenCV图像处理库中的“cvtColor”函数中发生了一个问题,并且在这个问题中,输入的图像为空。具体地说,这个错误信息在C++语言的编程环境中出现,通常是指向在运行OpenCV函数时参数问题。一般情况下,这种错误的出现是由于输入的图像未能成功加载到内存中或者是由于程序在处理图像时出现了问题。在运行程序时,需要确保输入的图像的格式正确且可,同时需要检查代码中的内存分配和释放是否正确执行。 针对这个错误,开发者需要进行详细的调试和错误排查。常见的解决方法包括检查图像文件是否存在,检查取图像代码是否有正确的路径以及检查程序是否有足够的内存来处理输入的图像等等。除此之外,还可以尝试改变图像格式或使用其他函数来处理图像。例如,使用“imread”函数来取图像,或者使用“Mat”类来创建图像矩阵等。 综上所述,出现“cpp:182:error: (-215:assertion failed) !_src.empty() in function 'cv::cvtcolor'”的错误信息,需要开发者仔细检查代码和图像数据,并认真调试问题,以找出导致该错误的根本原因,进而采取相应的解决办法。正确地解决这个问题,对于完整和可靠地实现计算机视觉功能非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值