OpenCV C++ 代码:识别图片中的圆形,测量距离和半径
OpenCV C++ 代码:识别图片中的圆形,测量距离和半径
本代码使用 C++ 和 OpenCV 库实现以下功能:
- 识别图片中的圆形。
- 将每一个圆用红圈标出,用绿色的点标出圆的圆心。
- 识别图片中的刻度线,并以此为基准度量其他距离。
- 测量面积最大的圆到其他所有圆的圆心的距离。
- 输出识别到的圆的圆心位置和半径大小,半径要用识别到的基准来度量。
- 测量任意两个圆的圆心之间的距离,输出最大距离。
#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。
代码可能需要根据图片内容进行调整,以获得最佳效果。
希望此代码能够帮助您识别图片中的圆形,并测量相关距离和半径。
原文地址: https://www.cveoy.top/t/topic/jsOZ 著作权归作者所有。请勿转载和采集!