Ink One

OpenCV 学习笔记(1)

图像的读取、显示以及保存。

OpenCV 模块介绍

这里只列出常用的几个模块。

  • core – 核心功能模块,包含以下内容:

    • OpenCV基本数据结构
    • 动态数据结构
    • 绘图函数
    • 数组操作相关函数
    • 辅助功能与系统函数和宏
    • 与OpenGL的互操作
  • highgui – 高层 GUI 图形用户界面,包含以下内容:

    • I/O 输入输出
    • 视频捕捉
    • 图像和视频的编码解码
    • 图形交互界面的接口
  • imgproc – Image Processing 的缩写,图像处理模块,包含以下内容:

    • 线性和非线性的图像滤波
    • 图像的几何变换
    • 其它(Miscellaneous)图像转换
    • 直方图相关
    • 结构分析和形状描述
    • 运动分析和对象跟踪
    • 特征检测
    • 目标检测

头文件和命名空间

在写简单的 OpenCV 程序时,可以采用如下的标准配置:

1
2
3
4
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
using namespace cv;

若需要使用 C++ 标准库命名空间 std,则可以加入:

1
#include <opencv2\opencv.hpp>

1
using namespace std;

Mat 类型

cv::Mat类是用于保存图像以及其他矩阵数据的数据结构。默认情况下,其尺寸为0,我们也可以指定初始尺寸,比如,比如定义一个Mat类对象,就要写

1
Mat img(240,320,CV_8U,Scalar(100));

成员函数 at(int y, int x) 可以用来存取图像元素,但是必须在编译时知道图像的数据类型,因为 cv::Mat 可以存放任意数据类型的元素。可以如下指定元素

1
img.at<uchar>(i,j) = 255;

图像的载入和显示

imread 载入图像

在官方文档中的定义为:

1
Mat imread(const string& filename, int flags=1)

参数说明

  • filename
    载入图像文件的路径名。如果图像文件不能被读取(由于文件丢失、缺少权限、不支持的格式),imread 函数返回一个空矩阵(Mat::data == NULL)。目前,Windows 系统下 imread 函数支持的格式有:

    • Windows 位图 - .bmp, .dib
    • JPEG 文件 - .jpeg, .jpg, *.jpe
    • JPEG 2000 文件 - *.jp2
    • PNG 文件 - *.png
    • 便携图像格式 - .pbm, .pgm, *.ppm
    • Sun rasters - .sr, .ras
    • TIFF 文件 - .tiff, .tif
  • flags
    flags 指定了加载图像的颜色类型,默认值为1。它的取值有

    • CV_LOAD_IMAGE_ANYDEPTH - 若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回。
    • CV_LOAD_IMAGE_COLOR - 转换图像到彩色图
    • CV_LOAD_IMAGE_GRAYSCALE - 转换图像到灰度图

    • >0 返回3通道图像

    • =0 返回灰度图
    • <0 返回包含 alpha 通道的加载图像

    *如果想要载入最真实的图像,选择 CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR

namedWindow 创建窗口

在官方文档中的定义为:

1
void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE)

参数说明

  • name
    窗口名称,亦被用作窗口标识符。

  • flags
    窗口的标识,默认值为 WINDOW_AUTOSIZE 。它的取值有

    • WINDOW_NORMAL - 用户可以改变窗口大小
    • WINDOW_AUTOSIZE - 窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小
    • WINDOW_OPENGL - 窗口创建的时候可支持OpenGL

函数说明
namedWindow 函数创建了一个可以作为图像和进度条的容器窗口,通过窗口名称来调用它。
如果具有相同名称的窗口已经存在,则函数不执行任何操作。
可以调用 destroyWindow(const string& winname) 或者destroyAllWindows() 函数来关闭窗口,并释放分配给窗口的内存空间。但是对于简单的程序,我们没有必要手动调用上述的函数,因为在退出时,所有的应用程序资源和窗口会被操作系统会自动关闭。

imshow 显示图像

在官方文档中的定义为:

1
void imshow(const string& winname, InputArray mat)

参数说明

  • winname
    显示图像的窗口名称
  • mat
    所显示的图像

函数说明
imshow 函数用于在指定的窗口中显示图像。如果窗口是用CV_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]。
    如果调用 imshow 函数前没有创建窗口,则创建一个标识为 CV_WINDOW_AUTOSIZE 的窗口。
    imshow 函数后总是应该调用 waitKey(int ms) 函数。否则,不会显示图像。waitKey(0) 将始终显示窗口直到有按键按下。

imwrite 保存图像到文件

在官方文档中的定义为:

1
bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>())

参数说明

  • filename
    保存文件名
  • img
    所要保存的图像
  • params
    特定格式编码的参数,默认值为 vector() 。可以取值如下:
    • 对于 JPEG 格式的图片,这个参数表示图片质量(CV_IMWRITE_JPEG_QUALITY),值越高图片质量越好。从0到100取值,默认值是95.
    • 对于 PNG 格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION),更高的值意味着更小的尺寸和更长的压缩时间。从0到9取值,默认值是3。
    • 对于PPM,PGM,或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,默认值是1。