OpenCV图像读写方式

简介

在Windowns操作系统下,OpenCV的imread函数支持如下类型的图片载入:

  • Windows位图:* .bmp,*.dib
  • JPGEG文件:* .jpeg,* .jpg,*.jpe
  • JPEG2000文件: * .jp2
  • PNG图片:*.png
  • 便携文件格式: * .pbm,* .pgm,*.ppm
  • Sun rasters 光栅文件:* .sr,*.ras

读入模式

Mat imread(const sting& filename , int flags=1)

flags为载入标识符,指定一个载入图像的颜色类型。可以看到他自带的默认值1,所以很多时候这个可以忽略。在看了下面的讲解之后,我们就会发现,忽略表示载入三通道的彩色图像。higui_c.h中定义这样:

enum
{
/* 8bit, color or not */
    CV_LOAD_IMAGE_UNCHANGED  =-1,
/* 8bit, gray */
    CV_LOAD_IMAGE_GRAYSCALE  =0,
/* ?, color */
    CV_LOAD_IMAGE_COLOR      =1,
/* any depth, ? */
    CV_LOAD_IMAGE_ANYDEPTH   =2,
/* ?, any color */
    CV_LOAD_IMAGE_ANYCOLOR   =4
};

对常用标识符的理解:

  • CV_LOAD_IMAGE_UNCHANGED —-1—在新版本已忽略
  • CV_LOAD_IMAGE_GRAYSCALE—0—将图像转为灰度图像
  • CV_LOAD_IMAGE_COLOR—1—将图像转为彩色图像
  • CV_LOAD_IMAGE_ANYDEPTH—2—如果载入的图像深度为16位或者32位,就返回对应的深度的图像,否则转换为8位图像

需要说明的是,如果输入有冲突的标志,将采用较小的数字值,CV_LOAD_IMAGE_COLOR|CV_LOAD_IMAGE_ANYCOLOR将载入三通道图。如果载入最真实无损的源图片,可以选择CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR
这里写图片描述

因为flags是int型的变量,若不填写固定的值,可以这样进行:

  • flags>0 返回一个3通道的彩色图像
  • flags=0 返回一个灰色图像
  • flags<0 返回一个包含Alpha通道的加载图像
    这里写图片描述

例子

#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

int main(){


    Mat losslessImg = imread("D:\\Program Files\\VS2013Code\\test01_compositePicture\\test01_compositePicture\\fruits.jpg", 2 | 4);
    Mat grayImg = imread("D:\\Program Files\\VS2013Code\\test01_compositePicture\\test01_compositePicture\\fruits.jpg", 0);
    Mat colorfulImg = imread("D:\\Program Files\\VS2013Code\\test01_compositePicture\\test01_compositePicture\\fruits.jpg", 199);

    imshow("losslessImg", losslessImg);
    imshow("grayImg", grayImg);
    imshow("colorfulImg", colorfulImg);
    waitKey(0);



}



这里写图片描述
这里写图片描述
这里写图片描述

如果窗口是用CV_WINDOW_AUTOSIZE默认的,就会显示原始图片大小。否则缩放的图像依据深度大小:

  • 8位无符号类型,就显示原图
  • 16位无符号类型,或者32位整型,便用像素除以256,即【0,255X256】缩放【0,255】
  • 如果是32位浮点型,则像素要乘以255,即【0,1】映射为【0,255】

窗口大小设置

窗口设置的原函数为:
namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE);

第一个参数为字符;
第二个参数为窗口标识符,有如下参数:

  • WINDOW_NOMAL——用户可以随意改变窗口大小,在OpenCV2中为CV_WINDOW_NOMAL;
  • WINDOW_AUTOSIZE——显示原图片大小,不可改动,在OpenCV2中为CV_WINDOW_AUTOSIZE;
  • WINDOW_OPENGL——设置这个值,窗口建立时会支持OpenGL,imshow支持ogl:Buffer、ogl:Texture2D以及gpu:GpuMat作为输入;

输出图像到文件

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

前两个不解释,vector& params=vector()对于保存图片的质量:
- 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

#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

void creatAlphaMat(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);
            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 - i)) / ((float)mat.rows)*UCHAR_MAX);
            rgba[3] = saturate_cast<uchar>(0.5*(rgba[1] + rgba[2]));
        }
    }
}

int main(){

    //创建带Alpha通道的Mat
    Mat mat(70, 270, CV_8UC4);
    creatAlphaMat(mat);

    vector<int>compression_params;
    //OpenCV2为
    //compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
    //OpenCV3为
    compression_params.push_back(IMWRITE_PNG_COMPRESSION);
    compression_params.push_back(9);

    try{
        imwrite("透明Alpha值图.png", mat, compression_params);
        imshow("透明Alpha值图", mat);
        fprintf(stdout, "png图片数据保存完毕\n 可以在工程目录下查看~~\n ");
        waitKey(0);
    }
    catch(runtime_error& ex){
        fprintf(stderr, "mat图像生成为成功!错误:%s\n", ex.what());
    }

    return 0;

}



这里写图片描述

摄像头输出图像

#include <opencv2\opencv.hpp>

using namespace std;
using namespace cv;

int main(){

    VideoCapture capture;
    Mat frame;
    int index = 0;

    capture.open(0);

    if (capture.isOpened())
    {


        for (;;)
        {

            char cur_fn[255];//表示某张图片的路径
            capture >> frame;
            vector<int>compression_params;
            compression_params.push_back(IMWRITE_JPEG_QUALITY);
            compression_params.push_back(95);


            if (!frame.empty())
            {
                imshow("avi", frame);

                sprintf(cur_fn,"%08d.jpg", index);
                imwrite(cur_fn, frame, compression_params);

                index ++;

                int c = waitKey(1);
                if ((char)c == 'c') { break; }
            }
            else
            {
                printf(" --(!) No captured frame -- Break!"); break;
            }
        }
    }

    return 0;

}



这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以问天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值