OpenCV基础--数据的保存

一、图像数据的保存        

        opencv提供imwrite()函数用于将Mat类矩阵保存成图像文件,该函数的原型如下:

bool cv::imwrite(const String &filename,
                InputArray img,
                Const std::vector<int> &params = std::vector<int>()
                )

filename: 保存图像的地址和文件名,包含图像格式。

img: 将要保存的Mat类矩阵变量。

params: 保存图片格式属性设置标志。

        当保存图像成功,返回true,失败则返回false,通常该函数只能保存8位单通道图像和3通道BGR彩色图像,但是可以更改第三个参数保存成不同格式的图像。第三个参数的设置方式如下:

imwirte()函数第三个参数可选择的标志作用
标志参数简记作用
IMWRITE_JPEG_QUALITY1保存成JPEG格式的文件的图像的质量,分成0~100等级,默认95
IMWRITE_JPEG_PROGRESSIVE2增强JPEG格式,启用为1,默认值为0(False)
IMWRTE_JPEG_OPTIMIZE3对JPEG格式进行优化,启用为1,默认参数为0(False)
IMWRITE_JPEG_LUMA_QUALITY5JPEG格式文件单独的亮度质量等级,分为0~100,默认为0
IMWRITE_JPEG_CHROMA_QUALITY6JPEG格式文件单独的色度质量等级,分成0~100,默认为0
IMWRITE_PNG_COMPRESSION16保存成PNG格式文件压缩级别,0~9值越大越意味着更小尺寸和更长的压缩时间,默认值为1(最佳速度设置)
IMWRITE_TIFF_COMPRESSION259保存成TIFF格式文件压缩方案
#include<opencv2\opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

void AlphaMat(Mat &mat)
{
    CV_Assert(mat.channels() == 4);   //如果括号中的表达式为false则返回一个错误信息
    for(int i = 0; i < mat.rows; i++)
    {
        for(int j = 0; j < mat.cols; j++)
        {
            Vec4b &bgra = mat.at<Vec4b>(i, j);
            bgra[0] = UCHAR_MAX;    
            bgra[1] = staurate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX;
            bgra[2] = staurate_cast<uchar>((float(mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX;
            bgra[3] = staurate_cast<uchar>(0.5 * (bgra[1] + bgra[2]))  //Alpha通道
         }
    } 
}
    
int main(int agrc, char** agrv)
{
    Mat mat(400, 640, CV_8UC4);
    AlphaMat(mat);   
    vector<int> compression_params;
    compression_params.push_back(IMRITE_PNG_COMPRESSION);  //PNG格式图像压缩标志
    compression_params.push_back(9);
    bool result = imwrite("alpha.png", mat, compression_params);
    if(!result)
    {
        cout<<"保存成PNG格式图像"<< endl;
        return -1;
    }
    cout << "保存成功" << endl;
    return ;
    
}

二、视频的保存

        OpenCV提供了ViodeWriter()类用于实现多张图像保存成视频文件。函数原型如下:

cv::VideoWriter::VideoWriter();   //默认构造函数
cv::VideoWriter::VidowWriter(const String &filename,
                            int fourcc,
                            double fps,
                            Size framSize,
                            bool isColor=true
                            )

filename: 保存视频的地址和文件名,包含视频格式。

fourcc: 压缩帧的4字符编解码器代码。

fps:保存视频的帧率,即视频中每秒图像的张数。

framSize: 视频的尺寸。

isColor: 保存视频是否为彩色视频。

        第一行默认构造函数的使用方法与VideoCapture()相同,都是创建一个用于保存视频的数据流,后续通过open()函数设置保存文件名称,编解码器, 帧数等一系列参数。在第二个参数中如果赋值“-1”则会自动搜索合适的编解码器。

        该函数与VideoCapture()有很大的相似之处,都可以通过isOpened()函数判断是否成功创建一视频流,可以通过get()查看视频流中的各种属性。在保存视频时我们只需要将生成视频的图像一帧一帧地通过“<<"操作符(或者write()函数)赋值给视频流,最后使用release()关闭视频流。

视频编码格式
OpenCV4.1版本标志OpenCV4.0版本标志作用
VideoWriter::fourcc('D', 'T', 'V', 'X')VideoWriter::FOURCC('D', 'T', 'V', 'X')MPEG-4编码
VideoWriter::fourcc('P', 'T', 'M', 'I')...MPEG-1编码

VideoWriter::fourcc('M', 'J', 'P', 'G')

...JPEG编码(运行效果一般
VideoWriter::fourcc('M', 'P', '4', '2')...MPEG-4.2编码
VideoWriter::fourcc('D', 'T', 'V', '3')...MPEG-4.3编码
VideoWriter::fourcc('U', '2', '6', '3')...H263 编码
VideoWriter::fourcc('T', '2', '6', '3')...H2631编码
VideoWrter::fourcc('F', 'L', 'V', '1' )...FLVI编码
#include <opencv/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat img;
    VideoCapture video(0); //使用某个摄像头
    
    //读取视频
    //VideoCapture video;
    //Video.open("cup.mp4");
    
    if(!Video.isOpened())   //判断是否调用成功
    {
        cout << "打开摄像头失败,请确认摄像头是否安装成功";
        return -1;
    }
    
    video >> img;   //获取图像
    //检测是否成功获取图像
    if (img.empty())  //判断读取图像是否成功
    {
        cout <<"没有获取到图像" << endl;
        return -1;
    }
    bool isColor = (img.type() == CV_8UC3);   //判断 相机(视频)是否为彩色
    
    VideoWriter writer;
    int codec = VideoWriter::fourcc('M', 'J', 'P', 'G'); //选择编码格式
    
    double fps = 25.0; //设置视频帧率
    string filename = "live.avi"'  //保存的视频文件名称
    writer.open(filename, codec, fps, img.size(), isColor);  //创建保存视频文件的视频流
    
    if(!writer.isOpened())  //判断视频流是否创建成功
    {
        cout<<"打开视频流失败,请输入是否为合法输入" <<endl;
        return -1;
    }
    while (1)
    {
        //检测是否执行完毕
        if(!video.read(img))   //判断能否继续从摄像头过着视频文件中读出一帧图像
        {
            cout<<"摄像头断开链接或者视频读取完成"<<endl;
            break;
        }
        writer.write(img);   //把图像写入视频流
        //writer << img;
        imshow("Live", img);  //显示图像
        char c = waitKey(50);
        if (c == 27)  //按“Esc”键退出视频保存'
        {
            break;
        }
    }
    // 退出程序时自动关闭视频流
    // video.release();
    // writer.release();
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值