文章目录
一、VideoCapture类
对应opencv C语言版本中的CvCapture结构体。提供了从摄像机或视频文件捕获视频的C++接口,作用是从视频文件或从摄像头捕获视频并显示出来。
二、读取并播放视频
读入视频的两种方式:
(1)先实例化再初始化:
VideoCapture capture;
capture.open("1.avi");
(2)在实例化的同时进行初始化:
VideoCapture capture("1.avi");
循环显示每一帧
读取当前帧的两种方式
方法1:
capture>>frame; //读取当前帧方法一
方法2:
capture.read(frame); //读取当前帧方法二
循环读取每一帧:
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.youkuaiyun.com/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;
}
完整示例
//视频处理
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;
}
}