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

来源:互联网 发布:炉石传说 for mac 编辑:程序博客网 时间:2024/05/21 15:31
刚开始接触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,填需要显示的窗口标识名称。
第二个参数,InputArray 类型的mat,填需要显示的图像。
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分别代表图片的长宽。
下面的代码是练习代码

///////////////////////////////////////        隔一分钟保存一帧           //  //       将连续帧保存为视频          //                           ////////////////////////////////////#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;        }    }}
0 0
原创粉丝点击