学习一门新技术,首先要从宏观程度上了解,它提供了哪些能力,然后从基础入手,边学边积累。慢慢的也就对它不再陌生了。本篇讲述一下 OpenCV C++ 基础的 API,以便与后续的例子能够更好的理解。
引入头文件
当然第一步,是你的系统中要安装 OpenCV。导入 opencv2/opencv.hpp 到你的项目中,这是必须要导入的。
#include <opencv2/opencv.hpp>
命名空间
很多时候为了方便使用 API,我们会使用 OpenCV 为我们提供的命名空间(cv)。
#include <opencv2/opencv.hpp>
// 如果没有声明命名空间,那么在使用类时必须加上 cv::Mat
using namespace cv;
int main(int argc, char** argv)
{
Mat image = cv::imread("/User/xxx/Desktop/xxx.jpeg")
return 0;
}
图像的数据类型
你只需要记住,在 OpenCV 中用 Mat 来表示一个图像。一个图像用数组来表示,它定义了图像通道数,颜色深度。常见的单通道数据类型表示如下:
- CV_8U: 8 位的单通道无符号整数
- CV_8S: 8 位的单通道有符号整数
- CV_16U: 16 位单通道无符号整数
- CV_16S: 16 位单通道有符号整数
- CV_32S: 32 位有符号整数
- CV_32F: 32 位浮点型整数
- CV_64F: 64 位浮点型整数
拿 CV_8U 来说,它只有一个通道,每个元素用 8 位来表示(范围为 0 ~ 255)。单通道表示的是非黑即白的图像(像素为 0 为黑色, 255 为白色)。
OpenCV 支持最大 512 个通道数,多通道的表示方法如下:
- CV_8UC1: 等同于上面的 CV_8U
- CV_8UC2: 8 位无符号整数双通道数
- CV_8UC3: 8 位无符号整数3通道数
- CV_8UC4: 8 位无符号4通道数
- CV_8UC(n): 8 位无符号 n 通道数
当然其他类型的也是一样的写法,比如 CV_16SC3、CV_32FC4、CV_32FC(n)...
值得注意的是:CV_8UC5 这是错误的写法,超过 4 个通道以后,必须采用 CV_8UC(n) 这样的写法。
通过例子进一步说明:
- CV_8UC3 的表示
它表示有 3 个通道数,每个元素的用 8 位无符号整数表示(范围为 0 ~ 255)。因为是 3 通道,所以每一个像素需要用 3 个元素来表示。我相信大家应该对 RGB 图像不陌生,它就是 3 通道的最好例子。
如果采用 RGB 图像来表示,上面的图第一个像素应该为{54, 0, 34}, 第二个像素为{58, 78, 185} 以此类推。
- CV_8SC2
表示双通道,每个元素用 8 位的有符号整数来表示(范围为 -128 ~ 127)。所以它的每个像素用 2 个元素来表示。例如下面的图,第一个像素为{-85, -127}, 第二个为 {25, 23} 以此类推。
更多的例子,比如:
- Mat img1(3, 5, CV_32F): 创建的为 3 * 5 单通道图像,每个像素用 1 个元素的 32 位浮点数表示
- Mat img2(23, 50, CV_64FC(5)): 创建 23 * 50的 5 通道图像,每个像素用 5 个元素的 64 位浮点数表示
- Mat img3(Size(100, 200), CV_16UC2): 100 * 200 双通道图像,每个像素用 2 个元素的 16 的无符号整数表示
总结一下: 通道数即表示每个像素数组长度,8U/32F 表示的是元素的表示范围。
颜色深度
任何数字图像都由像素组成,像素的最小值为 0 表示黑色,像素增加时,该像素的强度也会增加。可以为像素分配的最大值取决于为每个像素分配的位数。比如为每个像素分配的位数为 8,该像素的最大值为 255(二进制为 11111111)。
图像深度就是指分配给每个像素的位数,如果为 8,则像素能表示的范围为0 ~ 255。
灰度图像
灰度图像的图像深度为 8 位,能表示的范围为 0 ~ 255.
从这幅图中可以得出:
- 图像深度为 8 位
- 图像为单通道
- 图像的高为 4 像素
- 图像的宽为 5 像素
- 图像的分辨率为 5 * 4
颜色图像
现实生活中,我们人眼看到的物体或多或少都有色彩。要想表示看到的图像,至少需要包括 3 个通道,即 Red、 Green 和 Blue。前面说过 3 个通道的图像表示为每个像素有 3 个元素组成。如下几个基础的图像。
- (255, 0, 0) 表示红色图像
- (0, 255, 0) 表示绿色图像
- (0, 0, 255) 表示蓝色图像
- (255, 0, 255) 表示紫色图像
根据上面的图,左上角(23, 231, 46)表示的应该是浅绿色图像,因为绿色的增量要大于 R(23) 和 B(46)。
关于上面的图像,它有如下信息:
- 图像深度为 24 bits(3 个 8 位 bit, 每个 8 位表示一个通道)
- 由 3 个通道组成
- 图像的高度为 4 像素
- 图像的宽度为 5 像素
- 图像分辨率为 5 * 4 像素
值得注意的是: 在 OpenCV 中采用的是 BGR 格式来读取图像。