OpenCV基础01

2023-09-10 22:31:54 浏览数 (1)

OpenCV C API

在本节中,我将向您介绍OpenCV C API的一些基本概念。这些概念将帮助您更轻松地理解和编写

头文件

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

代码语言:javascript复制
#include <opencv2/opencv.hpp>

命名空间

所有 OpenCV 类和函数都在 cv 命名空间中。因此,您必须执行以下操作之一

  • 在包含头文件之后添加使用命名空间 cv 例如 -
代码语言:javascript复制
#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:: 说明符
代码语言:javascript复制
#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 位无符号整数

注意:

  1. 您应该很明显以下 3 种数据类型完全相同。
    • CV_8U
  • CV_8UC1
  • CV_8UC(1)
  1. 尽管CV_32FC4是有效的数据类型,但CV_32FC5不是有效的数据类型。对于包含 4 个以上通道的阵列,应使用括号将通道号括起来。例如 - CV_32FC(5)。
  2. 某些 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.对于软件工程师,尤其是资深工程师,编程语言不应成为学习的障碍。

0 人点赞