OpenCV中有许多常用的数据类型,以下是其中一些常见的数据类型:
cv::Mat:用于表示图像和矩阵的类。
cv::Point:用于表示二维平面上的点,包含 x 和 y 坐标。
cv::Rect:用于表示矩形区域,包含左上角的点和矩形的宽度和高度。
cv::Size:用于表示尺寸,包含宽度和高度。
cv::Scalar:用于表示多通道数据,例如颜色值,包含一个或多个数值。
cv::Vec2f、cv::Vec3f、cv::Vec4f:用于表示浮点数的向量,分别包含2、3、4个浮点数。
cv::Vec2i、cv::Vec3i、cv::Vec4i:用于表示整数的向量,分别包含2、3、4个整数。
cv::Vec2d、cv::Vec3d、cv::Vec4d:用于表示双精度浮点数的向量,分别包含2、3、4个双精度浮点数。
cv::KeyPoint:用于表示图像中的关键点,包含关键点的坐标、尺度和方向等信息。
cv::DMatch:用于表示特征匹配的结果,包含匹配的特征点索引和距离等信息。
详细解释每个数据类型
一、cv::Mat
是 OpenCV 中用于表示图像和矩阵的类。它提供了一个灵活的多维数组结构,可以存储像素值或其他数值数据,并且支持各种常见的图像处理和矩阵操作。
以下是 cv::Mat
常用的用法和操作:
(1)创建 cv::Mat
对象:
cv::Mat image; // 创建一个空的 Mat 对象
cv::Mat image(rows, cols, type); // 创建指定行数、列数和数据类型的 Mat 对象
cv::Mat image(size, type); // 创建指定尺寸和数据类型的 Mat 对象
cv::Mat image(rows, cols, type, scalar); // 创建指定行数、列数、数据类型和初始值的 Mat 对象
```
(2)访问和操作 cv::Mat
中的像素值:
// 读取像素值
cv::Scalar pixel = image.at<cv::Scalar>(row, col);// 修改像素值
image.at<cv::Scalar>(row, col) = cv::Scalar(b, g, r);//访问mat对象的scalar,
//也就是访问指定位置point处的scalar内容,在图像中对应的内容就是像素值
```
(3)获取图像的属性:
int rows = image.rows; // 获取图像的行数
int cols = image.cols; // 获取图像的列数
int channels = image.channels(); // 获取图像的通道数
int type = image.type(); // 获取图像的数据类型
```
(4)复制和赋值 cv::Mat
对象
cv::Mat imageCopy = image.clone(); // 复制一个 Mat 对象
cv::Mat imageCopy2;
image.copyTo(imageCopy2); // 将一个 Mat 对象复制到另一个 Mat 对象
```这两行代码用于复制一个
cv::Mat
对象到另一个对象,实现深拷贝。
cv::Mat imageCopy = image.clone();
:这行代码创建了一个名为imageCopy
的新的cv::Mat
对象,并将其初始化为原始图像image
的副本。clone()
函数会复制整个图像数据,并创建一个新的独立的cv::Mat
对象,两个对象之间没有共享数据。这意味着对imageCopy
的修改不会影响原始图像image
。
cv::Mat imageCopy2; image.copyTo(imageCopy2);
:这两行代码实现了将一个cv::Mat
对象复制到另一个对象imageCopy2
。copyTo()
函数会将原始图像image
的数据复制到imageCopy2
中,并创建一个新的独立的cv::Mat
对象,两个对象之间没有共享数据。与使用clone()
相似,这样复制的对象之间的修改互不影响。这两种方法都实现了对
cv::Mat
对象的复制,但使用的语法略有不同。clone()
函数将复制的对象作为函数的返回值返回,可以直接赋值给一个新的变量。而copyTo()
函数需要提供要复制到的目标对象作为参数。这些复制操作对于需要对图像进行并行处理、避免共享数据引起的竞争条件、或者简单地创建一个独立的图像副本以供后续操作使用时非常有用。
(5) 转换图像的数据类型:
cv::Mat imageFloat;
image.convertTo(imageFloat, CV_32F); // 将图像转换为指定的数据类型
```
(6) 加载和保存图像:
cv::Mat image = cv::imread("image.jpg"); // 加载图像
cv::imwrite("output.jpg", image); // 保存图像
```
(7)对图像进行常见的处理操作,如绘制图形、调整大小、转换颜色空间和滤波等。
二、cv::Point
类解释
cv::Point
是坐标值,成员变量为.x,.y,.z。可以通过成员变量访问和赋值。
(1)cv::Point
类有以下几种数据类型:
-
cv::Point_<int>
: 表示二维平面上的整数坐标点。它包含x
和y
两个整数成员变量。 -
cv::Point2f
或cv::Point_<float>
: 表示二维平面上的浮点数坐标点。它包含x
和y
两个浮点数成员变量。 -
cv::Point2d
或cv::Point_<double>
: 表示二维平面上的双精度浮点数坐标点。它包含x
和y
两个双精度浮点数成员变量。 -
cv::Point2i
或cv::Point_<int>
: 表示二维平面上的整数坐标点。它包含x
和y
两个整数成员变量。 -
cv::Point3f
或cv::Point3_<float>
: 表示三维空间中的浮点数坐标点。它包含x
、y
和z
三个浮点数成员变量。 -
cv::Point3d
或cv::Point3_<double>
: 表示三维空间中的双精度浮点数坐标点。它包含x
、y
和z
三个双精度浮点数成员变量。
这些不同的数据类型允许使用不同的数值精度来表示点的坐标。根据具体的应用需求和数据类型的选择,可以使用适当的 cv::Point
类型来表示和操作二维或三维空间中的点。
cv::Point pt;//通过默认构造函数创建一个点对象,
//这将创建一个未初始化的点对象,坐标值默认为 (0,0)。
cv::Point ht(x, y);//新的声明
//这将创建一个点对象,并将 x 和 y 坐标分别设置为指定的值。
//使用成员变量直接访问和修改坐标值:
ht.x = new_x;
ht.y = new_y;//进行点的操作和计算
cv::Point sum = pt1 + pt2;
cv::Point diff = pt1 - pt2;cv::Point scaled = pt * scale_factor;
cv::Point translated = pt + cv::Point(trans_x, trans_y);//点的距离计算:
double distance = cv::norm(pt1 - pt2);
//这行代码使用了 OpenCV 中的
cv::norm()
函数来计算两个点pt1
和pt2
之间的欧氏距离。//欧氏距离是最常用的距离度量方式,它衡量两点之间的直线距离。
//对于二维平面上的点,欧氏距离的计算公式为:
distance = sqrt((x2 - x1)^2 + (y2 - y1)^2);
//其中
(x1, y1)
和(x2, y2)
分别是点pt1
和pt2
的坐标。//在这行代码中,
pt1 - pt2
表示两个点的坐标差,即(pt1.x - pt2.x, pt1.y - pt2.y)
。//然后,
cv::norm()
函数接收这个坐标差作为参数,计算并返回这两个点之间的欧氏距离,//并将结果赋值给
double
类型的变量distance
。//通过这行代码,可以方便地计算出两个点之间的欧氏距离,
//用于距离度量、相似性比较、特征匹配等图像处理和计算机视觉任务中的应用。
三、 cv::Rect
:表示矩形区域。它由矩形左上角的坐标和宽度、高度组成。
cv::Rect
是 OpenCV 中用于表示矩形区域的类。它由矩形左上角的坐标和宽度、高度组成。cv::Rect
类的详细解释如下:
成员变量:
x
: 矩形左上角的 x 坐标(整数)。y
: 矩形左上角的 y 坐标(整数)。width
: 矩形的宽度(整数)。height
: 矩形的高度(整数)。构造函数:
Rect()
: 默认构造函数,创建一个未初始化的矩形对象,左上角坐标为 (0,0),宽度和高度为 0。Rect(int x, int y, int width, int height)
: 构造函数,根据指定的左上角坐标、宽度和高度创建矩形对象。成员函数:
area()
: 返回矩形的面积,即宽度乘以高度。empty()
: 判断矩形是否为空,即宽度或高度是否为 0。contains(Point pt)
: 判断给定的点是否在矩形范围内。contains(int x, int y)
: 判断给定的坐标是否在矩形范围内。tl()
: 返回矩形的左上角坐标(cv::Point
类型)。br()
: 返回矩形的右下角坐标(cv::Point
类型)。
cv::Rect
类提供了一种方便的方式来表示和操作矩形区域。通过使用矩形的左上角坐标、宽度和高度,可以定义和描述矩形区域的位置和尺寸。cv::Rect
类的成员变量和成员函数使得可以轻松地创建矩形对象、计算矩形的面积、判断点或坐标是否在矩形内部,并获取矩形的角点坐标。这些功能对于图像处理、计算机视觉和计算机图形学中的对象定位、区域选择、裁剪等任务非常有用。
四、 cv::Size
:表示对象或区域的尺寸。它包含宽度和高度,以整数值表示。
cv::Size
和cv::Rect
是 OpenCV 中用于表示尺寸和矩形区域的类,它们有一些区别和不同的用途。
cv::Size
:表示对象或区域的尺寸,包含宽度和高度,以整数值表示。cv::Size
是一个简单的尺寸类,用于表示宽度和高度这两个维度上的尺寸信息。它可以用于描述图像、窗口、区域等的大小,但不包含位置信息。宽度和高度的值是独立的,没有与特定坐标相关联。
cv::Rect
:表示矩形区域,由矩形左上角的坐标和宽度、高度组成。cv::Rect
是一个矩形区域类,用于表示具有位置和大小信息的矩形区域。它包含了矩形左上角的坐标(x
和y
)以及矩形的宽度和高度(width
和height
)。通过这些信息,可以确定矩形在图像或其他坐标系统中的位置和大小。总结:
cv::Size
主要用于描述对象或区域的尺寸,只包含宽度和高度信息,没有位置信息。cv::Rect
用于描述矩形区域,除了包含宽度和高度信息外,还包含了矩形左上角的坐标信息,可以确定矩形在坐标系统中的位置。
五、 cv::Scalar:用于表示多通道数据,例如颜色值,包含一个或多个数值。
cv::Scalar
是 OpenCV 中用于表示多通道数据的类,通常用于表示颜色。它可以包含一个或多个数值,每个数值对应一个通道。cv::Scalar
类的详细解释如下:
成员变量:
val[4]
:一个长度为4的数组,用于存储多个数值。数组的大小取决于通道的数量。构造函数:
Scalar()
: 默认构造函数,创建一个未初始化的cv::Scalar
对象。Scalar(double v0)
: 构造函数,创建一个包含一个数值的cv::Scalar
对象。Scalar(double v0, double v1)
: 构造函数,创建一个包含两个数值的cv::Scalar
对象。Scalar(double v0, double v1, double v2)
: 构造函数,创建一个包含三个数值的cv::Scalar
对象。Scalar(double v0, double v1, double v2, double v3)
: 构造函数,创建一个包含四个数值的cv::Scalar
对象。成员函数:
operator[](int i)
: 重载下标运算符,用于访问val
数组中的元素。
cv::Scalar
类提供了一种方便的方式来表示多通道数据,特别适用于表示颜色。每个数值对应一个通道,可以表示像素的红、绿、蓝(RGB)分量或其他类型的多通道数据。cv::Scalar
对象可以通过构造函数创建,并且可以直接访问其中的数值。该类的设计使得它可以与其他 OpenCV 函数和类一起使用,用于处理多通道数据,如图像处理、颜色空间转换、图像绘制等任务。需要注意的是,
cv::Scalar
类的大小取决于通道数,不同的 OpenCV 版本可能对通道数有不同的限制。通常,它可以包含1到4个数值,对应于1到4个通道。在使用时,应根据实际需求选择合适的通道数和数值。
六、cv:: Vec解释
cv::Vec2f
,cv::Vec3f
,cv::Vec4f
:
cv::Vec2f
表示一个包含两个浮点数的向量。cv::Vec3f
表示一个包含三个浮点数的向量。cv::Vec4f
表示一个包含四个浮点数的向量。
cv::Vec2i
,cv::Vec3i
,cv::Vec4i
:
cv::Vec2i
表示一个包含两个整数的向量。cv::Vec3i
表示一个包含三个整数的向量。cv::Vec4i
表示一个包含四个整数的向量。
cv::Vec2d
,cv::Vec3d
,cv::Vec4d
:
cv::Vec2d
表示一个包含两个双精度浮点数的向量。cv::Vec3d
表示一个包含三个双精度浮点数的向量。cv::Vec4d
表示一个包含四个双精度浮点数的向量。这些向量类提供了一种方便的方式来表示和操作具有固定数量元素的向量数据。它们可以存储和访问不同类型的元素,如浮点数、整数和双精度浮点数。这些向量类通常用于表示像素的颜色值、坐标点、尺寸和其他具有固定元素数量的数据。
与其他 OpenCV 类的关系如下:
cv::Mat
:cv::Mat
是 OpenCV 中用于表示矩阵的类。它可以包含任意数量的行和列,并且可以用于存储和处理各种类型的数据,包括向量。向量类(如cv::Vec2f
、cv::Vec3i
等)可以作为cv::Mat
的元素类型,从而可以在矩阵中存储和操作向量数据。cv::Point
:cv::Point
是 OpenCV 中用于表示二维坐标点的类。它实际上是cv::Point_
类的别名,其中_
表示点的数据类型(例如cv::Point2f
、cv::Point2i
等)。cv::Point
类可以包含两个元素,分别表示 x 和 y 坐标。cv::Vec2i
、cv::Vec2f
等向量类可以用于表示和操作二维坐标点。cv::Rect
:cv::Rect
是 OpenCV 中用于表示矩形区域的类,由矩形左上角的坐标和宽度、高度组成。与向量类不同,cv::Rect
类具有特定的含义和功能,用于表示和操作矩形区域的位置和尺寸。cv::Size
:cv::Size
是 OpenCV 中用于表示对象或区域尺寸的类,由宽度和高度组成。与向量类不同,cv::Size
类只关注尺寸信息,而不包含位置或坐标信息。cv::Scalar
:cv::Scalar
是 OpenCV 中用于表示多通道数据的类,通常用于表示颜色。它可以包含一个或多个数值,每个数值对应一个通道。与向量类不同,cv::Scalar
类主要用于表示和操作颜色值等多通道数据。这些类可以根据具体的需求选择使用,用于表示和操作不同类型的数据,如图像、向量、点、矩形和尺寸等。它们在 OpenCV 中提供了方便的数据结构,以便进行图像处理、计算机视觉和图形操作等任务。
cv::Vec
是 OpenCV 中用于表示固定大小的向量的模板类。它可以表示包含固定数量元素的向量,每个元素可以是不同的数据类型(例如整数、浮点数等)。
cv::Vec
的模板参数包括两个部分:元素类型和元素数量。例如,cv::Vec<float, 3>
表示一个包含三个浮点数的向量,cv::Vec<int, 4>
表示一个包含四个整数的向量。
cv::Vec
类提供了以下功能:
成员变量:
val[n]
,其中n
是向量的元素数量。val
是一个数组,用于存储向量的元素值。构造函数:
cv::Vec<T, n>()
是默认构造函数,创建一个未初始化的向量对象。cv::Vec<T, n>(v0, v1, ...)
是带有初始值的构造函数,创建一个包含指定初始值的向量对象。成员函数:
operator[]
是重载的下标运算符,用于访问向量的元素。通过使用
cv::Vec
,可以创建并操作固定大小的向量。它在表示和处理像素颜色、坐标点、特征向量等数据时非常有用。此外,cv::Vec
还可以与其他 OpenCV 函数和类一起使用,例如在图像处理、计算机视觉和图形操作中。需要注意的是,
cv::Vec
是一个模板类,它在编译时会根据指定的元素类型和元素数量生成具体的向量类。这意味着不同的cv::Vec
实例是不兼容的,即使它们具有相同的元素类型和数量。例如,cv::Vec<float, 3>
和cv::Vec<float, 4>
是不同的类型,不能直接进行赋值或比较操作。
文章来源地址https://www.toymoban.com/news/detail-803336.html文章来源:https://www.toymoban.com/news/detail-803336.html
到了这里,关于OpenCV中有许多常用的数据类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!