本片参考博客:http://blog.csdn.net/poem_qianmo/article/details/20537737
基于OpenCV3.0,与原博客有出入。

在OpenCV1.0时代,基于C语言借口而建立的图像存储格式IpIImage*,如果在退出时忘记release掉的话会造成内存泄漏。自OpenCV2.0开始,用Mat类型数据作为主打之后,OpenCV变得像Matlab那样需要很少的编程涵养。
图像的载入、显示和输出分别对应三个函数:imread(),namedWindow(),imshow().

1.imread函数
在OpenCV3.0官方文档中查到其原型为:CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );  

**第一个参数const string&类型的filename,填需要载入的图片路径名,路径名为双“\\”。在Windows操作系统下,OpenCV的imread函数支持如下类型的图像载入:

Windows位图 - *.bmp, *.dib

JPEG文件 - *.jpeg, *.jpg, *.jpe
JPEG 2000文件- *.jp2
PNG图片 - *.png
便携文件格式- *.pbm, *.pgm, *.ppm
Sun rasters光栅文件 - *.sr, *.ras
TIFF 文件 - *.tiff, *.tif


**第二个参数int类型的flags,为载入标识指定一个加载图像的颜色类型。其自带IMREAD_COLOR.所以在某些情况下我们可以直接将这个参数忽略,系统默认为其缺省值.我们发现这个枚举的定义是这样的:
enum ImreadModes {
IMREAD_UNCHANGED = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
IMREAD_GRAYSCALE = 0, //!< If set, always convert image to the single channel grayscale image.
IMREAD_COLOR = 1, //!< If set, always convert image to the 3 channel BGR color image.
IMREAD_ANYDEPTH = 2, //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
IMREAD_ANYCOLOR = 4, //!< If set, the image is read in any possible color format.
IMREAD_LOAD_GDAL = 8 //!< If set, use the gdal driver for loading the image.
};

相应解释:

IMTEAD_UNCHANGED = -1:废置!
IMREAD_GRAYSCALE  = 0:设置此表示,将图像转化为单通道灰度图。
IMREAD_COLOR      = 1:将图像转化为三通道BGR彩色图像。
IMREAD_ANYDEPTH  
= 2:若载入图像的深度为16或32位就返回对应深度的图像,否则将图像转换为8位图像
IMREAD_ANYCOLOR
= 4:图像可被读取为任意可能的彩色格式
IMREAD_LOAD_GDAL
= 8:使用文件格式驱动加载图像

**PS:如果输入有冲突的标志,将采用较小的数字值。比如:IMREAD_COLOR|IMTEAD_ANYCOLOR将载入3通道图。如果要载入最真实的图像选择IMREAD_ANYCOLOR|IMTEAD_ANYPTH。
因为flags是int类型的变量,如果我们不再这个枚举体中取值的话还可以:
flags
> 0返回一个三通道的彩色图像。
flags
= 0返回灰度图像。
flags
< 0返回包含Alpha通道的加载的图像。

PS:输出的图像默认情况下不是载入Alpha通道进来的。如果我们需要载入Alpha通道的话就取负值。

2.namedWindow函数。
用于创建一个窗口。函数原型:
CV_EXPORTS_W void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);  

第一个参数:const string&类型的name, 即填呗用作窗口标识符的窗口名称。
第二个参数:int类型的flags,窗口大小的标识符,在库中的函数枚举如下:
enum { WINDOW_NORMAL     = 0x00000000, // the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size
WINDOW_AUTOSIZE = 0x00000001, // the user cannot resize the window, the size is constrainted by the image displayed
WINDOW_OPENGL = 0x00001000, // window with opengl support WINDOW_FULLSCREEN = 1, // change the window to fullscreen
WINDOW_FREERATIO = 0x00000100, // the image expends as much as it can (no ratio constraint)
WINDOW_KEEPRATIO = 0x00000000 // the ratio of the image is respected
};



