简介
- OpenCV 常见类,函数
OpenCV cv::flip() 函数 详解
cv::flip()
函数是 OpenCV 库中的一个函数,用于执行图像的翻转操作。该函数可以在水平、垂直或两个方向上翻转图像。下面是对 cv::flip()
函数的详解:
函数原型
1 | void cv::flip( |
参数说明
src
:输入图像。dst
:输出图像,翻转后的结果将存储在这里。flipCode
:翻转操作的类型。可以是以下几种值之一:0
:沿 x 轴翻转(垂直翻转)。1
:沿 y 轴翻转(水平翻转)。-1
:同时沿 x 轴和 y 轴翻转。
功能
cv::flip()
函数用于对输入图像进行翻转操作。翻转操作可以是水平翻转、垂直翻转或同时在水平和垂直方向上进行翻转。翻转后的结果将存储在输出图像 dst
中。
注意事项
- 输入图像和输出图像的尺寸和数据类型相同。
- 如果需要在原地进行翻转操作(即输入图像和输出图像是同一个),可以将
src
和dst
设置为相同的图像。
示例
1 | cv::Mat src = cv::imread("input.jpg", cv::IMREAD_COLOR); |
在这个示例中,src
是一个输入的图像,通过 cv::flip()
函数将其进行水平翻转,翻转后的结果存储在 flippedImage
中。
cv::flip()
函数是 OpenCV 中用于执行图像翻转操作的常用函数之一,它在图像处理中广泛用于数据增强、镜像反射等应用场景。
OpenCV cv::findChessboardCorners() 函数 详解
cv::findChessboardCorners()
是 OpenCV(开源计算机视觉库)中的一个函数,用于在图像中找到棋盘格图案的内部角点。这个函数通常用于摄像机校准和计算机视觉应用,以确定棋盘格校准图案的角点位置,这对于摄像机校准非常重要。
以下是对 cv::findChessboardCorners()
函数的详细解释:
1 | bool cv::findChessboardCorners( |
参数:
image
:这是要在其中查找棋盘格角点的输入图像。通常应该是灰度图像,但也可以是彩色图像。patternSize
:此参数指定了棋盘格图案的大小。它应该是一个Size
对象,包含了棋盘格图案的行和列上的内部角点数量。corners
:这是一个输出参数,函数会将找到的角点位置存储在其中。通常是一个包含2D点的向量(例如std::vector<cv::Point2f>
)。flags
:可选参数,可用于指定各种操作标志。默认标志(CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE
)适用于大多数情况。这些标志控制函数如何处理图像。
返回值:
如果成功找到棋盘格角点,则函数返回 true
,否则返回 false
。
cv::findChessboardCorners()
的工作原理:
该函数分析输入图像以检测棋盘格图案的内部角点。
它使用自适应阈值技术对图像进行二值化并查找角点。
找到角点后,它将它们存储在
corners
输出向量中。patternSize
参数帮助函数确定棋盘格图案的期望大小和布局,从而更容易找到角点。
用法:
通常,您将在摄像机校准过程的一部分中使用此函数,其中您从不同角度和距离捕获棋盘格图案的多幅图像。通过在这些图像中找到角点,您可以计算摄像机的内部和外部参数。
以下是如何使用 cv::findChessboardCorners()
的基本示例:
1 | cv::Mat image = cv::imread("chessboard.png", cv::IMREAD_GRAYSCALE); |
这个函数是摄像机校准的关键步骤,通常用于需要准确了解摄像机参数的计算机视觉应用中。
C++ OpenCV cv::ellipse() 函数 详解
cv::ellipse()
函数是OpenCV中用于绘制椭圆的函数。它允许您在图像上绘制椭圆,可以用于标记或可视化图像中的对象或区域。以下是cv::ellipse()
函数的详解:
1 | void cv::ellipse( |
参数解释:
image
:输入的图像,通常是拍摄的包含了棋盘格的图像。patternSize
:一个cv::Size
对象,指定了棋盘格的内部角点的行和列数,通常为(num_cols, num_rows)
。corners
:用于输出检测到的角点坐标的cv::OutputArray
。这是一个包含检测到的角点的 2D 坐标的向量。flags
:可选参数,用于指定不同的标志位以控制检测的方式。常用的标志包括:cv::CALIB_CB_ADAPTIVE_THRESH
:使用自适应阈值方法。cv::CALIB_CB_NORMALIZE_IMAGE
:在角点检测之前归一化图像。cv::CALIB_CB_FAST_CHECK
:执行快速检查以排除不合格的图像。
返回值:
- 如果成功检测到棋盘格角点,函数返回
true
,否则返回false
。
使用示例:
1 | cv::Mat image = cv::imread("chessboard.jpg"); |
cv::findChessboardCorners()
函数的主要用途是用于相机标定,以便校正图像畸变。检测到的角点可以用于计算相机的内部和外部参数,以及图像的校正和畸变校正。通常,使用棋盘格图像进行标定是摄影测量和计算机视觉中的一个重要步骤。
1 |
|
上述示例创建了一个400x400的白色背景图像,在其中绘制了一个蓝色的椭圆。您可以根据需要调整参数以满足您的绘制需求。
Mat operator()( const Rect& roi ) const 详解
cv::Mat
类中的 operator()(const Rect& roi) const
是一个用于提取感兴趣区域(Region of Interest,ROI)的运算符重载。它允许你根据给定的矩形区域来创建一个新的 cv::Mat
对象,其中包含了原始图像中该矩形区域的像素数据。以下是这个运算符重载的详细解释:
1 | cv::Mat cv::Mat::operator()(const cv::Rect& roi) const; |
参数说明:
roi
:一个cv::Rect
对象,表示感兴趣区域的位置和大小。
运算符重载的返回值是一个新的 cv::Mat
对象,其中包含了原始图像中指定感兴趣区域的像素数据。
使用示例:
1 |
|
在上述示例中,我们首先读取了一张图像,然后定义了一个 cv::Rect
对象 roiRect
,表示感兴趣区域的位置和大小。接着,我们使用运算符重载 image(roiRect)
来提取图像中指定的感兴趣区域,并将其存储在 roi
中。最后,我们显示了这个感兴趣区域。这个运算符重载使得提取感兴趣区域变得非常方便,可以快速获取图像的子区域进行进一步处理。
cv::Mat::setTo() 函数 详解
cv::Mat::setTo()
函数用于将图像中的所有像素设置为指定的值或颜色。这个函数非常有用,可以用来创建具有特定像素值的图像,或者将图像的所有像素设置为某个常数值。以下是 cv::Mat::setTo()
函数的详解:
1 | void cv::Mat::setTo(const Scalar& value, const Mat& mask = Mat()); |
参数说明:
value
:要设置的像素值,通常是一个cv::Scalar
对象,表示图像的颜色或强度。例如,如果你想将图像设置为纯黑色,可以使用cv::Scalar(0, 0, 0)
。mask
:可选参数,一个与输入图像相同大小的掩码图像,用于指定哪些像素应该被设置为指定的值。只有在掩码图像中对应的像素值为非零时,对应的目标图像像素才会被设置。默认情况下,没有掩码。
使用示例:
1 |
|
在上述示例中,我们首先创建了一个空的彩色图像,然后使用 setTo()
函数将整个图像设置为纯蓝色。接下来,我们创建了一个掩码图像,只有中心区域的像素才会被修改。最后,我们使用掩码将中心部分的像素设置为绿色。这是一个简单示例,演示了如何使用 cv::Mat::setTo()
函数来设置图像的像素值。
cv::resize() 函数 详解
cv::resize()
函数用于调整图像或图像区域的大小。你可以使用它来缩小或放大图像,或者将图像裁剪到指定的尺寸。以下是 cv::resize()
函数的详解:
1 | void cv::resize( |
参数说明:
src
:输入图像,可以是cv::Mat
或其他支持的图像数据结构。dst
:输出图像,可以是cv::Mat
或其他支持的图像数据结构。它将包含调整大小后的图像。dsize
:目标图像的大小,以cv::Size
对象表示,指定为目标宽度和高度。fx
:沿水平轴的缩放因子。如果为0,则根据垂直缩放因子fy
来确定输出大小。fy
:沿垂直轴的缩放因子。如果为0,则根据水平缩放因子fx
来确定输出大小。interpolation
:插值方法,用于在调整大小时估算像素值。可以选择以下插值方法之一:INTER_NEAREST
:最近邻插值(速度最快,但质量较差)INTER_LINEAR
:双线性插值(默认,速度适中,质量较好)INTER_CUBIC
:双三次插值(速度较慢,质量较好)INTER_LANCZOS4
:Lanczos插值(速度较慢,质量最好)
使用示例:
1 |
|
上述示例将读取一张图像,将其调整为指定的目标大小,然后显示原始图像和调整大小后的图像。你可以根据需要选择不同的插值方法和目标大小。
cv::convexHull
在 OpenCV 中,cv::convexHull()
函数用于计算一个给定点集的凸包。凸包是包含给定点集中所有点的最小凸多边形。以下是关于 cv::convexHull()
函数的详细解释:
函数签名:
1 | cv::convexHull(InputArray points, OutputArray hull, bool clockwise = false, bool returnPoints = true) |
参数:
points
:输入的点集,可以是cv::Mat
、cv::Mat_<T>
、cv::vector<Point>
等。hull
:计算出的凸包点集。clockwise
:指定计算的凸包是否按逆时针方向排列。returnPoints
:如果为true
,函数将返回凸包的点集;如果为false
,函数将返回凸包的索引。
返回值:
- 函数没有返回值。凸包的点集或索引存储在
hull
参数中。
示例:
以下示例演示了如何使用 cv::convexHull()
函数计算一组点的凸包:
1 |
|
在上述示例中,我们创建了一个点集 points
,并使用 convexHull()
函数计算了这些点的凸包。然后,我们使用绘图函数绘制了原始点和凸包的边界。
运行示例代码后,你将在窗口中看到原始点和计算出的凸包。你可以根据需要调整点的坐标,了解函数的不同参数和用法,以适应你的实际需求。
cv::RotatedRect::points() 函数 详解
cv::RotatedRect::points()
是 OpenCV 中 cv::RotatedRect
类的一个成员函数,用于获取旋转矩形的四个顶点坐标。以下是对 cv::RotatedRect::points()
函数的详细解释:
函数原型:
1 | void cv::RotatedRect::points(cv::Point2f pts[]) const |
函数功能:cv::RotatedRect::points()
函数用于获取一个旋转矩形的四个顶点坐标,并将这些坐标存储在提供的数组 pts
中。旋转矩形是由中心点、宽度、高度和旋转角度定义的,它可以是在任意角度下旋转的矩形。
参数:
pts
:一个大小为4的cv::Point2f
数组,用于存储旋转矩形的四个顶点坐标。数组应该在调用函数之前分配好空间。
返回值:
函数没有返回值,它直接将四个顶点的坐标存储在提供的数组 pts
中。
示例用法:
以下是一个使用 cv::RotatedRect::points()
函数的示例代码:
1 |
|
在上面的示例中,我们首先创建了一个 cv::RotatedRect
对象,然后使用 cv::RotatedRect::points()
函数获取了该旋转矩形的四个顶点坐标。最后,我们遍历数组 points
,输出每个顶点的坐标。
总之,cv::RotatedRect::points()
函数是一个方便的函数,用于获取旋转矩形的四个顶点坐标,这对于后续的绘制和分析操作非常有用。
cv::Size2i::area() 函数 详解
cv::Size2i
是OpenCV中用于表示二维大小的类,其中cv::Size2i::area()
是一个成员函数,用于计算这个二维大小的面积。以下是对cv::Size2i::area()
函数的详细解释:
函数原型:
1 | int cv::Size2i::area() const |
函数功能:cv::Size2i::area()
函数用于计算表示二维大小的cv::Size2i
对象的面积。对于cv::Size2i
对象,面积等于其宽度(width
)乘以高度(height
)。
参数:
该函数没有参数,因为它是一个成员函数,作用于cv::Size2i
对象本身。
返回值:
函数返回一个整数,表示cv::Size2i
对象的面积。
示例用法:
下面是一个使用cv::Size2i::area()
函数的示例代码:
1 |
|
在上面的示例中,我们创建了一个cv::Size2i
对象,然后使用cv::Size2i::area()
函数计算了其面积。面积的计算结果是对象的宽度和高度的乘积。
总而言之,cv::Size2i::area()
函数是OpenCV中用于计算cv::Size2i
对象面积的方便函数,它直接返回对象宽度和高度的乘积。
cv::fillPoly() 函数 详解
cv::fillPoly()
函数是 OpenCV 库中的一个函数,用于在图像上填充指定的多边形区域。
以下是关于 cv::fillPoly()
函数的详细解释:
函数签名:函数的签名如下:
1
2
3
4
5
6
7void cv::fillPoly(
InputOutputArray img,
InputArrayOfArrays pts,
const Scalar &color,
int lineType = LINE_8,
int shift = 0,
Point offset = Point());参数:
img
:要填充的图像。pts
:多边形的顶点集合,可以是一个包含cv::Point
的std::vector
,也可以是cv::Mat
。color
:填充的颜色,类型为cv::Scalar
,表示 BGR 通道的颜色值。lineType
:线段的类型,默认为LINE_8
,表示8连通线段。shift
:坐标的小数部分位数,默认为0。offset
:坐标的偏移,默认为Point()
。
功能:
- 该函数用于在图像上填充一个或多个多边形区域,根据给定的多边形顶点集合和颜色进行填充。
- 填充的多边形可以是简单多边形,也可以是包含洞的多边形。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15cv::Mat image(300, 300, CV_8UC3, cv::Scalar(0, 0, 0));
std::vector<cv::Point> polygon;
polygon.push_back(cv::Point(50, 50));
polygon.push_back(cv::Point(150, 50));
polygon.push_back(cv::Point(150, 150));
polygon.push_back(cv::Point(50, 150));
std::vector<std::vector<cv::Point>> polygons;
polygons.push_back(polygon);
cv::fillPoly(image, polygons, cv::Scalar(0, 255, 0));
cv::imshow("Filled Image", image);
cv::waitKey(0);注意事项:
pts
参数接受一个包含多个多边形的顶点集合,因此你可以一次性填充多个多边形。- 该函数会直接在输入图像上进行填充操作,所以确保图像的尺寸和类型与所需操作匹配。
总之,cv::fillPoly()
函数是用于在图像上填充多边形区域的函数。通过提供多边形的顶点集合和填充颜色,你可以在图像中创建各种填充区域,用于可视化和图像处理。
cv::Mat::ptr() 函数 详解
cv::Mat::ptr()
函数是 OpenCV 库中 cv::Mat
类的一个成员函数,用于获取指定行的指针,从而允许对图像或矩阵数据进行低级别的访问和操作。
以下是关于 cv::Mat::ptr()
函数的详细解释:
函数签名:函数的签名如下:
1
uchar* cv::Mat::ptr(int i = 0);
参数:
i
:指定要获取指针的行数(默认为0),即行的索引。行索引从0开始。
返回值:
- 返回一个
uchar*
类型的指针,指向指定行的数据。这个指针可以用于低级别的数据访问操作。
- 返回一个
功能:
- 该函数用于获取指定行的指针,允许你对图像或矩阵数据进行低级别的访问和操作。通过获取指针,你可以在不使用高级 OpenCV 函数的情况下,直接读取和修改像素值。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);
if (!image.empty()) {
int row = 100;
uchar* ptr = image.ptr(row);
for (int col = 0; col < image.cols; ++col) {
uchar blue = ptr[col * 3]; // Blue channel
uchar green = ptr[col * 3 + 1]; // Green channel
uchar red = ptr[col * 3 + 2]; // Red channel
}
}注意事项:
- 通过
cv::Mat::ptr()
获取的指针可以用于访问指定行的像素数据。如果你需要访问其他通道的像素值,你需要根据通道数进行适当的偏移。 - 注意确保访问的像素在图像范围内,以避免越界访问。
- 通过
总之,cv::Mat::ptr()
函数是用于获取指定行的指针,从而允许你对图像或矩阵数据进行低级别的访问和操作。这对于一些特定的图像处理任务可能会很有用,但需要小心越界访问。
cv::Mat::ptr() 函数 详解
cv::Mat::ptr<uint16_t>()
函数是 OpenCV 库中 cv::Mat
类的一个成员函数的模板化版本,用于获取指定行的指针,并将指针的数据类型设置为 uint16_t
,从而允许对图像或矩阵数据进行低级别的访问和操作,特别适用于 uint16_t
类型的像素数据。
以下是关于 cv::Mat::ptr<uint16_t>()
函数的详细解释:
函数签名:函数的签名如下:
1
uint16_t* cv::Mat::ptr<uint16_t>(int i = 0);
参数:
i
:指定要获取指针的行数(默认为0),即行的索引。行索引从0开始。
返回值:
- 返回一个
uint16_t*
类型的指针,指向指定行的数据。这个指针可以用于低级别的数据访问操作。
- 返回一个
功能:
- 该函数用于获取指定行的指针,并将指针的数据类型设置为
uint16_t
,允许你对图像或矩阵数据进行低级别的访问和操作。通过获取指针,你可以在不使用高级 OpenCV 函数的情况下,直接读取和修改像素值。
- 该函数用于获取指定行的指针,并将指针的数据类型设置为
示例:
1
2
3
4
5
6
7
8
9
10
11cv::Mat depth_image = cv::imread("depth_image.png", cv::IMREAD_ANYDEPTH);
if (!depth_image.empty() && depth_image.depth() == CV_16U) {
int row = 100;
uint16_t* ptr = depth_image.ptr<uint16_t>(row);
for (int col = 0; col < depth_image.cols; ++col) {
uint16_t depth_value = ptr[col];
}
}注意事项:
- 通过
cv::Mat::ptr<uint16_t>()
获取的指针可以用于访问指定行的像素数据,数据类型为uint16_t
。确保图像的深度为CV_16U
,以匹配数据类型。 - 注意确保访问的像素在图像范围内,以避免越界访问。
- 通过
总之,cv::Mat::ptr<uint16_t>()
函数是用于获取指定行的指针,并将数据类型设置为 uint16_t
,允许你对图像或矩阵数据进行低级别的访问和操作。这对于访问 uint16_t
类型的像素数据非常有用,但需要小心越界访问。
cv::pointPolygonTest() 函数 详解
cv::pointPolygonTest()
函数是 OpenCV 库中的一个函数,用于计算一个点与一个多边形之间的关系,即点相对于多边形的内部、外部还是在多边形的边界上。
以下是关于 cv::pointPolygonTest()
函数的详细解释:
函数签名:函数的签名如下:
1
2
3
4double cv::pointPolygonTest(
InputArray contour,
Point2f pt,
bool measureDist);参数:
contour
:表示多边形的轮廓的输入数组。可以是一个std::vector<cv::Point>
,也可以是一个cv::Mat
。pt
:要测试的点的坐标,类型为cv::Point2f
。measureDist
:一个布尔值,表示是否要计算点到多边形边界的距离。如果为true
,函数将返回点到多边形的距离;如果为false
,函数将只返回点相对于多边形的关系(内部、外部或边界)。
返回值:
- 如果
measureDist
参数为false
,返回值的含义如下:- 正数:点在多边形内部。
- 零:点在多边形的边界上。
- 负数:点在多边形外部。
- 如果
measureDist
参数为true
,返回值表示点到多边形边界的有符号距离。距离为正数表示点在多边形内部,为零表示点在多边形边界上,为负数表示点在多边形外部。
- 如果
功能:
- 该函数用于计算一个点与一个多边形之间的关系。它可以确定点相对于多边形的位置,以及点到多边形边界的距离(可选)。
示例:
1
2
3
4
5
6
7
8
9
10
11
12std::vector<cv::Point> contour = {cv::Point(50, 50), cv::Point(200, 50), cv::Point(200, 200), cv::Point(50, 200)};
cv::Point2f point(100, 100);
double distance = cv::pointPolygonTest(contour, point, true);
if (distance > 0) {
std::cout << "Point is inside the polygon." << std::endl;
} else if (distance == 0) {
std::cout << "Point is on the polygon boundary." << std::endl;
} else {
std::cout << "Point is outside the polygon." << std::endl;
}注意事项:
- 如果你只关心点相对于多边形的关系而不需要距离信息,可以将
measureDist
参数设置为false
,以提高性能。 - 多边形的轮廓必须是闭合的,并且点的坐标应在
float
或double
类型的范围内。
- 如果你只关心点相对于多边形的关系而不需要距离信息,可以将
总之,cv::pointPolygonTest()
函数是用于计算点与多边形之间关系的函数,可以判断点是否在多边形内部、外部或边界上,并可以计算点到多边形边界的距离。
cv::Mat::atcv::Vec3b() 函数 详解
cv::Mat::at<cv::Vec3b>()
函数是 OpenCV 库中 cv::Mat
类的一个成员函数,用于访问图像或矩阵中特定位置的像素值。在这个函数中,cv::Vec3b
是一个表示三通道(BGR 或 RGB)像素值的数据类型。
以下是关于 cv::Mat::at<cv::Vec3b>()
函数的详细解释:
函数签名:函数的签名如下:
1
cv::Vec3b& cv::Mat::at<cv::Vec3b>(int row, int col);
参数:
row
:像素所在的行数(y 坐标)。col
:像素所在的列数(x 坐标)。
返回值:
- 返回一个引用(
cv::Vec3b&
)到指定位置的像素值。cv::Vec3b
表示一个三通道的像素,例如(B, G, R)
或(R, G, B)
。
- 返回一个引用(
功能:
- 该函数用于访问图像或矩阵中指定位置的像素值。返回的引用允许你读取或修改像素的通道值。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15cv::Mat image = cv::imread("image.jpg");
if (!image.empty()) {
int row = 100;
int col = 150;
cv::Vec3b pixel = image.at<cv::Vec3b>(row, col);
uchar blue = pixel[0];
uchar green = pixel[1];
uchar red = pixel[2];
std::cout << "Pixel at (" << col << ", " << row << "): "
<< "B: " << int(blue) << " G: " << int(green) << " R: " << int(red) << std::endl;
}注意事项:
cv::Vec3b
表示三通道像素值,它的索引是[0]
、[1]
和[2]
分别表示蓝色、绿色和红色通道。但需要注意,OpenCV 中的图像默认使用 BGR 顺序。
总之,cv::Mat::at<cv::Vec3b>()
函数是用于访问图像或矩阵中指定位置的三通道像素值的函数。通过该函数,你可以方便地读取和修改图像的像素值,并进行各种图像处理操作。
cv::circle
在 OpenCV 中,cv::circle
是一个用于在图像上绘制圆的函数。这个函数可以用来绘制一个圆,或者在图像上绘制多个圆。
函数原型如下:
1 | void cv::circle(cv::InputOutputArray img, cv::Point center, int radius, const cv::Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); |
函数参数解释:
img
: 输入/输出图像,可以是单通道或多通道图像。center
:cv::Point
类型的参数,表示圆心的坐标。radius
: 圆的半径。color
: 绘制圆的颜色,可以使用cv::Scalar
类来表示颜色。thickness
: 圆边界的宽度(线条粗细),默认值为 1。lineType
: 圆边界的类型,可以是LINE_8
(8 连通线)或LINE_AA
(反锯齿线)。shift
: 坐标值的小数位数,通常为 0。
下面是一个示例代码,演示了如何使用 cv::circle
函数绘制圆:
1 |
|
在这个示例中,我们创建了一个黑色的图像,然后使用 cv::circle
函数绘制了一个红色的圆,圆心为 (200, 150)
,半径为 50。
cv::circle
函数在图像绘制中非常有用,可以用于标记、可视化、边缘检测结果显示等多种情况。可以通过调整参数来控制圆的颜色、半径和边界样式。
cv::Rect
在 OpenCV 中,cv::Rect
是一个用于表示矩形的类。它通常用于图像处理和计算机视觉中,用于表示图像中的感兴趣区域(ROI),或者用于描述物体的边界框。
cv::Rect
的定义位于 opencv2/core.hpp
头文件中,其结构如下:
1 | class Rect { |
这个类有以下几个构造函数和成员变量:
Rect()
: 默认构造函数,会将矩形的属性初始化为默认值。Rect(int x, int y, int width, int height)
: 构造函数,传入矩形的左上角坐标、宽度和高度。Rect(const Rect& r)
: 复制构造函数,用于创建一个已有矩形的副本。x
和y
: 整数类型的成员变量,表示矩形左上角的 x 和 y 坐标。width
和height
: 整数类型的成员变量,表示矩形的宽度和高度。
下面是一个示例代码,演示了如何使用 cv::Rect
类:
1 |
|
cv::Rect
类在许多图像处理和计算机视觉任务中非常有用,特别是在需要表示感兴趣区域、物体的边界框等情况。它可以帮助您存储和操作矩形的属性,以及在图像处理中进行相关操作,例如提取感兴趣区域、绘制边界框等。
cv::line
在 OpenCV 中,cv::line
是一个用于在图像上绘制直线的函数。这个函数可以用来绘制一条连接两个点的直线,或者在图像上绘制多条直线。
函数原型如下:
1 | void cv::line(cv::InputOutputArray img, cv::Point pt1, cv::Point pt2, const cv::Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); |
函数参数解释:
img
: 输入/输出图像,可以是单通道或多通道图像。pt1
和pt2
: 两个cv::Point
类型的参数,表示直线的起点和终点。color
: 绘制直线的颜色,可以使用cv::Scalar
类来表示颜色。thickness
: 直线的宽度(线条粗细),默认值为 1。lineType
: 直线的类型,可以是LINE_8
(8 连通线)或LINE_AA
(反锯齿直线)。shift
: 坐标值的小数位数,通常为 0。
下面是一个示例代码,演示了如何使用 cv::line
函数绘制直线:
1 |
|
在这个示例中,我们创建了一个黑色的图像,然后使用 cv::line
函数在图像上绘制了一条红色的直线,连接了起点 (50, 100)
和终点 (350, 200)
。
cv::line
函数在图像绘制中非常有用,可以用于标记、可视化、边缘检测结果显示等多种情况。可以通过调整参数来控制直线的颜色、宽度和类型。
cv::Size
在 OpenCV 中,cv::Size
是一个用于表示大小(尺寸)的类。它通常用于图像处理和计算机视觉中,用于表示图像的宽度和高度,或者表示其他物体、区域的尺寸。
cv::Size
的定义位于 opencv2/core.hpp
头文件中,其结构如下:
1 | class Size { |
这个类有以下几个构造函数和成员变量:
Size()
: 默认构造函数,会将宽度和高度初始化为 0。Size(int width, int height)
: 构造函数,传入宽度和高度。Size(const Size& sz)
: 复制构造函数,用于创建一个已有尺寸的副本。width
和height
: 整数类型的成员变量,分别表示尺寸的宽度和高度。
下面是一个示例代码,演示了如何使用 cv::Size
类:
1 |
|
cv::Size
类在许多图像处理和计算机视觉任务中非常有用,特别是在需要表示图像的大小、物体的尺寸等情况。它可以帮助您存储和操作尺寸信息,以及在图像处理中进行相关操作,例如调整图像大小、计算物体的尺寸等。
cv::Point2f
在 OpenCV 中,cv::Point2f
是一个用于表示二维浮点坐标点的类。它是 cv::Point
的变体,其中坐标值使用浮点数而不是整数表示。cv::Point2f
类通常用于图像处理和计算机视觉中,特别是在需要使用浮点坐标来表示像素位置、图像上的点、图像中的特征点等情况。
cv::Point2f
的定义位于 opencv2/core/types.hpp
头文件中,其结构如下:
1 | class Point2f { |
这个类有以下几个构造函数和成员变量:
Point2f()
: 默认构造函数,会将坐标点初始化为 (0, 0)。Point2f(float x, float y)
: 构造函数,传入 x 和 y 坐标值。Point2f(const Point2f& pt)
: 复制构造函数,用于创建一个已有点的副本。x
和y
: 浮点数类型的成员变量,表示点的 x 和 y 坐标。
下面是一个示例代码,演示了如何使用 cv::Point2f
类:
1 |
|
cv::Point2f
类在许多情况下都非常有用,特别是当需要使用浮点坐标来精确表示像素位置、特征点位置等时。它是 OpenCV 中基本的数据结构之一,用于处理图像中的点和坐标。
cv::RotatedRect
在 OpenCV 中,cv::RotatedRect
是一个用于表示旋转矩形的类。旋转矩形是一个带有角度的矩形,通常用于表示在图像中检测到的旋转物体的边界框。
cv::RotatedRect
的定义位于 opencv2/core/types.hpp
头文件中,其结构如下:
1 | class RotatedRect { |
这个类有以下几个构造函数和成员变量:
RotatedRect()
: 默认构造函数,会将旋转矩形的属性初始化为默认值。RotatedRect(const Point2f& center, const Size2f& size, float angle)
: 构造函数,传入旋转矩形的中心坐标、尺寸和角度。
成员变量解释:
center
: 一个Point2f
类型的成员变量,表示旋转矩形的中心坐标。size
: 一个Size2f
类型的成员变量,表示旋转矩形的宽度和高度。angle
: 一个浮点数,表示旋转矩形的角度,单位为度。
下面是一个示例代码,演示了如何使用 cv::RotatedRect
类:
1 |
|
cv::RotatedRect
类在许多图像处理和计算机视觉任务中非常有用,特别是在需要表示旋转物体的边界框时。它可以帮助您存储和操作旋转矩形的属性,以及在图像中进行相关操作,例如绘制旋转矩形、计算旋转矩形的边界框等。
cv::Point
在 OpenCV 库中,cv::Point
是一个用于表示二维坐标点的类。它通常用于图像处理和计算机视觉中,用于表示像素位置、图像上的点、图像中的特征点等。
cv::Point
的定义位于 opencv2/core.hpp
头文件中,其结构如下:
1 | class Point { |
这个类有以下几个构造函数和成员变量:
Point()
: 默认构造函数,会将坐标点初始化为 (0, 0)。Point(int x, int y)
: 构造函数,传入 x 和 y 坐标值。Point(const Point& pt)
: 复制构造函数,用于创建一个已有点的副本。x
和y
: 整数类型的成员变量,表示点的 x 和 y 坐标。
下面是一个示例代码,演示了如何使用 cv::Point
类:
1 |
|
cv::Point
类在许多情况下都非常有用,例如在图像上标记特定位置、表示特征点、进行坐标计算等。它是 OpenCV 中基本的数据结构之一,用于处理图像中的点和坐标。
cv::Scalar
cv::Scalar
是 OpenCV 库中的一个类,用于表示一个包含四个分量的向量,通常用于表示颜色、像素值等。这四个分量可以分别表示蓝色、绿色、红色和透明度(BGR-A)。
这个类在图像处理中经常用于设置颜色、像素值等。每个分量都是一个双精度浮点数,通常取值范围是 0 到 255,表示一个 8 位无符号整数值的颜色分量。
下面是一个简单的例子,演示了如何使用 cv::Scalar
来创建颜色以及像素值:
1 |
|
需要注意的是,这里提供的颜色顺序是 BGR,与一般人们常见的 RGB 顺序不同。另外,如果不需要使用透明度,可以忽略透明度分量。
cv::Scalar
通常用于填充矩形、绘制文本、设置像素值等场景,方便地表示颜色和值。在图像处理和计算机视觉领域中,cv::Scalar
是一个很有用的工具,使颜色和值的处理变得简单且易于理解。
cv::Mat
简介:
- cv::Mat 是 OpenCV 库中表示图像和矩阵的核心数据结构之一。它是一个多维数组,可以存储和操作图像、矩阵和其他类型的数据
原型:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48class Mat {
public:
// 构造函数
Mat();
Mat(int rows, int cols, int type);
Mat(Size size, int type);
Mat(int rows, int cols, int type, const Scalar& scalar);
Mat(Size size, int type, const Scalar& scalar);
Mat(const Mat& m);
// 数据访问
int rows;
int cols;
int type();
int channels();
int depth();
size_t elemSize();
size_t elemSize1();
bool empty();
void release();
Mat clone() const;
Mat& operator=(const Mat& m);
Mat operator()(const Range& rowRange, const Range& colRange) const;
Mat row(int y) const;
Mat col(int x) const;
Mat rowRange(int startrow, int endrow) const;
Mat colRange(int startcol, int endcol) const;
Mat reshape(int cn, int rows = 0) const;
// 数据操作
void create(int rows, int cols, int type);
void create(Size size, int type);
void convertTo(Mat& m, int rtype, double alpha = 1, double beta = 0) const;
void copyTo(Mat& m) const;
void copyTo(Mat& m, const Mat& mask) const;
void assignTo(Mat& m, int type = -1) const;
void swap(Mat& m);
Mat& setTo(const Scalar& scalar, const Mat& mask = Mat());
Mat& setTo(const Scalar& scalar, const Mat& mask);
Mat reshape(int cn, int newndims, const int* newsz) const;
// 图像加载和保存
static Mat imread(const String& filename, int flags = IMREAD_COLOR);
bool imwrite(const String& filename, const std::vector<int>& params = std::vector<int>()) const;
// 其他函数和操作符重载
// ...
};详解:
- cv::Mat 的主要特点和功能包括
- 多维数组表示:cv::Mat 可以表示多维数组,如二维图像(矩阵)和三维图像(彩色图像)等。
- 数据访问:可以通过 rows 和 cols 成员变量获取矩阵的行数和列数,通过 at 成员函数或数组索引操作符 [] 来访问和修改矩阵中的元素。
- 数据操作:可以对 cv::Mat 执行各种数据操作,如创建矩阵、复制矩阵、转换数据类型、调整大小、提取子矩阵等
- 图像加载和保存:通过 imread 和 imwrite 函数可以加载和保存图像文件
- 运算符重载:cv::Mat 支持许多运算符重载,如加法、减法、乘法等,以及与其他 cv::Mat 对象之间的操作
- cv::Mat 的主要特点和功能包括
注:
- 需要注意的是,cv::Mat 的默认构造函数创建了一个空的矩阵对象,必须使用 create 函数来分配内存空间并指定矩阵的大小和数据类型
- 使用 cv::Mat,你可以进行各种图像处理和计算机视觉任务,如图像加载、图像处理、特征提取、模式识别等。了解和熟悉 cv::Mat 的功能和使用方法是使用 OpenCV 进行图像处理和计算机视觉开发的基础。你可以参考 OpenCV 官方文档和示例代码,深入学习关于 cv::Mat 的更多信息和用法
cv::imread
简介:
- cv::imread() 是 OpenCV 库中用于读取图像文件的函数。它接受图像文件的路径作为输入,并返回一个表示图像的 cv::Mat 对象
原型:
1
cv::Mat cv::imread(const cv::String& filename, int flags = cv::IMREAD_COLOR);
参数:
- filename:图像文件的路径
- flags(可选):指定读取图像的方式,默认值为 cv::IMREAD_COLOR。可以使用以下标志来指定读取图像的颜色模式
- cv::IMREAD_COLOR:读取彩色图像(默认值)
- cv::IMREAD_GRAYSCALE:将图像以灰度模式读取
- cv::IMREAD_UNCHANGED:以原始图像的包含 alpha 通道的方式读取
返回值:
- 如果成功读取图像文件,则返回一个 cv::Mat 对象,表示读取到的图像数据
- 如果无法读取图像文件,返回一个空的 cv::Mat 对象
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main() {
// 读取图像文件
cv::Mat image = cv::imread("image.jpg");
if (image.empty()) {
std::cout << "无法加载图像文件" << std::endl;
return -1;
}
// 处理图像...
return 0;
}注:
- 在上述示例中,cv::imread() 函数尝试加载名为 “image.jpg” 的图像文件。如果成功读取图像文件,将返回一个非空的 cv::Mat 对象,可以对其进行进一步的图像处理操作
- 需要注意的是,cv::imread() 函数需要提供正确的图像文件路径,并确保所使用的图像格式与 OpenCV 支持的图像格式相匹配。如果无法加载图像文件,可以检查文件路径是否正确、文件是否存在以及文件格式是否受支持
- 另外,OpenCV 还提供了其他的图像读取函数,如 cv::imdecode() 用于从内存中读取图像数据,以及 cv::VideoCapture 类用于读取视频文件或摄像头视频流。你可以根据具体的需求选择适当的图像读取方法
cv::imwrite
简介:
- cv::imwrite() 是 OpenCV 库中用于将图像数据保存到文件的函数。它接受图像数据和目标文件路径作为输入,并将图像数据写入指定的文件
原型:
1
bool cv::imwrite(const cv::String& filename, const cv::Mat& image, const std::vector<int>& params = std::vector<int>());
参数:
- filename:保存图像的文件路径。
- image:要保存的图像数据,为一个 cv::Mat 对象。
- params(可选):保存图像的参数,为一个整数向量。参数可以控制图像的压缩格式、质量等。常用的参数包括:
- cv::IMWRITE_JPEG_QUALITY:指定 JPEG 格式的图像质量,取值范围为 0 到 100。
- cv::IMWRITE_PNG_COMPRESSION:指定 PNG 格式的压缩级别,取值范围为 0 到 9,其中 0 表示无压缩,9 表示最高压缩
返回值:
- 如果成功将图像数据写入文件,则返回 true
- 如果无法将图像数据写入文件,则返回 false
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main() {
// 读取图像文件
cv::Mat image = cv::imread("image.jpg");
if (image.empty()) {
std::cout << "无法加载图像文件" << std::endl;
return -1;
}
// 保存图像文件
bool result = cv::imwrite("output.jpg", image);
if (result) {
std::cout << "图像保存成功" << std::endl;
} else {
std::cout << "图像保存失败" << std::endl;
}
return 0;
}注:
- 在上述示例中,cv::imread() 函数尝试加载名为 “image.jpg” 的图像文件,然后将图像数据存储在 cv::Mat 对象 image 中。接下来,通过调用 cv::imwrite() 函数,将图像数据保存到名为 “output.jpg” 的文件中
- 需要注意的是,cv::imwrite() 函数需要提供正确的文件路径,并确保所指定的文件格式与 OpenCV 支持的图像格式相匹配。如果无法将图像数据写入文件,可以检查文件路径是否正确、文件是否可写以及图像数据是否有效
- 另外,OpenCV 还提供了其他的图像保存函数,如 cv::imencode() 用于将图像数据编码为内存缓冲区,并将其保存为图像文件。你可以根据具体的需求选择适当的图像保存方法
cv::rectangle
简介:
- cv::rectangle() 是 OpenCV 库中用于在图像上绘制矩形的函数。它接受一个图像对象和矩形参数,并在图像上绘制指定的矩形
原型:
1
void cv::rectangle(cv::Mat& img, const cv::Rect& rect, const cv::Scalar& color, int thickness = 1, int lineType = cv::LINE_8, int shift = 0);
参数:
- img:要在其上绘制矩形的图像对象,为一个 cv::Mat 对象。
- rect:矩形的位置和大小,为一个 cv::Rect 对象。
- color:矩形的颜色,为一个 cv::Scalar 对象,可以是 BGR 或灰度值。
- thickness(可选):矩形线条的粗细,默认值为 1。
- lineType(可选):线条的类型,默认值为 cv::LINE_8,表示8连通线条。
- shift(可选):点坐标的小数位数,默认值为 0
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main() {
// 创建一个空白图像
cv::Mat image(300, 400, CV_8UC3, cv::Scalar(255, 255, 255));
// 绘制矩形
cv::Rect rect(50, 50, 200, 150);
cv::Scalar color(0, 0, 255); // 红色
int thickness = 2;
int lineType = cv::LINE_8;
int shift = 0;
cv::rectangle(image, rect, color, thickness, lineType, shift);
// 显示图像
cv::imshow("Image", image);
cv::waitKey(0);
return 0;
}注:
- 在上述示例中,我们创建了一个大小为 300x400 像素、颜色为白色的图像 image。然后,我们定义了一个矩形 rect,它位于图像上的 (50, 50) 点,宽度为 200,高度为 150。我们将矩形的颜色设置为红色,线条粗细为 2。最后,我们使用 cv::rectangle() 函数在图像上绘制矩形
- 需要注意的是,cv::rectangle() 函数会在原始图像对象上进行绘制,因此在函数调用之前,确保图像对象已经被创建并且是可写的
- 除了 cv::rectangle(),OpenCV 还提供了其他的绘制函数,如绘制直线、圆形、多边形等。你可以根据具体的需求选择适当的绘制函数,并使用不同的参数来调整绘制效果
cv::imshow
简介:
- cv::imshow() 是 OpenCV 库中用于显示图像的函数。它接受一个窗口名称和图像对象,并在一个新的窗口中显示图像
原型:
1
void cv::imshow(const cv::String& winname, const cv::Mat& image);
参数:
- winname:窗口的名称,为一个字符串。
- image:要显示的图像数据,为一个 cv::Mat 对象
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main() {
// 读取图像文件
cv::Mat image = cv::imread("image.jpg");
if (image.empty()) {
std::cout << "无法加载图像文件" << std::endl;
return -1;
}
// 显示图像
cv::imshow("Image", image);
// 等待按下任意按键
cv::waitKey(0);
}注:
- 在上述示例中,我们使用 cv::imread() 函数加载一个名为 “image.jpg” 的图像文件,并将图像数据存储在 cv::Mat 对象 image 中。然后,我们调用 cv::imshow() 函数,将图像显示在一个名为 “Image” 的窗口中
- 需要注意的是,cv::imshow() 函数会创建一个新的窗口来显示图像。窗口名称是唯一的,可以使用不同的名称来创建多个窗口并显示不同的图像。如果窗口名称已经存在,则会将新的图像显示在现有窗口中
- 在调用 cv::imshow() 函数后,通常需要调用 cv::waitKey() 函数来等待用户按下按键。这样可以使窗口保持打开状态,直到用户关闭窗口或按下按键。cv::waitKey() 函数返回按下的键的 ASCII 值,如果没有按下按键,则返回 -1
- 除了 cv::imshow(),OpenCV 还提供了其他的图像显示和交互函数,如调整窗口大小、绘制图形、注册鼠标事件等。你可以根据具体的需求选择适当的函数,并使用相关的参数和事件处理机制来进行图像显示和交互操作
namedWindow
简介:
- cv::namedWindow() 是 OpenCV 库中用于创建一个带有指定名称的窗口的函数。它可以用于显示图像、绘制图形和接收用户交互事件
原型:
1
void cv::namedWindow(const cv::String& winname, int flags = cv::WINDOW_AUTOSIZE);
参数:
- winname:窗口的名称,为一个字符串。
- flags(可选):窗口的属性标志,用于指定窗口的行为和外观。常用的标志包括:
- cv::WINDOW_NORMAL:创建一个可调整大小的窗口。
- cv::WINDOW_AUTOSIZE:创建一个自适应大小的窗口,窗口大小将根据图像大小自动调整
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main() {
// 读取图像文件
cv::Mat image = cv::imread("image.jpg");
if (image.empty()) {
std::cout << "无法加载图像文件" << std::endl;
return -1;
}
// 创建一个名为 "Image" 的窗口
cv::namedWindow("Image", cv::WINDOW_NORMAL);
// 显示图像
cv::imshow("Image", image);
// 等待按下任意按键
cv::waitKey(0);
return 0;
}注:
- 在上述示例中,我们使用 cv::imread() 函数加载一个名为 “image.jpg” 的图像文件,并将图像数据存储在 cv::Mat 对象 image 中。然后,我们调用 cv::namedWindow() 函数,创建一个名为 “Image” 的窗口。通过设置 flags 参数为 cv::WINDOW_NORMAL,我们可以创建一个可调整大小的窗口
- 接下来,我们调用 cv::imshow() 函数将图像显示在 “Image” 窗口中。最后,通过调用 cv::waitKey() 函数等待按键,以保持窗口打开状态,直到用户关闭窗口或按下按键
- 使用 cv::namedWindow() 函数可以为窗口指定名称,并设置窗口的属性标志以控制其行为和外观。这样可以在显示多个图像时,为每个图像创建独立的窗口,并根据需要进行大小调整
cv::destroyWindow
简介:
- cv::destroyWindow() 是 OpenCV 库中用于关闭指定名称的窗口的函数。它可以用于关闭已创建的窗口并释放与窗口相关的资源
原型:
1
void cv::destroyWindow(const cv::String& winname);
参数:
- winname:要关闭的窗口的名称,为一个字符串
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {
// 创建一个名为 "Image" 的窗口
cv::namedWindow("Image");
// ... 一些图像处理操作 ...
// 关闭名为 "Image" 的窗口
cv::destroyWindow("Image");
return 0;
}注:
- 在上述示例中,我们通过调用 cv::namedWindow() 函数创建了一个名为 “Image” 的窗口。然后,在执行一些图像处理操作后,我们通过调用 cv::destroyWindow() 函数关闭了名为 “Image” 的窗口
- 使用 cv::destroyWindow() 函数可以在不需要显示某个窗口时,将其关闭并释放相关资源。这对于图像处理过程中动态创建和关闭窗口非常有用
- 除了关闭单个窗口,还可以使用 cv::destroyAllWindows() 函数关闭所有已创建的窗口,释放所有窗口相关的资源
- 请注意,窗口的创建和销毁是在 OpenCV 的 HighGUI 模块中进行的,因此在使用这些函数之前,需要确保已经正确链接和初始化了 OpenCV 库
cv::waitKey
简介:
- cv::waitKey() 是 OpenCV 库中用于等待用户按下按键的函数。它在程序执行过程中暂停,并等待用户按下键盘上的按键
原型:
1
int cv::waitKey(int delay = 0);
参数:
- delay(可选):等待按键的时间(以毫秒为单位),默认值为 0。如果设置为正整数,表示等待指定的时间后,如果没有按键按下,则函数将继续执行。如果设置为 0,则函数将无限期等待按键的按下
返回值:
- 返回按下的键的 ASCII 值。
- 如果在指定的时间内没有按键按下,或者未能获取按键的值,则返回 -1。
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main() {
// 创建一个名为 "Image" 的窗口
cv::namedWindow("Image");
// 显示图像
cv::Mat image = cv::imread("image.jpg");
cv::imshow("Image", image);
// 等待按下任意按键
int key = cv::waitKey(0);
// 输出按下的键的 ASCII 值
std::cout << "按下的键的 ASCII 值: " << key << std::endl;
return 0;
}注:
- 在上述示例中,我们通过调用 cv::namedWindow() 函数创建了一个名为 “Image” 的窗口,并通过 cv::imshow() 函数显示了一张图像。然后,我们调用 cv::waitKey() 函数,等待用户按下键盘上的按键。将 delay 参数设置为 0 表示无限期等待按键按下
- 当用户按下按键时,cv::waitKey() 函数将返回按键的 ASCII 值。我们可以通过输出语句将其打印出来。如果没有按键按下或无法获取按键的值,函数将返回 -1
- 需要注意的是,调用 cv::waitKey() 函数会使程序暂停执行,直到用户按下按键或达到指定的等待时间。这通常与图像显示和交互操作配合使用,以保持窗口打开状态并等待用户操作
- 除了返回按键的 ASCII 值,cv::waitKey() 函数还可以用于实现视频播放和实时图像处理等应用,其中按键事件用于控制程序的流程和操作