OpenCV C API
在本节中,我将向您介绍OpenCV C API的一些基本概念。这些概念将帮助您更轻松地理解和编写
头文件
您只需要在程序中包含 opencv2/opencv.hpp 头文件。该头文件将包含应用程序的所有其他必需头文件。因此,您不再需要费心考虑程序应包含哪些头文件。 例如
代码语言:javascript复制#include <opencv2/opencv.hpp>
命名空间
所有 OpenCV 类和函数都在 cv 命名空间中。因此,您必须执行以下操作之一
- 在包含头文件之后添加使用命名空间 cv 例如 -
#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_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 表示白色。介于 0 和 255 之间的像素值表示介于黑色和白色之间的颜色。
1111 1111 0~255
数据类型为CV_8U的数组 |
我们可以为多通道数组定义上述所有数据类型。OpenCV支持多达512个通道。在这里,我将向您展示如何定义多通道数组CV_8U数据类型。
- CV_8UC1 - 具有 8 位无符号整数的单通道数组,与 CV_8U 完全相同
- CV_8UC2 - 2 个通道数组,带 8 位无符号整数
- CV_8UC3 - 3 个通道数组,带 8 位无符号整数
- CV_8UC4 - 4 个通道数组,带 8 位无符号整数
- CV_8UC(n) - 具有 8 位无符号整数的 n 通道数组(n 可以从 1 到 512) )
同样,您可以使用任何其他单渠道数据类型派生多通道数据类型。(例如 - CV_16SC3、CV_32FC4、CV_64FC(27) 等)
示例 1:
在这里,我说明了一个数据类型为 CV_8UC3 的数组。它有3个通道。每个通道中的每个元素都是 8 位无符号整数。因此,每个元素的值范围应介于 0 到 255 之间。因为这是一个 3 通道数组,所以数组由具有 3 个元素的元组组成。第一个元组是 {54, 0, 34},第二个元组是 {58, 78, 185},依此类推。3通道阵列的一个常见类比示例是由红色,绿色和蓝色通道组成的RGB图像。
数据类型CV_8UC3的数组 |
示例 2:
在这里,我说明了一个数据类型为 CV_8SC2 的数组。它有2个通道。每个通道中的每个元素都是 8 位有符号整数。因此,每个元素的值范围应为 -128 到 127。因为这是一个 2 通道数组,所以数组由具有 2 个元素的元组组成。第一个元组是 {-85, -127},第二个元组是 {25, 23},依此类推。
数据类型CV_8SC2的数组 |
示例用法 :
- Mat img1(3, 5, CV_32F );创建具有 3 位浮点数的 5 x 32 单通道数组
- Mat img2(23, 53, CV_64FC(5) );创建具有 23 位浮点数的 53 x 5 64 通道数组
- Mat img3(尺寸(100, 200), CV_16UC2 );100 x 200 2 通道数组,带 16 位无符号整数
注意:
- 您应该很明显以下 3 种数据类型完全相同。
- CV_8U
- CV_8UC1
- CV_8UC(1)
- 尽管CV_32FC4是有效的数据类型,但CV_32FC5不是有效的数据类型。对于包含 4 个以上通道的阵列,应使用括号将通道号括起来。例如 - CV_32FC(5)。
- 某些 OpenCV 函数只能处理上述数据类型的子集。因此,请在使用 OpenCV 函数之前阅读文档。
对图像深度和通道的一些见解
任何数字图像都由像素组成。每个像素都应该有一些价值。像素的最小值为 0,它表示黑色。当像素的值增加时,该像素的强度也会增加。可以为像素分配的最大值取决于为每个像素分配的位数。如果为每个像素分配的位数为 8,则该像素的最大值为 255(二进制11111111)
现在什么是图像的深度?**图像深度表示为每个像素分配的位数。如果为 8,则每个像素的值可以介于 0 和 255 之间。**如果为 4,则每个像素的值可以介于 0 到 15 之间(二进制为 1111)。
灰度图像
这是一个深度为 8 (2^8)位的图像的简单模型。每个小框代表一个像素。因此,每个框可能包含一个介于 0 到 255 之间的值。
深度为 8 的灰度图像 |
这是上图的一些重要属性。
- 图像深度为 8 位。
- 图像由单通道组成。
- 图像的高度为 4 像素。
- 图像的宽度为 5 像素。
- 此图像的分辨率为 5 x 4。
这是一个灰度图像(黑白图像),因为它只包含一个通道。因此,此图像不包含任何颜色信息。如果此像素的值更高,则会显示得更亮。如果该值较低,则会显示得更暗。
彩色图像
下图是彩色图像的简单模型。彩色图像应至少由 3 个平面组成;红色、绿色和蓝色。任何像素都是这三个值的组合。通过组合这 3 种基本颜色可以创建任何颜色。
例子
- (255, 0, 0) 代表纯红色。 R
- (0, 255, 0) 代表纯绿色。 G
- (0, 0, 255) 表示纯蓝色。 B
- (255,0,255) 代表纯违规。
彩色图像的 R、G、B 平面 |
在上图中,左上角像素为(23,231,46)。它将显示为绿色,因为该像素的绿色值 (231) 明显大于红色 (23) 和蓝色 (46) 值。
这是上图的一些重要属性。
- 图像深度为 24 位。(因为每个像素用 8 x 3 位(每个通道 8 位)表示)
- 图像由 3 个通道组成。
- 图像的高度为 4 像素。
- 图像的宽度为 5 像素。
- 此图像的分辨率为 5 x 4。
注意-
OpenCV库函数通常读取BGR格式的图像,这意味着蓝色平面在前,绿色平面在后,红色平面在末尾,这与上述图像的顺序完全相反。
【小结】
在这里,我们结合C 这门编程语言来学习OpenCV.对于软件工程师,尤其是资深工程师,编程语言不应成为学习的障碍。