OpenCV(cv::minEnclosingCircle())



cv::minEnclosingCircle() 是 OpenCV 中的一个函数,用于找到能够完全包围给定点集的最小圆(即最小外接圆)。它常用于形状分析或图像处理中的轮廓检测任务,特别是确定某个形状的最小边界圆。



1. 函数定义

void cv::minEnclosingCircle(
    InputArray points,
    Point2f &center,
    float &radius
)

参数:

  • points:传入的点集。可以是 std::vector<cv::Point> 或者 cv::Mat 类型,点的集合通常是轮廓或形状的像素坐标。
  • center:输出参数,表示最小外接圆的圆心坐标,类型为 cv::Point2f
  • radius:输出参数,表示最小外接圆的半径,类型为 float

返回值:

该函数没有返回值。圆心和半径通过引用传递的参数 centerradius 传递给调用者。



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. 典型应用

  1. 轮廓检测:在检测到物体的轮廓后,使用最小外接圆来表示物体的边界。
  2. 物体跟踪:在视频处理或图像分析中,用最小外接圆来简化复杂形状的表示,便于后续操作(如计算物体的中心或检测碰撞)。
  3. 运动分析:通过找到运动物体的最小外接圆,可以计算其运动路径或行为。


5. 注意事项

  • 点集必须包含至少两个不同的点,否则无法构建外接圆。
  • 函数只考虑点的二维坐标,不适用于三维场景。

通过 cv::minEnclosingCircle(),可以方便地用一个简单的几何形状来描述复杂的点集或形状,广泛用于形状分析和物体检测的各种场景中。



posted @ 2024-09-05 16:09  做梦当财神  阅读(159)  评论(0编辑  收藏  举报