OpenCV C++内常用API


在本节中,我将介绍OpenCV C ++ API的一些基本概念。 这些概念将帮助你更轻松地理解和编写本教程中的OpenCV C ++示例程序。

头文件


你只需要在程序中包含opencv2/opencv.hpp头文件。 该头文件将包含应用程序的所有其他必需头文件。 因此,你无需再考虑应该为你的程序包含哪些头文件。

例:
#include <opencv2/opencv.hpp>


命名空间

所有OpenCV类和函数都在cv名称空间中。 我建议添加using namespace cv; 在include之后的行(我在本教程的所有示例程序中都使用了此方法)

例:
#include <opencv2/opencv.hpp> 
using namespace cv;
 
int main(int argc, char** argv) 
{ 
 // Read the image file 
 Mat image = imread("D:/My OpenCV Website/Eagle.jpg"); 
 return 0; 
}


要不然呢你就必须在每个在源代码中的每个OpenCV类,函数和数据结构的开头附加cv::符。

例:
#include <opencv2/opencv.hpp> 

int main(int argc, char** argv) 
{ 
 // Read the image file 
 cv::Mat image = cv::imread("D:/My OpenCV Website/Eagle.jpg"); 
 return 0; 
}


数组(矩阵)的数据类型


数组的数据类型定义了通道数、为每个元素所分配的位数以及如何使用这些位数表示元素的值。如果数组表示的是图像,数组的每个元素则表示的是图像的像素。

任何单通道数组都应属于以下数据类型之一。
CV_8U8位无符号整数
CV_8S8位有符号整数
CV_16U16位无符号整数
CV_16S16位有符号整数
CV_32S32位有符号整数
CV_32F32位浮点数
CV_64F64位浮点浮点数

这里我举例说明了一个数组类型为CV_8U的数组。它有一个频道。通道中的每个元素都是8位无符号整数。因此,每个元素的值范围应为0到255。单通道阵列也就是黑白(灰度)图像(像素值0表示黑色,255表示白色。0到255之间的像素值表示黑色和白色之间的颜色。)


数组类型为CV_8U的数组


我们可以为多通道数组定义所有上述数据类型。OpenCV最多支持512个通道。在这里,我将向您展示如何为多通道数组定义CV_8U数据类型。

同样的,你也可以使用任何其他单通道数据类型创建多通道数据类型。(例如: CV_16SC3,CV_32FC4,CV_64FC(27)等)

例1:

这里我举例说明了一个数组类型为CV_8UC3的数组。它有3个频道。每个通道中的每个元素都是8位无符号整数。因此,每个元素的值范围应为0到255。因为这是一个3通道数组,所以数组由具有3个元素的元组组成。第一个元组是{54,0,34},第二个元组是{58,78,185},依此类推。3通道阵列的常见类比示例是BGR图像,其由蓝色,绿色和红色通道组成。

数组类型为CV_8U3的数组


例2:

这里我举例说明了一个数组类型为CV_8SC2的数组。它有2个频道。每个通道中的每个元素都是8位有符号整数。因此,每个元素的值范围应为-128到127。因为这是一个2通道数组,所以数组由具有2个元素的元组组成。第一个元组是{-85,-127},第二个元组是{25,23},依此类推。

数组类型为CV_8SC2的数组


cv::Mat矩阵用法示例



备注:
  1. 阅读本文后,你应该明白以下3种数据类型完全相同。
    • CV_8U
    • CV_8UC1
    • CV_8UC(1)

  2. 虽然CV_32FC4是有效的数据类型,但CV_32FC5不是有效的数据类型。对于包含4个以上通道的数组,应使用括号括起通道编号。例如: CV_32FC(5)。
  3. 一些OpenCV函数只能处理上述数据类型的子集。因此,在使用OpenCV函数之前,建议先阅读文档。

图像深度和通道基本知识


任何数字图像都由像素组成。每个像素都应该有一些价值。像素的最小值为0并且它代表黑色。当像素的值增加时,该像素的强度也增加。像素的最大值取决于为每个像素所分配的位数。如果每个像素分配的位数为8 bit,该像素的最大值则为255(二进制为11111111) 什么是图像深度?图像深度指的是为每个像素所分配的比特数(位数)。如果是8,则每个像素的值可以在0到255之间。如果是4,则每个像素的值可以在0到15之间(二进制为1111)。

灰度图像


以下是一个深度为8位的图像模型。每个小方框代表一个像素。每个框可能包含0到255之间的值。

深度为8的灰度图

以下是上图中的一些重要属性。

这是个灰度图像(黑白),因为它仅由单个通道组成。因此,此图像不包含任何颜色信息。如果此像素的值较高,则会显示更亮。如果该值较低,则会显示更暗。

彩色图像


下图是彩色图像的模型。彩色图像应至少包含3个通道:蓝色、绿色和红色。任何像素都是这三个值的组合。通过组合这3种基本颜色可以创建任何颜色。

例:
 (255, 0, 0)代表纯红色。
 (0, 255 ,0)代表纯绿色。
 (0, 0, 255)代表纯蓝色。
 (255, 0, 255)代表纯紫色。


彩色图由B、G、R通道组成

以下是上图中的一些重要属性。

请特别注意,虽然一般我们称RGB空间(即颜色通道排法为R、G、B通道),但是OpenCV内默认的确实BGR空间(也就是说颜色通道的排法有别于RGB空间,即排法为B、G、R通道)