一、opencv的视频读取与保存
具体代码及解释如下:
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int argc, char *argv[])
{
Point pt1,pt2;
Mat current;
cv::VideoCapture capture("F:\\tracking\\test.avi");//关联读入视频文件
if (!capture.isOpened()){
std::cout << "fail to load video";
return 1;
}
/*获取视频fps*/
double rate = capture.get(CV_CAP_PROP_FPS);
/*获取视频帧的尺寸*/
int width = capture.get(CV_CAP_PROP_FRAME_WIDTH);
int height = capture.get(CV_CAP_PROP_FRAME_HEIGHT);
/*根据打开视频的参数初始化输出视频格式*/
cv::VideoWriter w_cap("re_video.avi", CV_FOURCC('M', 'J', 'P', 'G'), rate, cv::Size(width, height));
/*自定义输出视频的尺寸,需要将读取的视频帧尺寸进行变换,下文使用的resize函数完成*/
//cv::VideoWriter w_cap("re_video.avi", CV_FOURCC('M', 'J', 'P', 'G'), rate, cv::Size(your.width, your.height));
/*循环读取视频的帧*/
while (capture.read(current)){
/*前面使用的是自定义输出视频尺寸时,使用resize函数*/
//resize(current, current, cv::Size(your.width, your.height));
/*对读取的视频帧进行处理*/
pt1.x= 40;
pt1.y = 40;
pt2.x= 100;
pt2.y = 100;
rectangle(current, pt1, pt2, Scalar(0,0,255),2,8,0);//用矩形画矩形窗
/*保存处理后的帧为视频*/
w_cap.write(current);
imshow("src", current);
waitKey(1);
}
return 0;
}
二、结果展示
2.1 处理前后视频对比
2.2 自定义输出视频尺寸
三、rectangle函数详解
rectangle有两种重载形式,分别如下:
void rectangle(CV_IN_OUT Mat& img, Point pt1, Point pt2,
const Scalar& color, int thickness=1,
int lineType=8, int shift=0);
void rectangle(CV_IN_OUT Mat& img, Rect rec,
const Scalar& color, int thickness=1,
int lineType=8, int shift=0);
其区别为一个使用个点的坐标来绘制矩形,另一个使用Rect结构体来绘制矩形。
其参数的意义分别为:
img 图像数据
pt1 矩形的一个顶点。
pt2 矩形对角线上的另一个顶点
color 线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。
thickness 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
lineType 线条的类型。见cvLine的描述
shift 坐标点的小数点位数。