主要内容:
1、讲解VideoCapture类,读取视频或摄像头
2、讲解VideoWriter类,写视频文件
先上ppt:
代码:读取视频或摄像头,并加入简单处理效果
//读取视频或摄像头,并加入简单处理效果
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
void main()
{
VideoCapture cap("2.avi"); //读取视频方法一
//VideoCapture cap("http://www.laganiere.name/bike.avi");//也可以是网络视频
//VideoCapture cap; //读取视频方法二
//cap.open("E:\\2.avi");
//cap.open(0); //读取摄像头
if(!cap.isOpened()) //检查视频/摄像头打开是否成功
return;
Mat frame; //定义Mat变量,用来存储每一帧
//循环显示每一帧
while(1)
{
cap>>frame; //读取当前帧方法一
//cap.read(frame); //读取当前帧方法二
//加入简单图像处理效果
Canny(frame, frame, 30, 100); //Canny边缘检测
//cvtColor(frame, frame, CV_BGR2HSV); //颜色空间转换到HSV
if(!frame.empty()) //对当前帧进行异常检测
{
imshow("video", frame);
//用waitKey()返回值判断退出预览
if(waitKey(30)==27) //指定Esc键退出
break;
}
else
break;
}
cap.release(); //关闭视频流文件
}
运行结果:
代码:打开视频,加入简单处理效果,写视频到本地
//打开视频,进行candy边缘检测,写视频到本地
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
void main()
{
VideoCapture cap("2.avi"); //读取视频方法一
//VideoCapture cap; //读取视频方法二
//cap.open("E:\\2.avi");
//VideoCapture cap("http://www.laganiere.name/bike.avi");//也可以是网络视频
//cap.open(0); //读取摄像头
if(!cap.isOpened()) //检查视频/摄像头打开是否成功
return;
//VideoCapture的get方法返回指定视频类的相关参数信息
double width = cap.get(CV_CAP_PROP_FRAME_WIDTH); //帧宽度
double height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
double frameRate = cap.get(CV_CAP_PROP_FPS); //帧率 x frames/s
double totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
//输出视频相关参数信息
cout<<"视频宽度="<<width<<endl;
cout<<"视频高度="<<height<<endl;
cout<<"视频总帧数="<<totalFrames<<endl;
cout<<"帧率="<<frameRate<<endl;
Size size0 = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
//VideoWriter类的构造函数
//VideoWriter writer("E:\\out.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, size0, true);
VideoWriter writer("E:\\out.avi", //文件名
-1, //编解码器,写入视频前需安装对应的编解码器。
//这里填-1,不指定编解码方式,程序运行时会跳出窗口让我们选择
cap.get(CV_CAP_PROP_FPS),//播放帧率
size0,//帧尺寸,生成视频尺寸需与读取视频尺寸一致
//若不一致,则写入的视频会出错。
false);//是否创建彩色视频,生成视频是否支持彩色应与构造函数设置一致
//因为后面进行candy检测,每一帧都变成了黑白二值图像,所以这里应填false
//如果填true,则写入的视频会出错
Mat frame; //定义Mat变量,用来存储每一帧
//循环显示每一帧
while(1)
{
cap>>frame; //读取当前帧方法一
//cap.read(frame); //读取当前帧方法二
if(frame.empty()) //对当前帧进行异常检测
break;
//加入简单图像处理效果
Canny(frame, frame, 30, 100); //Canny边缘检测
//cvtColor(frame, frame, CV_BGR2HSV); //颜色空间转换到HSV
imshow("video", frame);
//写入帧
writer<<frame; //写入帧方法一
//writer.write(frame); //写入帧方法二
//用waitKey()返回值判断退出预览
if(waitKey(30)>0) //如果有按键.对于waitKey,若没有按键按下则返回-1.
break;
}
cout<<"write end!";
cap.release(); //关闭视频流文件
destroyAllWindows();
}
运行结果:
写入本地的out.avi