OpenCV中有许多常用的数据类型

本文详细介绍了OpenCV中常用的8种数据类型,包括cv::Mat(图像矩阵)、cv::Point(二维点)、cv::Rect(矩形区域)、cv::Size(尺寸)、cv::Scalar(多通道数据)、cv::Vec(向量,包括单精度和双精度浮点数及整数向量)以及cv::KeyPoint(关键点)和cv::DMatch(特征匹配结果)。文章概述了这些数据类型的基本概念、用法和操作,展示了它们在图像处理中的重要作用。
摘要由CSDN通过智能技术生成

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 对象到另一个对象,实现深拷贝。

  1. cv::Mat imageCopy = image.clone();:这行代码创建了一个名为 imageCopy 的新的 cv::Mat 对象,并将其初始化为原始图像 image 的副本。clone() 函数会复制整个图像数据,并创建一个新的独立的 cv::Mat 对象,两个对象之间没有共享数据。这意味着对 imageCopy 的修改不会影响原始图像 image

  2. cv::Mat imageCopy2; image.copyTo(imageCopy2);:这两行代码实现了将一个 cv::Mat 对象复制到另一个对象 imageCopy2copyTo() 函数会将原始图像 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 类有以下几种数据类型:

  1. cv::Point_<int>: 表示二维平面上的整数坐标点。它包含 x 和 y 两个整数成员变量。

  2. cv::Point2f 或 cv::Point_<float>: 表示二维平面上的浮点数坐标点。它包含 x 和 y 两个浮点数成员变量。

  3. cv::Point2d 或 cv::Point_<double>: 表示二维平面上的双精度浮点数坐标点。它包含 x 和 y 两个双精度浮点数成员变量。

  4. cv::Point2i 或 cv::Point_<int>: 表示二维平面上的整数坐标点。它包含 x 和 y 两个整数成员变量。

  5. cv::Point3f 或 cv::Point3_<float>: 表示三维空间中的浮点数坐标点。它包含 xy 和 z 三个浮点数成员变量。

  6. cv::Point3d 或 cv::Point3_<double>: 表示三维空间中的双精度浮点数坐标点。它包含 xy 和 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 类的详细解释如下:

  1. 成员变量:

    • x: 矩形左上角的 x 坐标(整数)。
    • y: 矩形左上角的 y 坐标(整数)。
    • width: 矩形的宽度(整数)。
    • height: 矩形的高度(整数)。
  2. 构造函数:

    • Rect(): 默认构造函数,创建一个未初始化的矩形对象,左上角坐标为 (0,0),宽度和高度为 0。
    • Rect(int x, int y, int width, int height): 构造函数,根据指定的左上角坐标、宽度和高度创建矩形对象。
  3. 成员函数:

    • 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 中用于表示尺寸和矩形区域的类,它们有一些区别和不同的用途。

  1. cv::Size:表示对象或区域的尺寸,包含宽度和高度,以整数值表示。cv::Size 是一个简单的尺寸类,用于表示宽度和高度这两个维度上的尺寸信息。它可以用于描述图像、窗口、区域等的大小,但不包含位置信息。宽度和高度的值是独立的,没有与特定坐标相关联。

  2. cv::Rect:表示矩形区域,由矩形左上角的坐标和宽度、高度组成。cv::Rect 是一个矩形区域类,用于表示具有位置和大小信息的矩形区域。它包含了矩形左上角的坐标(x 和 y)以及矩形的宽度和高度(width 和 height)。通过这些信息,可以确定矩形在图像或其他坐标系统中的位置和大小。

总结:

  • cv::Size 主要用于描述对象或区域的尺寸,只包含宽度和高度信息,没有位置信息。
  • cv::Rect 用于描述矩形区域,除了包含宽度和高度信息外,还包含了矩形左上角的坐标信息,可以确定矩形在坐标系统中的位置。

五、 cv::Scalar:用于表示多通道数据,例如颜色值,包含一个或多个数值。

cv::Scalar 是 OpenCV 中用于表示多通道数据的类,通常用于表示颜色。它可以包含一个或多个数值,每个数值对应一个通道。cv::Scalar 类的详细解释如下:

  1. 成员变量:

    • val[4]:一个长度为4的数组,用于存储多个数值。数组的大小取决于通道的数量。
  2. 构造函数:

    • 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 对象。
  3. 成员函数:

    • operator[](int i): 重载下标运算符,用于访问 val 数组中的元素。

cv::Scalar 类提供了一种方便的方式来表示多通道数据,特别适用于表示颜色。每个数值对应一个通道,可以表示像素的红、绿、蓝(RGB)分量或其他类型的多通道数据。cv::Scalar 对象可以通过构造函数创建,并且可以直接访问其中的数值。该类的设计使得它可以与其他 OpenCV 函数和类一起使用,用于处理多通道数据,如图像处理、颜色空间转换、图像绘制等任务。