WINDOW_NORMAL:用户可以改变窗口的大小(没有限制),也可以将一个满屏的窗口转换成常用大小。
WINDOW_AUTOSIZE:窗口大小会自动调整以适应所显示的图像并且不能手动更改窗口大小。
WINDOW_OPENGL:创建支持OpenGL的窗口。
WINDOW_FULLSCREEN:将整个窗口充满屏幕
WINDOW_FREETATIO:图像将尽可能展开(没有比例约束)
WINDOW_KEEPTARIO:图像比例受到约束。

对于我们大多数人来讲前四个是最常用的格式。

namedWindow()函数是通过制定的名字创建一个作为图像和进度条的容器窗口。如果有相同名称的窗口已经存在,则函数不做任何事。
我们可以调用destroyWindow()或者destroyAllWindows()函数来关闭窗口并取消之前分配的与窗口相关的所有内存空间。


3.imshow函数
在指定窗口中显示图像,其函数原型为:
CV_EXPORTS_W void imshow(const String& winname, InputArray mat);  

第一个参数:const string&类型的name, 填写需要显示的窗口表示名称,与函数namedWindow()函数中命名的窗口标识一致
第二个参数:inputArray mat,填写需要显示的图像,即用imread读取的Mat类型的图像。
在mat.hpp中查询InputArray原型如下:
typedef const _InputArray& InputArray;  


imshow函数用于在指定的窗口中显示图像。如果窗口时用WINDOW_AUTOSIZE创建,那么显示图像原始大小。否则将图像进行缩放以适合窗口。而imshow函数缩放图像取决于图像的深度:
如果载入的图像是8位无符号类型(8-bit unsigned),就显示图像本来的样子。
如果图像是16位无符号类型(16-bit unsigned)或32位整型(32-bit integer),便用像素值除以256。也就是说值的范围是[0,255×256]映射到[0,255]。
如果图像是32位浮点型(32-bit floating-point),像素值便要乘以255。也就是说该值的范围是[0,1]映射到[0,255]。

