OpenCV学习-视频的读取和写入保存(附代码)

一.视频的读取

视频其实是由一帧帧图像所组成的,当帧率超过一个阈值就成了视频,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

猜你喜欢

转载自blog.csdn.net/zbr794866300/article/details/102311496