文章目录
1.Mat类简析
Mat类是用于保存图像以及其他矩阵数据的数据结构,默认尺寸为 0 ,我们也可以指定其初始尺寸,比如定义一个Mat类对象,就要写:
cv::Mat pic(320,640,cv::Scalar(100));
2.图像的载入:imread()函数
其用于读取图片到OpenCV中。其原型如下:
Mat imread(const string& filename, int flag = 1);
1)第一个参数:填我们需要载入的图片路径名。
2)第二个参数:flag 为载入标识,它指定一个加载图像的颜色类型,自带默认值 1,表示载入三通道的彩色图像。这个参数可以在OpenCV中标识图像格式的枚举中取值:
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 通道的加载图像
Mat src1 = imread("6.jpg",2|4); //载入无损的源图像
Mat src2 = imread("6.jpg",0); //载入灰度图
Mat src3 = imread("6.jpg",1); //载入3通道的彩色图像
imshow("无损图像", src1);
imshow("灰度图", src2);
imshow("3通道图", src3);
3.图像的显示:imshow()函数
imshow()函数用于在指定的窗口中显示一副图像,原型如下:
void imshow(const string& winname, InputArray mat);
●第一个参数:const string& 类型的 winname,填需要显示的窗口名称标识
●第二个参数,InputArray:InputArray 类型的 mat ,填需要显示的图像
imshow 函数用于在指定的窗口中显示图像,如果窗口是用 CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原大小。否则,将图像进行缩放以适合窗口。而 imshow 函数缩放图像,取决于图像的深度。具体如下:
●如果载入的图像是8位无符号类型,就显示图像原来的样子。
●如果图像是16位无符号类型或32位整型,便用像素值除以256,也就是说,值的范围是[0,255 x 256] 映射到 [0,255]。
●如果图像是32位浮点型,像素值便要乘以255,也就是说,该值的范围是[0,1]映射到[0,255]。
4.创建窗口:namedWindow()函数
nameWindow 函数用于创建一个窗口,若是简单地进行图片显示,可直接用 imshow 函数读入图片指定窗口名,但若要在显示窗口之前就用到窗口名时,就需要 nameWindow 函数先创建出窗口,显示的规定窗口的名称了。
nameWindow 的函数原型如下:
void nameWindow(const string& winname, int flags = WINDOW_AUTOSIZE);
1)第一个参数:const string& 型的 name ,填写被用作窗口的标识符的窗口名称。
2)第二个参数:int 类型的 flags,窗口的表示,可以填如下几种值。
● CV_WINDOW_NORMAL,设置这个值,用户可以改变窗口的大小(没有限制)。
● CV_WINDOW_AUTOSIZE,设置这个值,窗口大小会自动调整以适应现实的图像,并且用户不能手动改变窗口大小。
● CV_WINDOW_OPENGL,设置这个值,窗口创建的时候会支持 OpenGL。
namedWindow 函数有默认值 CV_WINDOW_AUTOSIZE,所以一般情况下,这个函数填一个变量就行。namedWindow 函数的作用是通过指定的名字,创建一个可以作为图像和进度条的容器窗口,如果具有相同名称的窗口存在,则函数不做任何事。可调用 destoryWindow() 或者 destoryAllWindow() 函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。
但事实上,对于代码量不大的程序,没必要手动调用函数回收空间,因为在退出时,所有的资源和应用程序的窗口就会被操作系统自动关闭。
5.输出图像到文件:imwrite()函数
声明如下:
bool imwrite(const string& filename, InputArray img, const vector<int>& params = vector<int>() );
1)第一个参数:const string& 类型的 filename ,填写要写入的文件名。注意要带上后缀,如 “123.jpg”。
2)第二个参数,InputArray 类型的 img,一般填一个 Mat 类型的图像数据。
3)第三个参数,const vector& 类型的 params,表示为特定格式保存的参数编码。它有默认的 vector() ,所以一般情况下不需要填写,若要填写的话:
● 对于 JPEG 格式的图片,这个参数表示从 0 到 100 的图片质量(CV_IMWRITE_HEPG_QUALITY),默认值是 95。
● 对于PNG 格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从 0 到 9,较高意味着更小的尺寸和更长的压缩时间,默认值是 3。
● 对于PPM,PGM,或 PBM 格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为 0 或 1,默认值是 1。
imwrite 函数用于将图像保存到指定的文件。图像的格式是基于拓展名的,可保存的拓展名和 imread 中可以读取的图像拓展名一致。
以下是一个示例--------在 OpenCV 中生成一副 png 的图片,并写入到当前工程目录下。
#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;