opencv找到轮廓后得到的若干结果,两两比较之间的中心点距离,用C++实现
时间: 2023-06-15 14:07:32 浏览: 87
python-opencv获取二值图像轮廓及中心点坐标的代码
可以按照以下步骤实现:
1. 使用OpenCV的findContours函数找到轮廓,并将结果存储在一个vector<vector<Point>>类型的变量中。
2. 定义一个函数来计算两个轮廓之间的中心点距离。可以使用OpenCV的moments函数找到轮廓的重心,然后计算两个重心之间的距离。具体实现如下:
```
double getDistance(vector<Point> contour1, vector<Point> contour2)
{
Moments m1 = moments(contour1);
Moments m2 = moments(contour2);
Point2f c1 = Point2f(m1.m10 / m1.m00, m1.m01 / m1.m00);
Point2f c2 = Point2f(m2.m10 / m2.m00, m2.m01 / m2.m00);
return norm(c1 - c2);
}
```
3. 对于每两个轮廓之间,调用上述函数计算它们的中心点距离,并将结果存储在一个二维数组中。
```
vector<vector<double>> distances;
for (int i = 0; i < contours.size(); i++)
{
vector<double> row;
for (int j = i + 1; j < contours.size(); j++)
{
double distance = getDistance(contours[i], contours[j]);
row.push_back(distance);
}
distances.push_back(row);
}
```
4. 可以使用distances数组中的数据进行进一步分析,例如找到距离最近的两个轮廓等。
完整代码如下:
```
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
double getDistance(vector<Point> contour1, vector<Point> contour2)
{
Moments m1 = moments(contour1);
Moments m2 = moments(contour2);
Point2f c1 = Point2f(m1.m10 / m1.m00, m1.m01 / m1.m00);
Point2f c2 = Point2f(m2.m10 / m2.m00, m2.m01 / m2.m00);
return norm(c1 - c2);
}
int main()
{
Mat image = imread("image.jpg", IMREAD_GRAYSCALE);
threshold(image, image, 128, 255, THRESH_BINARY);
vector<vector<Point>> contours;
findContours(image, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
vector<vector<double>> distances;
for (int i = 0; i < contours.size(); i++)
{
vector<double> row;
for (int j = i + 1; j < contours.size(); j++)
{
double distance = getDistance(contours[i], contours[j]);
row.push_back(distance);
}
distances.push_back(row);
}
// do something with distances
return 0;
}
```
阅读全文