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

刚开始接触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;
        }
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值