图像的载入,显示和输出。

1.图像的载入,显示和输出到文件
1.1 OpenCV的命名空间
OpenCV中C++的类和函数都是定义在cv命名空间中的,所以我们在调用OpenCV中的类或函数的时候有两种访问方式:
(1)在代码开头加入 using namespace cv; 来规定程序的使用范围;
(2)在使用OpenCV的函数和类时,都加上cv::命名空间;
通常我们在写OpenCV程序的时候,通常需要加入如下内容:

#include <opencv2/core/core.hpp>   //和imread()中的flags有关
#include <opencv2/highgui/highgui.hpp>  //图形用户界面
using namespace cv;

1.2 Mat类简析
Mat类使用于保存图像或矩阵类形数据的数据结构,默认尺寸为0,我们修改其尺寸,通过定义一个Mat的类对象,cv::Mat pic(320, 640, CV8UC3,cv::Scalar(100)); 上述语句表示创建一个大小为320 * 640,图像深度为8数据类型为uchar的三通道数组,每个通道的颜色值为100
1.3 图像的载入:imread() 函数
imread函数,用于读取文件中的图片到OpenCV中,原型:

Mat imread(const string & filename, intflags = 1)

(1)参数1:const string &类型的filename, 填如我们要载入的图片的路径名。
在Window操作系统下,OpenCV支持如下类型图像的载入。

  • Windows 位图:*.bmp *.dib
  • JPEG文件 : *.jpeg *.jpg *.jpe
  • JPEG 2000 文件:*.jp2
  • PNG *.png
  • 便携文件格式: *.pbm *pgm(深度图) *.ppm
  • Sun rasters 光栅文件: *.sr *.ras
  • TIFF文件 : *.tiff *.tif
    (2)参数2:int类型的falgs,载入标志,它指示了加载图像的颜色类型。默认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,
  };

对标志符的解释:

  • CV_LOAD_IMAGE_UNCHANGED 等价-1,新版中忽略
  • CV_LOAD_IMAGE_GRAYSCALE 等价0,将图像转换为灰度图再返回
  • CV_LOAD_IMAGE_COLOR 等价1,将图像转换到彩色图再返回
  • CV_LOAD_IMAGE_ANYDEPTH 等价2,载入的图像深度为16/32位,就返回对应的深度图像,否则转换为8位图像再返回
    note:
    如果输入有冲突,将采用较小的数值。
    如果想载入最真实无损的原图像,可以选择 V_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR

flags是int值,如不取枚举中固定的值可以这样进行:

  • falgs > 0 返回一个三通道的彩色图
  • flags = 0 返回灰度图
  • falgs < 0 返回alpha通道的加载图像
    note:以彩色模式载入的图像,解码后的图像会以BGR的通道顺序进行存储而不是RGB
    (3)示例:
    Mat image0 = imread(“1.jpg”, 2 | 4); //载入无损的原图像
    Mat image1 = imread(“1.jpg”, 0); //载入灰度图
    Mat image3 = imread(“1.jpg”, 199) ;// 载入彩色图

1.4 图像的显示 :imshow()函数
imshow()函数用于在指定窗口中显示一幅图像。
函数原型:

void inshow(const string& winname, InputArray mat);

(1)参数1: const string&类型winname,填需要的窗口标识名称。
(2)参数2:InputArray类型的mat, 需要显示的图像。
imshow()函数用于在指定的窗口显示图像。窗口默认值是CV_WINDOW_AUTOSIZE,那么显示图像原始大小。否则,根据图像的深度进行缩放显示。具体如下:

  • 如果载入的图像是8位无符号类型,就显示本来的样子。
  • 如果是16位无符号或32位整数,便用像素值除256.也就是说值的范围是[0, 256 * 256]映射到[0,255].
  • 如果图像是3位浮点型,像素值要乘以256.该值的范围[0,1]映射到[0,255]

1.5 关于InputArray类型
在core.hpp中有

typedef const _InputArray& InputArray;

遇到函数原型中的InputArray和OutputArray类型,我们把他们简单当成Mat类型即可。
2,下讲我们将讲图像的输出和滑动条,以及载入,显示,输出的实例。