opencv中计算两个contour 的最大距离代码
时间: 2024-02-07 18:02:52 浏览: 172
以下是使用OpenCV计算两个轮廓最大距离的示例代码:
```python
import cv2
# 读取图像并转换为灰度图像
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 阈值化处理
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 计算最大距离
max_dist = 0
for i in range(len(contours)):
for j in range(i+1, len(contours)):
dist = cv2.matchShapes(contours[i], contours[j], cv2.CONTOURS_MATCH_I1, 0)
if dist > max_dist:
max_dist = dist
print("最大距离为:", max_dist)
```
在这个示例中,我们首先读取图像并将其转换为灰度图像,然后进行阈值化处理并查找轮廓。接下来,我们使用一个嵌套的循环计算所有可能的轮廓间距离,并找到最大距离。最后,我们输出最大距离的值。
相关问题
opencv 计算轮廓所有点到某一点的距离
OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,提供了丰富的图像处理和计算机视觉功能。如果你想要计算轮廓上所有点到某个特定点的距离,你可以使用OpenCV中的`minDistance()`函数,这个函数可以帮助你在轮廓边界上找到离给定点最近的点。
以下是一个简单的示例代码片段,展示了如何做到这一点:
```cpp
#include <opencv2/opencv.hpp>
cv::Mat image; // 假设已经加载了图像并获取到了contours和 hierarchy
std::vector<cv::Point> contourPoints = cv::contourApproximation(contour, cv::CHAIN_APPROX_SIMPLE); // 获取轮廓点
cv::Point pointToMeasureFrom; // 需要测量距离的点
double minDistance = std::numeric_limits<double>::max();
int closestIndex = -1;
for (size_t i = 0; i < contourPoints.size(); i++) {
double dist = cv::norm(contourPoints[i] - pointToMeasureFrom);
if (dist < minDistance) {
minDistance = dist;
closestIndex = i;
}
}
// minDistance 就是最短距离,closestIndex 是对应的轮廓点索引
```
在这个例子中,我们首先从轮廓(`contour`)中提取点,然后遍历这些点,计算每个点到指定点(`pointToMeasureFrom`)的欧氏距离。`cv::norm()`函数负责计算两点之间的距离。如果当前点的距离小于之前记录的最小值,就更新最小距离和最近点的索引。
请注意,你需要确保`contour`变量已经被正确填充,并且`contourApproximation()`已经对轮廓进行了简化,以便于后续操作。
opencv图像处理怎么找轮廓两点的距离
要找到轮廓上两点的距离,可以使用OpenCV中的`arcLength`函数来计算轮廓的周长,然后使用`approxPolyDP`函数来近似轮廓,将其转换为一组顶点。接下来,可以使用`cv::norm`函数来计算两个顶点之间的距离。
以下是一个示例代码片段,演示如何计算轮廓上两点的距离:
```
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("contour.jpg", IMREAD_GRAYSCALE);
// Find contours
vector<vector<Point>> contours;
findContours(image, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// Approximate contour
vector<Point> approx;
double epsilon = 0.01 * arcLength(contours[0], true);
approxPolyDP(contours[0], approx, epsilon, true);
// Calculate distance between two points
Point p1 = approx[0];
Point p2 = approx[approx.size() - 1];
double distance = norm(p1 - p2);
cout << "Distance between two points: " << distance << endl;
return 0;
}
```
在这个示例中,我们首先读取了一个灰度图像,并找到了其边界轮廓。然后,我们使用`approxPolyDP`函数近似轮廓,找到了最靠近轮廓起点和终点的两个顶点,并计算它们之间的距离。
阅读全文