OpenCV(cv::minEnclosingCircle())
cv::minEnclosingCircle()
是 OpenCV 中的一个函数,用于找到能够完全包围给定点集的最小圆(即最小外接圆)。它常用于形状分析或图像处理中的轮廓检测任务,特别是确定某个形状的最小边界圆。
1. 函数定义
void cv::minEnclosingCircle(
InputArray points,
Point2f ¢er,
float &radius
)
参数:
points
:传入的点集。可以是std::vector<cv::Point>
或者cv::Mat
类型,点的集合通常是轮廓或形状的像素坐标。center
:输出参数,表示最小外接圆的圆心坐标,类型为cv::Point2f
。radius
:输出参数,表示最小外接圆的半径,类型为float
。
返回值:
该函数没有返回值。圆心和半径通过引用传递的参数 center
和 radius
传递给调用者。
2. 示例
假设我们有一组点集 points
,我们想要找到这些点的最小外接圆:
#include <opencv2/opencv.hpp>
#include <vector>
#include <iostream>
int main() {
// 创建一个空白图像
cv::Mat image = cv::Mat::zeros(400, 400, CV_8UC3);
// 创建一个点集
std::vector<cv::Point2f> points = {
cv::Point2f(150, 150),
cv::Point2f(200, 200),
cv::Point2f(180, 240),
cv::Point2f(220, 220)
};
// 定义变量保存最小外接圆的圆心和半径
cv::Point2f center;
float radius;
// 调用 minEnclosingCircle 找到最小外接圆
cv::minEnclosingCircle(points, center, radius);
// 绘制原始点集
for (size_t i = 0; i < points.size(); i++) {
cv::circle(image, points[i], 1, cv::Scalar(0, 255, 0), -1); // 绿色小圆点表示点集
}
// 绘制最小外接圆
cv::circle(image, center, static_cast<int>(radius), cv::Scalar(0, 0, 255), 1); // 红色圆表示外接圆
// 绘制圆心
cv::circle(image, center, 1, cv::Scalar(255, 0, 0), -1); // 蓝色小圆点表示圆心
// 输出圆心和半径
std::cout << "圆心: (" << center.x << ", " << center.y << ")" << std::endl;
std::cout << "半径: " << radius << std::endl;
// 显示结果
cv::imshow("Min Enclosing Circle", image);
cv::waitKey(0); // 等待用户按键
return 0;
}
输出:
圆心: (180, 190)
半径: 50.0001
这表示这四个点的最小外接圆的圆心坐标为 (180, 190)
,半径为 50.0001
像素。
3. 函数原理
cv::minEnclosingCircle()
基于几何算法找到最小的外接圆,该圆能够完全包围所有给定的点。这涉及计算这些点的极值,并根据其位置计算出最小的圆。
算法的时间复杂度为 O(n)
,因为其实现使用了 Welzl’s 算法,该算法是一种用于计算最小外接圆的递归算法,效率较高。
4. 典型应用
- 轮廓检测:在检测到物体的轮廓后,使用最小外接圆来表示物体的边界。
- 物体跟踪:在视频处理或图像分析中,用最小外接圆来简化复杂形状的表示,便于后续操作(如计算物体的中心或检测碰撞)。
- 运动分析:通过找到运动物体的最小外接圆,可以计算其运动路径或行为。
5. 注意事项
- 点集必须包含至少两个不同的点,否则无法构建外接圆。
- 函数只考虑点的二维坐标,不适用于三维场景。
通过 cv::minEnclosingCircle()
,可以方便地用一个简单的几何形状来描述复杂的点集或形状,广泛用于形状分析和物体检测的各种场景中。