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