【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用的还不太熟练,而且可能有些表述不太准确,望指正。

猜你喜欢

转载自blog.csdn.net/U202113837/article/details/128743278