[opencv] 四、视频操作

版权声明:本文为博主原创文章,未经博主允许禁止转载! https://blog.csdn.net/az9996/article/details/89736336

一、VideoCapture类

对应opencv C语言版本中的CvCapture结构体。提供了从摄像机或视频文件捕获视频的C++接口,作用是从视频文件或从摄像头捕获视频并显示出来。

二、读取并播放视频

读入视频的两种方式:

(1)先实例化再初始化:

VideoCapture capture;
capture.open("1.avi";

(2)在实例化的同时进行初始化:

VideoCapture capture("1.avi";

循环显示每一帧

读取当前帧的两种方式
方法1:

capture>>frame; //读取当前帧方法一 

方法2:

capture.read(frame); //读取当前帧方法二 

在这里插入图片描述

http://f.dataguru.cn/thread-905190-1-1.html

循环读取每一帧:

	while(1)  
	{  
		Mat frame;//定义一个Mat变量,用于存储每一帧的图像
		capture>>frame;  //读取当前帧
		imshow("读取视频",frame);  //显示当前帧
		waitKey(30);  //延时30ms
	} 

三、遇到的问题

问题一: C2664 “std::shared_ptr::shared_ptr(std::shared_ptr &&) noexcept”:

严重性	代码	说明	项目	文件	行	禁止显示状态
错误	C2664	“std::shared_ptr<T>::shared_ptr(std::shared_ptr<T> &&) noexcept”: 无法将参数 1 从“Y *”转换为“std::nullptr_t”	Project1	d:\opencv\build\include\opencv2\core\cvstd_wrapper.hpp	95	

原因:printf少敲了一个f,写成了print

参考资料:
https://blog.csdn.net/sinat_37436517/article/details/83549835

问题二:Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow

OpenCV(4.1.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 352

原因:这个错误是在视频播放结束后,循环仍然要读取下一帧,但是下一帧图像为空,imshow()函数无法读取,导致该项错误。

这个错误意味着你要显示的图像是不存在的

此错误表示您尝试显示的图像不存在。imshow加载图像时,通常由以下原因引起:
1、您的映像路径是错误的(在Windows转义两次目录分隔符,例如imread(“C:\path\to\image.png”)应
应该该是:imread(“C:\path\to\image.png”),或imread(“C:/path/to/image.png”));
2、图片扩展名错误。(例如“.jpg”与“.jpeg”不同;)。
3、您无权访问该文件夹。
4、要加载的图像不存在。
-----------------------------------------摘自stackflow
https://stackoverflow.com/questions/31341845/opencv-error-assertion-failed-size-width0-size-height0-simple-code

解决方法:
加入判断,当前帧是否为空,不为空则显示;为空跳出循环。

//【2】循环显示每一帧
	while (1)
	{
		Mat frame;//定义一个Mat变量,用于存储每一帧的图像
		capture >> frame;  //读取当前帧
		if (!frame.empty()) {    //判断当前帧是否为空
			imshow("读取视频", frame);  //显示当前帧
			waitKey(30);  //延时30ms
		}
		else break;
	}

http://www.cnblogs.com/little-monkey/p/7162340.html

完整示例

//视频处理
void vido_play() {
	//【1】读入视频
	VideoCapture capture("1.avi");

	//【2】循环显示每一帧
	while (1)
	{
		Mat frame;//定义一个Mat变量,用于存储每一帧的图像
		capture >> frame;  //读取当前帧
		if (!frame.empty()) {    //判断当前帧是否为空
			imshow("读取视频", frame);  //显示当前帧
			waitKey(30);  //延时30ms
		}
		else break;
	}
}

猜你喜欢

转载自blog.csdn.net/az9996/article/details/89736336