OpenCV系列二 --- 图像的载入、显示与输出
在这篇文章中,我们详细的了解如何用OpenCV实现对图片的载入、显示与输出。好了,那么接下来让我们正式的进入OpenCV的学习吧!
一、关于OpenCV命名空间
OpenCV中的C++类和函数都是定义在命名空间cv之内的,有两种方法可以访问。第一种是,在代码开头的适当位置,加上usingnamespace cv;
另外一种是在使用OpenCV类和函数时,都加入cv::命名空间。不过这种情况难免会不爽,每用一个OpenCV的类或者函数,都要多敲四下键盘写出cv::,比较麻烦。
所以推荐大家在代码的开头合适的位置加上using namespace cv;,这样就不用每次写OpenCV的函数都要加cv::。
二、关于Mat类型
cv::Mat类是用于保存图像以及其他矩阵数据的数据结构。默认情况下,其尺寸为0,我们也可以指定初始尺寸;
比如定义一个Mat类对象,就要写
cv::Mat img(320,640,cv::Scalar(100));
三、图像的载入与显示
需要载入和显示图像的话,OpenCV提供了三个函数来进行实现,它们分别时
imread()、namedWindow()以及imshow()这三个函数,看起来是不是特别简洁;
好了,接下来我们就具体的了解一下这三个函数时怎么实现图像的载入与显示。
1、imread()函数
功能:从文件中加载一幅图片。
函数原型:
CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );
(1)第一个参数,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
(2)第二个参数,int 类型的 flags,为载入标识,指定一个加载图像的颜色类型。默认值为1,代表彩色图像。有如下枚举值:
IMREAD_UNCHANGED = -1 // 按原样返回加载的图像(使用alpha通道,否则会被剪切)。
IMREAD_GRAYSCALE = 0 //将图像转换为灰度图像,在打开图像
IMREAD_COLOR = 1, //默认彩色打开图像
IMREAD_ANYDEPTH = 2, // 载入图像的深度为16或32则返回对应深度的图像,否则将转为8位图像再返回。
IMREAD_ANYCOLOR = 4 // 图像时什么格式,就以什么格式进行载入
因为flags是int型的变量,如果我们觉得用枚举中的变量比较麻烦的话,我们还可以这样来:
- flags >0 返回一个3通道的彩色图像。
- flags =0 返回灰度图像。
- flags <0 返回包含Alpha通道的加载的图像。
需要注意的点:输出的图像默认情况下是不载入Alpha通道进来的。如果我们需要载入Alpha通道的话呢,这里就需要取负值。
还有一些其他的打开图像标记,我就不一一为大家列举了。
实例:
Mat img = imread("1.png", IMREAD_ANYDEPTH | IMREAD_ANYCOLOR);//载入最真实的图像
Mat img1 = imread("1.png", 0);//载入灰度图
Mat img2 = imread("1.png", 1);//载入3通道的彩色图像
Mat mark = imread("2.png");//载入3通道的彩色图像,flag参数默认为1
2、namedWindow()函数
功能:创建一个窗体。
函数原型:
CV_EXPORTS_W void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
(1)第一个参数,const string& 类型的 winname,为窗口名称。
(2)第二个参数,int 类型的 flags,为窗口标识,有如下几种值:
WINDOW_NORMAL,用户可以改变窗口的大小(没有限制)。
WINDOW_AUTOSIZE,窗口会自动调整大小以适应所显示的图像,且用户不能手动改变窗口大小。
WINDOW_OPENGL,窗口创建的时候会支持 OpenGL。
3、imshow()函数
功能:将图片显示到指定的窗体上。
函数原型:
CV_EXPORTS_W void imshow(const String& winname, InputArray mat);
(1)第一个参数,const string& 类型的 winname,为需要显示的窗口标识名称。
(2)第二个参数,InputArray 类型的 mat,为需要显示的图像。
若窗口是用 CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么将显示图像原始大小。否则,将图像进行缩放以适应窗口。imshow() 函数缩放图像,取决于图像的深度;
如果载入的图像是 8 位无符号类型,则显示图像本来的样子。
如果图像是 16 位无符号数类型或 32 位整型,则用像素值除以 256,值的范围从 [0,256*256] 映射到 [0,255]。
如果图像是 32 位浮点型,像素值乘以 255。值的范围从 [0,1] 映射到 [1,255]。
若窗口创建(namedWindow函数)的时候,如果设定了支持OpenGL(WINDOW_OPENGL ),那么imshow还支持ogl::Buffer ,ogl::Texture2D以及gpu::GpuMat作为输入。
3、waitKey()函数
功能:等待键盘按下,在显示图像时具有延时的作用,单位ms。
函数原型:
CV_EXPORTS_W int waitKey(int delay = 0);
delay参数:
等待x ms,如果在此期间有按键按下,则立即结束并返回按键的ASCII码,否则返回-1;
如果x=0,则无限等待下去,直到有按键按下;
【注】:在imshow之后,如果没有waitKey语句则不会显示图像。
4、imwrite()函数
功能:将图片保存到磁盘中。
函数原型:
CV_EXPORTS_W bool imwrite( const String& filename, InputArray img,
const std::vector<int>& params = std::vector<int>());
(1)第一个参数,const string& 类型的 filename,提供需要保存的路径、图像名称以及图像格式。
(2)第二个参数,InputArray 类型的 img,需要保存到磁盘的图像。
(3)第三个参数,const std::vector&类型的params,表示为特定格式保存的参数编码,它有默认值std::vector(),所以一般情况下不需要填写。如果更改的话,对于不同的图片格式,其对应的值不同功能不同,如下:
对于JPEG格式的图片,这个参数表示从0 - 100的图片质量(IMWRITE_JPEG_QUALITY), 默认值是95.
对于PNG格式的图片,这个参数表示压缩级别(IMWRITE_PNG_COMPRESSION)从0 - 9.较高的值意味着更小的尺寸和更长的压缩时间而默认值是3.
对于PPM,PGM或PBM格式的图片,这个参数表示一个二进制格式标志(IMWRITE_PXM_BINARY),取值为0或1,而默认值为1.
四、具体实例
实例功能
载入图像,显示图像,并且输出显示的图像到文件中。
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("1.png", IMREAD_ANYDEPTH | IMREAD_ANYCOLOR);//载入最真实的图像
namedWindow("Display", WINDOW_FULLSCREEN);
imshow("Display", img);
vector<int> compression_params;
compression_params.push_back(IMWRITE_PNG_COMPRESSION); //选择png
compression_params.push_back(9); //在这个填入你要的图片质量
imwrite("D:\\img.tif", img, compression_params);
waitKey(0);
return 0;
}
显示图像的效果:
好了,图像的载入、显示与输出聊到这里就结束了,如果大家喜欢的话可以给我点个赞哦!!!