【VS2019+OpenCV】(已解决)读取视频错误几种原因总结及解决办法OpenCV Error Assertion failed (size.width..)cv imshow, line 376

1、背景

在对着教程下载并配置好OpenCV后,想要读取一个视频试试看,就试着运行了下面一段代码:

#include <opencv2/opencv.hpp>
#include<opencv2\imgproc\types_c.h>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat src;
	VideoCapture video(0);
	video.open("E://BaiduNetdiskDownload//1234567.mp4");
	while (1)
	{
		video >> src;
		imshow("1", src);
	}
	return 0;
}

哎嘿出师不利,落地成盒,又出错了:

OpenCV(4.2.0) Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file C:\build\master_winpack-build-win64-vc15\opencv\modules\highgui\src\window.cpp, line 376

(↓↓↓下面是事发现场↓↓↓)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
惨不忍睹对吧,是不是和你遇到的一样呢。。。

2、错误分析

归根结底,是没有读取到图片或者视频导致的Error,所以要检查前面读取部分的代码。

(1)路径错误

文件路径表示错误。
对于路径的表示方法,可以参考以下文章:
【4种文件路径表示方法!】

(2)加上延时

但是,可以发现代码中路径的表示并没有问题!
而且OpenCV是刚按教程配置好的,重新检查一遍,也不是它问题。

最后翻到毛星云的《OpenCV3编程入门》,观察到上面读取视频的代码里,读取并显示当前帧后,加了一个 waitKey(30) ,即延时30ms,我将信将疑自己也加了一个,不曾想——还真成功显示了视频。
加上以下语句:

if (waitKey(30) >= 0)
{
	break;
}

或者:

waitKey(30);

当然,不一定非得填30,只是影响视频的播放速度。

关于waitKey():

@note This function should be followed by cv::waitKey function which displays the image for specified
milliseconds. Otherwise, it won't display the image. For example, **waitKey(0)** will display the window
infinitely until any keypress (it is suitable for image display). **waitKey(25)** will display a frame
for 25 ms, after which display will be automatically closed. (If you put it in a loop to read
videos, it will display the video frame-by-frame)

(3)读取完最后一帧错误

虽然加了waitKey()后视频成功显示,但播放到最后,再一次出现了

OpenCV(4.2.0) Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file C:\build\master_winpack-build-win64-vc15\opencv\modules\highgui\src\window.cpp, line 376

经查阅资料,原来是读取完最后一帧之后,没有下一帧了,没有读取到图片,自然imshow()错误,于是我们只需要加一个在循环读取里加一个判断语句,即:

if (src.empty())
{
	break;
}

如果没读取到某一帧,即退出循环。

3、 修改

最后代码如下:

#include <opencv2/opencv.hpp>
#include<opencv2\imgproc\types_c.h>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat src;
	VideoCapture video(0);
	video.open("E://BaiduNetdiskDownload//1234567.mp4");
	while (1)
	{
		video >> src;
		####################################
		if (src.empty())
		{
			break;
		}
		####################################
		imshow("1", src);
		####################################
		waitKey(30);
		//if (waitKey(30) >= 0)
		{
			//break;
		}
		####################################
	}
	return 0;
}

点击运行——好啦读取成功!

4、总结

关于这个错误,CSDN上并没有提到这些情况,困扰了我好久,严重拖了作业进度,在网上到处翻也没找到好的合适的解决办法,而且大多是Python语言的,总和我遇到的不太一样。

就发现,有时候无法寻求到帮助的时候,就考验我们自己解决问题的能力了。

  • 寻找可能出现问题的地方;
  • 对照文档,仔细检查关键函数的参数和返回值等;
  • 搜索相关代码,仔细查找自己代码和别人不一样的地方(特别是没有借鉴其他,全部由自己慢慢编写的时候)

第一次发这个,markdown用的还不太熟练,而且可能有些表述不太准确,望指正。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还重名就过分了啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值