OpenCV之imwrite

1、imwrite

imwrite函数用于将图像保存到指定的文件。
 CV_EXPORTS_W bool imwrite( const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());  
1、filename保存路径
2、源图像
3、第三个参数:const std::vector<int>&类型的params,表示为特定格式保存的参数编码,它有默认值std::vector<int>(),所以一般情况下不需要填写。如果更改的话,对于不同的图片格式,其对应的值不同功能不同,如下:
对于JPEG格式的图片,这个参数表示从0-100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95.
对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0-9.较高的值意味着更小的尺寸和更长的压缩时间而默认值是3.
对于PPM,PGM或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,而默认值为1.

2、Vec4b
 

typedef Vec <uchar, 2> Vec2b; 
Vec2b—表示每个Vec2b对象中,可以存储2个char(字符型)数据 
Vec3b—表示每一个Vec3b对象中,可以存储3个char(字符型)数据,比如可以用这样的对象,去存储RGB图像中的 
Vec4b—表示每一个Vec4b对象中,可以存储4个字符型数据,可以用这样的类对象去存储—4通道RGB+Alpha的图

3、saturate_cast


就是防止数据溢出,具体的原理可以大致描述如下:
if(data<0)
        data=0;
if(data>255)
data=255
实例:
 pResultData[j]= cv::saturate_cast<uchar>(255 - pSrcData[j]);

 

4、 例子

f96ef193e187c1e9b30844da3753d5ebfff.jpg

#include "mainwindow.h"
#include <QApplication>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;

void createAlphaMat(Mat &mat)
{
    for(int i = 0; i < mat.rows; ++i)
    {
        for(int j = 0; j < mat.cols; ++j)
        {
            Vec4b &rgba = mat.at<Vec4b>(i, j); //每一个Vec4b对象中,可以存储4个字符型数据,可以用这样的类对象去存储—4通道RGB+Alpha的图
            rgba[0] = UCHAR_MAX;
            rgba[1] = saturate_cast<uchar>((float (mat.cols - j))/ ((float)mat.cols) * UCHAR_MAX);
            rgba[2] = saturate_cast<uchar>((float (mat.rows - j))/ ((float)mat.rows) * UCHAR_MAX);
            rgba[3] = saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
       }
    }
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //创建带Alpha通道的Mat
    Mat mat(480, 640, CV_8UC4);
    createAlphaMat(mat);

    vector<int>compression_params;
    compression_params.push_back(IMWRITE_PNG_COMPRESSION);
    compression_params.push_back(9);

    try{
        imwrite("Alpha.png", mat, compression_params);
        imshow("created png", mat);
        fprintf(stdout, "PNG图片文件的alpha数据保存完毕!可以在工程目录下查看\n");
         waitKey(0);
    }catch(runtime_error & ex){
        fprintf(stderr, "图像转换成gng格式发生错误", ex.what());
        return 1;
    }

    return a.exec();
}

 

 

转载于:https://my.oschina.net/u/3919756/blog/1936704

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值