一.视频的读取
视频其实是由一帧帧图像所组成的,当帧率超过一个阈值就成了视频,opencv中通过VideoCapture类来实现视频的读入:
1.打开视频或从设备中获取图像
两种方法:
VideoCapture capture("../xx.avi"); //打开指定路径下的video
capture.open("../xx.avi"); //
2.获取视频帧的方法有四种:
capture.read(frame);
capture.grab();
capture.retrieve(frame);
capture>>frame;
其中第一种和第四种最为常见.
3.获取视频的参数
一个视频会有很多参数,如:帧率,总帧数,尺寸和格式等,都是通过VideoCapture类的get方法得到的.用的比较多的就是帧率和总帧数:
double frame_rate=capture.get(CV_CAP_PROP_FPS); //帧率
int frame_num=catture.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
get方法的其他参数可以根据需要去查阅.
4.设置视频帧的读取位置
VideoCapture类中的set方法可以去出视频中某个位置的帧,可以通过帧编号,时间和位置来取:
// 第10帧
double position=10.0;
capture.set(CV_CAP_PROP_POS_FRAMES,position);
// 第1e6毫秒
double position=1e6;
capture.set(CV_CAP_PROP_POS_MSEC,position);
// 视频1/2位置
double position=0.5;
capture.set(CV_CAP_PROP_POS_AVI_RATIO,position);
同时还可以设置摄像头的参数:
//设置摄像头参数 不要随意修改
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080);//宽度
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960);//高度
capture.set(CV_CAP_PROP_FPS, 30);//帧数
capture.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度 1
capture.set(CV_CAP_PROP_CONTRAST,40);//对比度 40
capture.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50
capture.set(CV_CAP_PROP_HUE, 50);//色调 50
capture.set(CV_CAP_PROP_EXPOSURE, 50);//曝光 50
二.视频的写入保存
视频的写入通过VideoWriter类实现的,函数参数如下:
VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);
//例如:
VideoWriter writer.open("xx/xx/1.avi",CV_FOURCC('M','J','P','G'),20,size,true);
其中,首先指定文件名,第二个参数是编码格式,OpenCV里提供了很多种的编码格式,如CV_FOURCC(‘P’,’I’,’M’,’1’)是MPEG-1格式,CV_FOURCC(‘M’,’G’,’P’,’G’)为motion-jpeg格式,第三个参数为帧率,第4个参数为视频的尺寸大小。
三.视频读写代码
#include<opencv2/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/videoio.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int frame_int=1; //读取摄像头图像时统计帧率
int main()
{
cout<<"Built with OpenCV"<<CV_VERSION<<endl;
VideoCapture capture(0);
if(!capture.isOpened())
{
cout<<"opencv camera failed"<<endl;
return -1;
}
VideoWriter writer;
//定义尺寸大小,这里使用get方法获取capture的大小,如果你知道大小,可以直接写成size(360,240)
Size size(capture.get(CV_CAP_PROP_FRAME_WIDTH),capture.get(CV_CAP_PROP_FRAME_HEIGHT));
writer.open("/home/zbr/practise/opencv-demo/save.avi",CV_FOURCC('M','J','P','G'),20,size,true);
int frame_num=capture.get(CV_CAP_PROP_FPS);
//cout<<"video FPS:"<<frame_num<<endl;
//frame_int+=5;
//capture.set(CV_CAP_PROP_POS_FRAMES,frame_int);
Mat frame,gray;
capture>>frame;
while(capture.read(frame)){
imshow("ori_pic",frame);
cvtColor(frame, gray, COLOR_BGR2GRAY);
//二值化处理
threshold(gray, gray, 0, 255, THRESH_BINARY | THRESH_OTSU);
cvtColor(gray, gray, COLOR_GRAY2BGR);
imshow("pro_pic",gray);
writer.write(gray);
if(waitKey(30)>0)
break;
}
capture.release();
return 0;
}
参考文献:
https://blog.csdn.net/u010368556/article/details/79186992
https://blog.csdn.net/maque351081953/article/details/52789236