需要注意的是,cv::Scalar 类的大小取决于通道数,不同的 OpenCV 版本可能对通道数有不同的限制。通常,它可以包含1到4个数值,对应于1到4个通道。在使用时,应根据实际需求选择合适的通道数和数值。

六、cv:: Vec解释

  1. cv::Vec2fcv::Vec3fcv::Vec4f

    • cv::Vec2f 表示一个包含两个浮点数的向量。
    • cv::Vec3f 表示一个包含三个浮点数的向量。
    • cv::Vec4f 表示一个包含四个浮点数的向量。
  2. cv::Vec2icv::Vec3icv::Vec4i

    • cv::Vec2i 表示一个包含两个整数的向量。
    • cv::Vec3i 表示一个包含三个整数的向量。
    • cv::Vec4i 表示一个包含四个整数的向量。
  3. cv::Vec2dcv::Vec3dcv::Vec4d

    • cv::Vec2d 表示一个包含两个双精度浮点数的向量。
    • cv::Vec3d 表示一个包含三个双精度浮点数的向量。
    • cv::Vec4d 表示一个包含四个双精度浮点数的向量。

这些向量类提供了一种方便的方式来表示和操作具有固定数量元素的向量数据。它们可以存储和访问不同类型的元素,如浮点数、整数和双精度浮点数。这些向量类通常用于表示像素的颜色值、坐标点、尺寸和其他具有固定元素数量的数据。

与其他 OpenCV 类的关系如下:

  • cv::Matcv::Mat 是 OpenCV 中用于表示矩阵的类。它可以包含任意数量的行和列,并且可以用于存储和处理各种类型的数据,包括向量。向量类(如 cv::Vec2fcv::Vec3i 等)可以作为 cv::Mat 的元素类型,从而可以在矩阵中存储和操作向量数据。
  • cv::Pointcv::Point 是 OpenCV 中用于表示二维坐标点的类。它实际上是 cv::Point_ 类的别名,其中 _ 表示点的数据类型(例如 cv::Point2fcv::Point2i 等)。cv::Point 类可以包含两个元素,分别表示 x 和 y 坐标。cv::Vec2icv::Vec2f 等向量类可以用于表示和操作二维坐标点。
  • cv::Rectcv::Rect 是 OpenCV 中用于表示矩形区域的类,由矩形左上角的坐标和宽度、高度组成。与向量类不同,cv::Rect 类具有特定的含义和功能,用于表示和操作矩形区域的位置和尺寸。
  • cv::Sizecv::Size 是 OpenCV 中用于表示对象或区域尺寸的类,由宽度和高度组成。与向量类不同,cv::Size 类只关注尺寸信息,而不包含位置或坐标信息。
  • cv::Scalarcv::Scalar 是 OpenCV 中用于表示多通道数据的类,通常用于表示颜色。它可以包含一个或多个数值,每个数值对应一个通道。与向量类不同,cv::Scalar 类主要用于表示和操作颜色值等多通道数据。

这些类可以根据具体的需求选择使用,用于表示和操作不同类型的数据,如图像、向量、点、矩形和尺寸等。它们在 OpenCV 中提供了方便的数据结构,以便进行图像处理、计算机视觉和图形操作等任务。

cv::Vec 是 OpenCV 中用于表示固定大小的向量的模板类。它可以表示包含固定数量元素的向量,每个元素可以是不同的数据类型(例如整数、浮点数等)。

cv::Vec 的模板参数包括两个部分:元素类型和元素数量。例如,cv::Vec<float, 3> 表示一个包含三个浮点数的向量,cv::Vec<int, 4> 表示一个包含四个整数的向量。

cv::Vec 类提供了以下功能:

  1. 成员变量:val[n],其中 n 是向量的元素数量。val 是一个数组,用于存储向量的元素值。

  2. 构造函数:cv::Vec<T, n>() 是默认构造函数,创建一个未初始化的向量对象。cv::Vec<T, n>(v0, v1, ...) 是带有初始值的构造函数,创建一个包含指定初始值的向量对象。

  3. 成员函数:operator[] 是重载的下标运算符,用于访问向量的元素。

通过使用 cv::Vec,可以创建并操作固定大小的向量。它在表示和处理像素颜色、坐标点、特征向量等数据时非常有用。此外,cv::Vec 还可以与其他 OpenCV 函数和类一起使用,例如在图像处理、计算机视觉和图形操作中。

需要注意的是,cv::Vec 是一个模板类,它在编译时会根据指定的元素类型和元素数量生成具体的向量类。这意味着不同的 cv::Vec 实例是不兼容的,即使它们具有相同的元素类型和数量。例如,cv::Vec<float, 3> 和 cv::Vec<float, 4> 是不同的类型,不能直接进行赋值或比较操作。

 

 

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值