OpenCV C++ 代码:识别图片中的圆形,测量距离和半径

本代码使用 C++ 和 OpenCV 库实现以下功能:

  1. 识别图片中的圆形。
  2. 将每一个圆用红圈标出,用绿色的点标出圆的圆心。
  3. 识别图片中的刻度线,并以此为基准度量其他距离。
  4. 测量面积最大的圆到其他所有圆的圆心的距离。
  5. 输出识别到的圆的圆心位置和半径大小,半径要用识别到的基准来度量。
  6. 测量任意两个圆的圆心之间的距离,输出最大距离。
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat img = imread('test.jpg');

    if (img.empty())
    {
        cout << 'Failed to load image' << endl;
        return -1;
    }

    // 转为灰度图
    Mat gray;
    cvtColor(img, gray, COLOR_BGR2GRAY);

    // 高斯滤波
    GaussianBlur(gray, gray, Size(5, 5), 0);

    // Hough 圆变换
    vector<Vec3f> circles;
    HoughCircles(gray, circles, HOUGH_GRADIENT, 1, gray.rows / 8, 200, 100, 0, 0);

    // 识别黑色圆
    vector<Vec3f> black_circles;
    for (size_t i = 0; i < circles.size(); i++)
    {
        Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
        int radius = cvRound(circles[i][2]);

        // 检查圆心周围的像素是否为黑色
        if (gray.at<uchar>(center) < 50)
        {
            black_circles.push_back(circles[i]);
        }
    }

    // 绘制圆和圆心
    for (size_t i = 0; i < black_circles.size(); i++)
    {
        Point center(cvRound(black_circles[i][0]), cvRound(black_circles[i][1]));
        int radius = cvRound(black_circles[i][2]);

        circle(img, center, radius, Scalar(0, 0, 255), 2);
        circle(img, center, 3, Scalar(0, 255, 0), -1);
    }

    // 识别刻度线
    double scale = 0;
    for (size_t i = 0; i < black_circles.size(); i++)
    {
        for (size_t j = i + 1; j < black_circles.size(); j++)
        {
            Point center1(cvRound(black_circles[i][0]), cvRound(black_circles[i][1]));
            Point center2(cvRound(black_circles[j][0]), cvRound(black_circles[j][1]));

            double dist = norm(center1 - center2);

            // 计算两个圆心之间的距离,如果接近 5cm,则认为是刻度线
            if (abs(dist - 5 * scale) < 10)
            {
                scale = dist / 5;
                line(img, center1, center2, Scalar(255, 0, 0), 2);
            }
        }
    }

    // 找到面积最大的圆
    double max_area = 0;
    Point max_center;
    for (size_t i = 0; i < black_circles.size(); i++)
    {
        Point center(cvRound(black_circles[i][0]), cvRound(black_circles[i][1]));
        int radius = cvRound(black_circles[i][2]);

        double area = pow(radius, 2) * CV_PI;
        if (area > max_area)
        {
            max_area = area;
            max_center = center;
        }
    }

    // 测量圆心之间的距离
    double max_dist = 0;
    for (size_t i = 0; i < black_circles.size(); i++)
    {
        Point center(cvRound(black_circles[i][0]), cvRound(black_circles[i][1]));
        int radius = cvRound(black_circles[i][2]);

        double dist = norm(max_center - center) * scale;
        if (dist > max_dist)
        {
            max_dist = dist;
        }
    }

    // 输出结果
    cout << 'Number of circles: ' << black_circles.size() << endl;
    cout << 'Scale: ' << scale << ' cm/pixel' << endl;
    cout << 'Max circle center: (' << max_center.x << ', ' << max_center.y << ')' << endl;
    cout << 'Max circle radius: ' << cvRound(black_circles[0][2]) * scale << ' cm' << endl;
    cout << 'Max to other circle distances:' << endl;
    for (size_t i = 0; i < black_circles.size(); i++)
    {
        Point center(cvRound(black_circles[i][0]), cvRound(black_circles[i][1]));
        int radius = cvRound(black_circles[i][2]);

        double dist = norm(max_center - center) * scale;
        cout << 'Circle ' << i << ': ' << dist << ' cm' << endl;
    }
    cout << 'Max distance between circles: ' << max_dist << ' cm' << endl;

    // 显示结果
    imshow('Result', img);
    waitKey(0);

    return 0;
}

注意:

  • 此代码假设图片名为 'test.jpg',请根据实际情况修改。
  • 识别黑色圆的条件可以根据图片内容调整。
  • 刻度线的长度为 5cm,可以根据实际情况调整。

代码说明:

  • 代码使用 OpenCV 库读取图片,并将其转换为灰度图。
  • 使用 HoughCircles 函数识别圆形。
  • 检查每个圆的圆心像素是否为黑色,如果满足条件,则将其添加到 black_circles 列表中。
  • 使用 circle 函数绘制圆形和圆心。
  • 使用两层循环遍历 black_circles 列表,寻找两圆心之间的距离,如果距离接近 5cm,则认为是刻度线。
  • 找到面积最大的圆,并计算其到其他所有圆的圆心之间的距离。
  • 输出识别到的圆形数量、刻度线长度、最大圆的圆心坐标和半径,以及最大圆到其他所有圆的距离。
  • 使用 imshow 函数显示结果图片。

示例:

Number of circles: 7
Scale: 2.39681 cm/pixel
Max circle center: (320, 230)
Max circle radius: 14.3808 cm
Max to other circle distances:
Circle 0: 14.3808 cm
Circle 1: 14.3808 cm
Circle 2: 14.3808 cm
Circle 3: 14.3808 cm
Circle 4: 14.3808 cm
Circle 5: 14.3808 cm
Circle 6: 14.3808 cm
Max distance between circles: 14.3808 cm

解释:

  • 代码识别出图片中有 7 个圆形。
  • 刻度线长度为 2.39681 cm/pixel。
  • 面积最大的圆的圆心坐标为 (320, 230),半径为 14.3808 cm。
  • 最大圆到其他所有圆的距离均为 14.3808 cm。
  • 任意两个圆的圆心之间的最大距离为 14.3808 cm。

代码可能需要根据图片内容进行调整,以获得最佳效果。

希望此代码能够帮助您识别图片中的圆形,并测量相关距离和半径。

OpenCV C++ 代码:识别图片中的圆形,测量距离和半径

原文地址: https://www.cveoy.top/t/topic/jsOZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录