针对以上三种函数,示例代码如下:
Mat imageTest = imread("F:\\opencvProgram\\TestImage\\帆板迎浪而上.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
namedWindow("帆板迎浪而上", WINDOW_NORMAL);
imshow("帆板迎浪而上", imageTest);



4.imwrite函数

在OpenCV中其声明如下:

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



第一个参数:const string&类型的filename,设置为需要写入的文件名就行了(包含后缀)。
第二个参数:InputArray类型的img,一般是一个Mat类型的图像数据。
第三个参数: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.

imwrite函数用于将图像保存到指定的文件。图像格式是基于文件扩展名的,可保存的阔扎名和imread函数中可以读取的图像扩展名一样:

Windows位图 - *.bmp, *.dib

JPEG文件 - *.jpeg, *.jpg, *.jpe
JPEG 2000文件- *.jp2
PNG图片 - *.png
便携文件格式- *.pbm, *.pgm, *.ppm
Sun rasters光栅文件 - *.sr, *.ras
TIFF 文件 - *.tiff, *.tif


源代码(浅墨CSDN,博客开头已声明):
/*opencv中,输出图像到文件一般用imwrite函数*/
/*函数声明如下:bool imwrite(const string& filename,
InputArray img, const vector<int>& params=vector<int>())*/
#include <vector>
#include <iostream>
#include <opencv2\opencv.hpp> using namespace std;
using namespace cv; void creatAlphaMat(Mat &mat)
{
/*通过转到定义,Mat为一个重载的函数其原型为:*/
/*Mat(int rows, int cols, int type);*/ 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; //unsigned char 的最大值
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(void)
{
Mat mat(480, 640, CV_8UC4); //类型为8-bit unsigned integers(0..255),矩阵类型为四通道
creatAlphaMat(mat); vector<int>compression_params;
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); //PNG格式图片的压缩级别
compression_params.push_back(9); try
{
imwrite("透明Alpha值图.png", mat, compression_params);
}
catch (runtime_error& ex)
{
fprintf(stderr, "图像转换成PNG格式发生错误:%s\n", ex.what());
return 1;
} fprintf(stdout, "PNG图片文件的alpha数据保存完毕!\n"); return 0;
}

【OpenCV开发】imread和imwrite的类型以及第三个参数关于图片压缩质量等的更多相关文章

  1. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  2. OpenCV开发笔记(五十六):红胖子8分钟带你深入了解多种图形拟合逼近轮廓(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  3. OpenCV开发笔记(六十四):红胖子8分钟带你深入了解SURF特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  4. OpenCV开发笔记(六十五):红胖子8分钟带你深入了解ORB特征点(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  5. OpenCV开发笔记(六十九):红胖子8分钟带你使用传统方法识别已知物体(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  6. OpenCV开发笔记(七十二):红胖子8分钟带你使用opencv+dnn+tensorFlow识别物体

    前言   级联分类器的效果并不是很好,准确度相对深度学习较低,本章使用opencv通过tensorflow深度学习,检测已有模型的分类.   Demo       可以猜测,1其实是人,18序号类是狗 ...

  7. OpenCV开发笔记(七十三):红胖子8分钟带你使用opencv+dnn+yolov3识别物体

      前言   级联分类器的效果并不是很好,准确度相对深度学习较低,上一章节使用了dnn中的tensorflow,本章使用yolov3模型,识别出具体的分类.   Demo   320x320,置信度0 ...

  8. win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建

    win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的优点:能够调试的时候看OpenCV的源码. 重编译要得到的东西:Debug版本号和Release版本号 ...

  9. OpenCV开发笔记(七十一):红胖子8分钟带你深入级联分类器训练

    前言   红胖子,来也!  做图像处理,经常头痛的是明明分离出来了(非颜色的),分为几块区域,那怎么知道这几块区域到底哪一块是我们需要的,那么这部分就涉及到需要识别了.  识别可以自己写模板匹配.特征 ...

随机推荐

  1. python fc21~fc29踩坑记录

    最近在公司的linux fc21上安装python和anaconda, 直接mintmenu给挂掉了. 真是弱爆了. 后来,升级终于来了, 升到了fc29.好,再看看, python2.7还在, py ...

  2. Java 工厂方法模式的简单示例

    工厂方法模式:也叫工厂模式,属于类创建型模式,工厂父类(接口)负责定义产品对象的公共接口,而子类工厂则负责创建具体的产品对象. 目的:是为了把产品的实例化操作延迟到子类工厂中完成,通过工厂子类来决定究 ...

  3. nginx在一个服务器上配置两个项目,并通过两个不同的域名访问

    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,由俄罗斯的程序设计师Igor Sysoev所开发,其特点是占有内存少,并发能力强. 话不多说,先从最基 ...

  4. hiho #1062 : 最近公共祖先·一(树,最近祖先)

    #1062 : 最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在 ...

  5. 深浅拷贝(copy)

    目录 copy 模块 1.拷贝(赋值) 1). x为不可变数据类型 2). x为可变数据类型 3). 可变数据类型(比如列表)内,既有不可变元素,又有容器类型可变元素(比如列表) 2.浅拷贝 3.深拷 ...

  6. .Net笔试考题

    .NET试题 1.列举ASP.NET页面之间传递值的几种方式 2.请写出 override 与重载的区别 3.请编程实现一个冒泡排序算法 4.什么是装箱和拆箱 5.ADO.net中常用的对象有哪些?分 ...

  7. day_work_02

    day_work_02 ------Python是一个优雅的大姐姐 作业一 设计思路(四个if一个while) 首先我先把商品用列表加元组的形式保存,然后将商品遍历出来. 键盘输入薪水. (if)判断 ...

  8. POJ 3068 运送危险化学品 最小费用流 模板题

    "Shortest" pair of paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1215 ...

  9. Mongo rs

    概念 rs中存储了每一次对mongo数据库的CUD操作,对rs的大小进行resize. 主要有两种方法: 在未开启过rs的情况下,修改配置文件 已使用rs一段时间后,发现rs太大,重新进行大小配置 启 ...

  10. python学习之路(9)

    函数的参数 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调 ...