OpenCV C++ API

1,681 阅读5分钟

学习一门新技术,首先要从宏观程度上了解,它提供了哪些能力,然后从基础入手,边学边积累。慢慢的也就对它不再陌生了。本篇讲述一下 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) 这样的写法。

通过例子进一步说明:

  1. CV_8UC3 的表示

它表示有 3 个通道数,每个元素的用 8 位无符号整数表示(范围为 0 ~ 255)。因为是 3 通道,所以每一个像素需要用 3 个元素来表示。我相信大家应该对 RGB 图像不陌生,它就是 3 通道的最好例子。

如果采用 RGB 图像来表示,上面的图第一个像素应该为{54, 0, 34}, 第二个像素为{58, 78, 185} 以此类推。

  1. 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 格式来读取图像。