OpenCV C++ 代码:识别图像中的圆形,测量距离和半径
#include <opencv2/opencv.hpp>
#include
using namespace cv; using namespace std;
int main() { // 读入图片 Mat img = imread('test.jpg', IMREAD_COLOR); if (img.empty()) { cout << '读取图片失败!' << endl; return -1; }
// 转为灰度图
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
// 高斯滤波
Mat blur;
GaussianBlur(gray, blur, Size(5, 5), 0);
// Canny边缘检测
Mat edges;
Canny(blur, edges, 50, 150);
// 查找圆形轮廓
vector<Vec3f> circles;
HoughCircles(edges, circles, HOUGH_GRADIENT, 1, 50, 200, 50, 0, 0);
// 绘制圆形轮廓
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]);
circle(img, center, radius, Scalar(0, 0, 255), 2, LINE_AA);
circle(img, center, 3, Scalar(0, 255, 0), -1, LINE_AA);
}
// 查找刻度线
vector<Vec4i> lines;
HoughLinesP(edges, lines, 1, CV_PI / 180, 50, 50, 10);
// 计算刻度线总长度
double total_length = 0.0;
for (size_t i = 0; i < lines.size(); i++)
{
Point pt1(lines[i][0], lines[i][1]);
Point pt2(lines[i][2], lines[i][3]);
line(img, pt1, pt2, Scalar(0, 255, 0), 2, LINE_AA);
total_length += norm(pt1 - pt2);
}
// 计算基准长度
double base_length = total_length / 5.0;
// 测量面积最大的圆心到其他每一个圆的圆心的距离
double max_distance = 0.0;
Point max_center;
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]);
double area = CV_PI * pow(radius, 2);
if (area > max_distance)
{
max_distance = area;
max_center = center;
}
}
for (size_t i = 0; i < circles.size(); i++)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
double distance = norm(max_center - center) * base_length / circles[0][2];
if (distance > max_distance)
{
max_distance = distance;
}
}
// 输出圆的信息
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]);
double distance = norm(max_center - center) * base_length / circles[0][2];
cout << '圆心位置:' << center << ',半径大小:' << distance << 'cm' << endl;
}
// 测量任意不相同的两个圆的圆心之间的距离
double max_circle_distance = 0.0;
for (size_t i = 0; i < circles.size(); i++)
{
for (size_t j = i + 1; j < circles.size(); j++)
{
Point center1(cvRound(circles[i][0]), cvRound(circles[i][1]));
Point center2(cvRound(circles[j][0]), cvRound(circles[j][1]));
double distance = norm(center1 - center2) * base_length / circles[0][2];
if (distance > max_circle_distance)
{
max_circle_distance = distance;
}
}
}
cout << '任意不相同的两个圆的圆心之间的最大距离为:' << max_circle_distance << 'cm' << endl;
// 显示结果
imshow('Result', img);
waitKey(0);
return 0;
}
原文地址: https://www.cveoy.top/t/topic/jsPE 著作权归作者所有。请勿转载和采集!