您的位置:首页 > 运维架构

opencv3 学习笔记 图像与视频的转换

2017-05-01 13:59 483 查看
刚开始接触opencv3,发现函数的用法太多,本身C++学的也不是很好,打算随手把学过的记录下来,方便以后查看


1.读取图像:Mat imread(const string& filename, int flags);

返回值为Mat对象

Mat类型需要记录图像的数据:

1).图像是灰度或彩色(这里姑且只考虑这两种)

2).图像数据的大小(图像的宽与高)

3).一个数据体:二维数组或是一维数组。

●Mat类:是用于保存图像以及其他矩阵数据的数据结构。默认情况下,其 尺寸为0,也可以指定初始尺寸,比如定义一个Mat类对象,就要写cv::Mat pic(320,640,cv::Scalar(100));

2.显示图像:void imshow(const string& winname, InputArray mat);

第一个参数,const string&类型的winname,填需要显示的窗口标识名称。

3.将输出图像保存为文件:

bool imwrite(const string& filename,InputArray img, const vector& params=vector() );

第一个参数:保存后的文件名

第二个参数:要保存的Mat类型的图像数据

第三个参数:特定格式保存的参数编码,它有默认值vector(),所以一般情况下不需要填写

4**.截取图像中的一部分:Reat类 Reat rect(a,b,c,d);**

a,b 表示截取图片的左上角在原图的坐标。

c,d分别代表图片的长宽。

下面的代码是练习代码

5 VideoCapture 类 视频读取

VideoCapture::VideoCapture (const string& filename/int device)

filename/device:打开的视频文件/设备ID

方法:

1.isOpende():判断视频或摄像头调用是否成功

2.read(Mat frame) / capture >> frame :捕获、解码和返回下一个视频帧

3.get(int id):获取视频属性,如帧率、总帧数、尺寸等

4.set(int id,double value):设置视频属性

5.VideoWriter类 视频写操作

cv::VideoWriter out(
const string& filename, // 输入文件名
int fourcc, // 编码形式,使用 CV_FOURCC()宏
double fps, // 输出视频帧率
cv::Size frame_size, // 单帧图片的大小
bool is_color = true // 如果是false,可传入灰度图像
);

cv::VideoWriter out;
out.open(
"my_video.mpg", //输出文件名
CV_FOURCC('D','I','V','X'), // MPEG-4 编码
30.0, // 帧率 (FPS)
cv::Size( 640, 480 ), // 单帧图片分辨率为 640x480
true // 只输入彩色图
);


写入图像方法

cv::VideoWriter::write(
const Mat& image // 写入图像作为下一帧
);

my_video_writer << my_frame;


/////////////////////////////////////
//        隔一分钟保存一帧           //
//       将连续帧保存为视频          //
////////////////////////////////////
#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

int video_picture(string filename);
void Image_To_Video(int m);

int main()

{
string video_name = "D://Libs//opencv310//opencv//sources//samples//data//768x576.avi";
int n;
n = video_picture(video_name);  //截取帧
Image_To_Video(n);            //图像整合成视频
return(0);
}

int video_picture(string filename)
{
int i = 0;
int j = 0;

//读入视频
VideoCapture capture(filename);
double rate = capture.get(CV_CAP_PROP_FPS);     //获取视频帧率
//循环读取每一帧
while (1){
Mat frame;          //Mat:存储每一帧的图像
capture >> frame;       //读取当前帧
i++;
if (i == 6*rate){       //10fps/s      1min->600fps
i = 0;
j++;
//imshow("读取视频", frame);        //显示当前帧
string name_1 = "D://video picture//";
string name_2 = to_string(j);
string name_3 = ".jpg";
name_1 += name_2;
name_1 += name_3;           //图片存储路径及名字
if (!frame.empty()){
imwrite(name_1, frame);//截取当前帧并以图像的形式保存
waitKey(30);        //延时30ms
}
if (frame.empty())
break;
}

}
return j;

}

void Image_To_Video(int p_num)
{
char image_name[40];
string s_image_name;
//初始化视频编写器
cv::VideoWriter writer;
int isColor = 1;    //true
int frame_fps = 10;
int frame_width = 768;
int frame_height = 576;
using namespace cv;
string video_name = "D://video picture//hehe.avi";      //视频名字及路径
writer = VideoWriter(video_name, CV_FOURCC('X', 'V', 'I', 'D'), frame_fps, Size(frame_width, frame_height), isColor);
cv::namedWindow("image to video", CV_WINDOW_AUTOSIZE);
int i = 1;
Mat img;
while (i <= p_num)
{
sprintf(image_name, "%s%d%s", "D://video picture//", i++, ".jpg");
s_image_name = image_name;
img = imread(s_image_name);//读入图片
if (!img.data)             //判断图片调入是否成功
{
cout << "Could not load image file...\n" << endl;
}
if (!img.empty())                   //非空判断
imshow("image to video", img);
//写入
writer.write(img);
if (cv::waitKey(30) == 27 || i == 56)       //ESC:ASCⅡ码27
{
cout << "按下ESC键" << endl;
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv 视频