1:OpenCV—图像基础

OpenCV教程

头文件

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

复制代码
#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 之间的像素值表示介于黑色和白色之间的颜色。

我们可以为多通道数组定义上述所有数据类型。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)
  2. 尽管CV_32FC4是有效的数据类型,但CV_32FC5不是有效的数据类型。对于包含 4 个以上通道的阵列,应使用括号将通道号括起来。例如 - CV_32FC(5)。

  3. 某些 OpenCV 函数只能处理上述数据类型的子集。因此,请在使用 OpenCV 函数之前阅读文档。

对图像深度和通道的一些见解

任何数字图像都由像素组成。每个像素都应该有一些价值。像素的最小值为 0,它表示黑色。当像素的值增加时,该像素的强度也会增加。可以为像素分配的最大值取决于为每个像素分配的位数。如果为每个像素分配的位数为 8,则该像素的最大值为 255(二进制11111111)

现在什么是图像的深度?**图像深度表示为每个像素分配的位数。如果为 8,则每个像素的值可以介于 0 和 255 之间。**如果为 4,则每个像素的值可以介于 0 到 15 之间(二进制为 1111)。

灰度图像

这是一个深度为 8 (2^8)位的图像的简单模型。每个小框代表一个像素。因此,每个框可能包含一个介于 0 到 255 之间的值。

这是上图的一些重要属性。

  • 图像深度为 8 位。
  • 图像由单通道组成。
  • 图像的高度为 4 像素。
  • 图像的宽度为 5 像素。
  • 此图像的分辨率为 5 x 4。

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

彩色图像

下图是彩色图像的简单模型。彩色图像应至少由 3 个平面组成;红色、绿色和蓝色。任何像素都是这三个值的组合。通过组合这 3 种基本颜色可以创建任何颜色。

例子

  • (255, 0, 0) 代表纯红色。 R
  • (0, 255, 0) 代表纯绿色。 G
  • (0, 0, 255) 表示纯蓝色。 B
  • (255,0,255) 代表纯违规。

在上图中,左上角像素为(23,231,46)。它将显示为绿色,因为该像素的绿色值 (231) 明显大于红色 (23) 和蓝色 (46) 值。

这是上图的一些重要属性。

  • 图像深度为 24 位。(因为每个像素用 8 x 3 位(每个通道 8 位)表示)
  • 图像由 3 个通道组成。
  • 图像的高度为 4 像素。
  • 图像的宽度为 5 像素。
  • 此图像的分辨率为 5 x 4。

注意-

OpenCV库函数通常读取BGR格式的图像,这意味着蓝色平面在前,绿色平面在后,红色平面在末尾,这与上述图像的顺序完全相反。

相关推荐
随缘而动,随遇而安1 小时前
第八十八篇 大数据中的递归算法:从俄罗斯套娃到分布式计算的奇妙之旅
大数据·数据结构·算法
美狐美颜sdk1 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
孞㐑¥1 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
DeepSeek-大模型系统教程1 小时前
推荐 7 个本周 yyds 的 GitHub 项目。
人工智能·ai·语言模型·大模型·github·ai大模型·大模型学习
郭庆汝1 小时前
pytorch、torchvision与python版本对应关系
人工智能·pytorch·python
IT古董1 小时前
【第二章:机器学习与神经网络概述】03.类算法理论与实践-(3)决策树分类器
神经网络·算法·机器学习
小雷FansUnion3 小时前
深入理解MCP架构:智能服务编排、上下文管理与动态路由实战
人工智能·架构·大模型·mcp
资讯分享周3 小时前
扣子空间PPT生产力升级:AI智能生成与多模态创作新时代
人工智能·powerpoint
水木兰亭4 小时前
数据结构之——树及树的存储
数据结构·c++·学习·算法
叶子爱分享4 小时前
计算机视觉与图像处理的关系
图像处理·人工智能·计算机视觉