OpenCV4.5.5学习笔记(十六):多边形包围轮廓和图像的矩

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

笔者本科时候有幸接触了OpenCV3.2.0版本的学习,后因考研压力不得不暂时停下学习的脚步,现在考研任务结束了,未来的导师也是从事的该方向,笔者又开始了新一轮的学习。回来发现OpenCV已经出到了4.5.5版本,遂重新下载新版本并决定记录这一学习历程。由于笔者水平有限,可能有错误之处还请诸位大佬多多包涵并烦请指出,让我们一起学习,共同进步。
首先需要说明的是:我是按着毛星云前辈编写的OpenCV3编程入门进行学习的,我会尽力把星云前辈的程序转成符合OpenCV4.5.5版本的。毛星云前辈于2021年12月11日不幸过世,他是我非常敬仰的一位业内大佬,我也是看他的书才开始接触OpenCV。


一、多边形包围轮廓

1.寻找最小包围矩形:boundingRect()

计算点集或灰度图像的非零像素的右上边界矩形。
函数计算并返回灰度图像的指定点集或非零像素的最小上边界矩形。
我们常用的是boundingRect()函数
在OpenCV官方文档中是这么写的:
Rect cv::boundingRect ( InputArray array )
参数是输入灰度图像或二维点集


2.寻找最小包围圆形:minEnclosingCircle()

我们常用的是minEnclosingCircle()函数
在OpenCV官方文档中是这么写的:
void cv::minEnclosingCircle (
InputArray points,
Point2f & center,
float & radius
)
第一个参数是二维点的输入向量,
第二个参数是输出圆心,
第三个参数是圆的输出半径


3.寻找最小包围矩形:minAreaRect()

查找包含输入 2D 点集的最小区域的旋转矩形。
该函数计算并返回指定点集的最小面积边界矩形(可能旋转)。
我们常用的是minAreaRect()函数
在OpenCV官方文档中是这么写的:
RotatedRect cv::minAreaRect ( InputArray points )
参数是二维点的输入向量


4.用椭圆拟合二维点集:fitEllipse()

围绕一组 2D 点拟合椭圆。
该函数计算最适合(在最小二乘意义上)一组 2D 点的椭圆。它返回内接椭圆的旋转矩形。
我们常用的是fitEllipse()函数
在OpenCV官方文档中是这么写的:
RotatedRect cv::fitEllipse ( InputArray points )
参数是输入 2D 点集


5.逼近多边形曲线:approxPolyDP()

以指定精度逼近多边形曲线。
函数cv::approxPolyDP用另一个具有较少顶点的曲线/多边形来逼近一条曲线或多边形,以使它们之间的距离小于或等于指定的精度
我们常用的是approxPolyDP()函数
在OpenCV官方文档中是这么写的:
void cv::approxPolyDP (
InputArray curve,
OutputArray approxCurve,
double epsilon,
bool closed
)
第一个参数是存储在 std::vector 或Mat中的 2D 点的输入向量,
第二个参数是近似的结果。该类型应与输入曲线的类型相匹配,
第三个参数是指定近似精度的参数。这是原始曲线与其近似值之间的最大距离,
第四个参数是如果为真,则近似曲线是闭合的(它的第一个和最后一个顶点是连接的)


二、矩

一个从一幅数字图形中计算出来的矩集:通常描述了该图像形状的全局特征,并提供了大量的关于该图像不同类型的几何特征信息,比如大小、位置、方向及形状等。
一阶矩与形状有关,二阶矩显示曲线围绕直线平均值的扩展程度,三阶矩则是关于平均值的对称性的测量。

1.计算图像中所有的矩:moments()

计算多边形或光栅化形状的所有矩,最高可达三阶。
该函数计算向量形状或光栅化形状的最高 3 阶矩。结果在结构cv::Moments中返回。
我们常用的是moments()函数
在OpenCV官方文档中是这么写的:
Moments cv::moments (
InputArray array,
bool binaryImage = false
)
第一个参数是光栅图像(单通道、8 位或浮点二维数组)或二维点(Point 或 Point2f)的数组(或N \times 1),
第二个参数是如果为真,则所有非零图像像素都被视为 1)


2.计算轮廓面积:contourArea()

计算轮廓区域。
该函数计算轮廓区域。与矩 类似,面积是使用格林公式计算的。
我们常用的是contourArea()函数
在OpenCV官方文档中是这么写的:
double cv::contourArea (
InputArray contour,
bool oriented = false
)
第一个参数是存储在 std::vector 或Mat中的 2D 点的输入向量,
第二个参数是定向区域标志。如果为真,则函数根据轮廓方向(顺时针或逆时针)返回带符号的面积值


3.计算轮廓或曲线长度:arcLength()

计算轮廓周长或曲线长度。
该函数计算曲线长度或闭合轮廓周长。
我们常用的是arcLength()函数
在OpenCV官方文档中是这么写的:
double cv::arcLength (
InputArray curve,
bool closed
)
第一个参数是存储在 std::vector 或Mat中的 2D 点的输入向量,
第二个参数是指示曲线是否闭合的标志


总结

多边形包围轮廓(星云前辈的例程)输出结果:
在这里插入图片描述
图像的矩(星云前辈的例程)输出结果:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43264167/article/details/124532016
今日推荐