opencv学习-001-图像读取与显示(imread、imshow,nameWindow,Mat类)
这一节是图像的读取和显示,先上代码和结果,再解释其中重要部分:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
const char* winTitle = "input image";
int main(int argc, char** argv) {
//Mat src = imread("E:/Desktop/y.jpg");
Mat src = imread("E:/Desktop/y.jpg", IMREAD_GRAYSCALE);
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow(winTitle, WINDOW_AUTOSIZE);
imshow(winTitle, src);
waitKey(0);
return 0;
}
由结果可以看出,我们把读取的图片的黑白形式(我这张图原图是一个具有色彩的猫)给显示了出来。
1. imread
函数:
Mat imread(const String& filename,int flags = IMREAD_COLOR);
返回Mat对象;
- 参数
filename
:
待打开图片的绝对地址,需要注意的是,并不是所有文件都可以用它打开,它支持的文件如下;函数识别不是依靠文件的后缀名,而是依靠内容的编码格式; - 参数
flags
:打开的参数,这个非常重要,因为如果设置不合适的话,很容易出现预想之外的效果。它可以将原图读取时进行一定的转换,比如我例子中读取的时候让他灰度化了。默认值是IMREAD_LOAD_GDAL
。因此,如果是想直接处理原图,应该设置为IMREAD_UNCHANED
。
下面是flags
的官网的翻译:
Imread flags
enum ImreadModel{
IMREAD_UNCHANGED=1, //读取原图不做任何修改,有alpha通道就读取,无alpha通道那么图片会被省略
IMREAD_GRAYSCALE=0, //图图像转化为单通道的灰度图像;
IMREAD_COLOR=1, //转化为3通道的BGR图像imread函数默认情况下参数就为这个;
IMREAD_ANYDEPTH=2, //当传入的图像有颜色的深度时,返回16为或32位的图像,否则返回8位;
IMREAD_ANYCOLOR=4, //以任意可能的颜色形式读取图像;
IMREAD_LOAD_GDAL=8, //使用GDAL驱动去读取图像;
IMREAD_REDUCED_GRAYSCALE_2=16, //把图像转化为单通道的灰色图片,并且原有尺寸减少1/2;
IMREAD_REDUCED_COLOR_2=17, //把图片转化为3通道的RGB,并且把原图尺寸减少1/2;
IMREAD_REDUCED_GRAYSCALE_4=32, //把图片转化为单通道的BGR图片,并且原尺寸减少1/4;
IMREAD_REDUCED_COLOR_4=33, //把图片转化为3通道的RGB,并且把原图尺寸减少1/4;
IMREAD_REDUCED_GRAYSCALE_8=64, //把图片转化为单通道的BGR图片,并且原尺寸减少1/8;
IMREAD_REDUCED_COLOR_8=65, //把图片转化为3通道的RGB,并且把原图尺寸减少1/8;
IMREAD_IGNORE_ORIENTATION=128 //不因EXIF's方向标志而转化图像的坐标
};
2. imshow
函数:
void cv::imshow (const String& winname,Mat InputArray)
- 没有返回值
- 参数1, 显示的窗口名, 可以使用
cv::namedWindow
函数创建窗口,如不创建,imshow
函数将自动创建。 - 需要显示的图像
3. nameWindow
函数
void nameWindow(const string* winname,int flags = WINDOW_AUTOSIZE) ;
- 参数1:新建的窗口的名称。自己随便取。
- 参数2:窗口的标识,一般默认为
WINDOW_AUTOSIZE
。
WINDOW_AUTOSIZE
窗口大小自动适应图片大小,并且不可手动更改。
WINDOW_NORMAL
用户可以改变这个窗口大小(可手动拉伸)
WINDOW_OPENGL
窗口创建的时候会支持OpenGL
如果imshow
函数前没有namedWindow
函数则自动执行一个,但是该函数默认创建窗口的参数为WINDOW_AUTOSIZE
4. Mat
类
以上最重要的一点,就是我们注意到imread
的返回值是个Mat
类型的数据结构,Mat是一个初学者学习起来比较抽象的概念,它是用来代表任意维度的包含任意基础元素的稠密数组(“稠密”表示该数组的所有部分都有一个值存储),因为图片可以看成是个二维数组,则它一般都用来存放图片。
这个数据结构非常重要,但是我仅在这里简要提到,因为后续的学习都需要用到,而且我写这类博客的目的是在于运用,如果读者有兴趣想要深入了解,去官网或者推荐一本书《学习OpenCV3中文版》安德里安·凯勒和加里·布拉德斯基著这本书第四章,对cv::Mat
和cv::SparesMat
有详细的介绍。