opencv计算轮廓周长
时间: 2023-11-20 20:54:13 浏览: 56
计算轮廓周长是计算轮廓的长度,可以通过OpenCV中的arcLength函数实现。该函数的第一个参数是轮廓,第二个参数是指定轮廓是否封闭,第三个参数是指定轮廓是否简化,返回值是轮廓的周长。下面是一个示例代码,用于计算图像中所有轮廓的周长:
```
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat image = imread("image.jpg", IMREAD_GRAYSCALE);
threshold(image, image, 128, 255, THRESH_BINARY);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(image, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);
for (int i = 0; i < contours.size(); i++)
{
double length = arcLength(contours[i], true);
cout << "Contour " << i << " length: " << length << endl;
}
return 0;
}
```
相关问题
opencvsharp计算周长
你可以使用 OpenCvSharp 库中的 `ArcLength` 函数来计算轮廓的周长。以下是一个简单的示例代码:
```csharp
using OpenCvSharp;
// 读取图像并转为灰度图像
Mat src = Cv2.ImRead("image.jpg", ImreadModes.Grayscale);
// 二值化图像
Mat binary = new Mat();
Cv2.Threshold(src, binary, 0, 255, ThresholdTypes.Binary);
// 查找轮廓
Mat hierarchy = new Mat();
Point[][] contours;
Cv2.FindContours(binary, out contours, hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
// 计算轮廓周长
double perimeter = Cv2.ArcLength(contours[0], true);
```
在上面的示例代码中,首先读取一张图像并将其转为灰度图像,然后对图像进行二值化处理。接下来使用 `FindContours` 函数查找图像中的轮廓,其中 `contours[0]` 表示第一个轮廓,因为我们只处理了一个轮廓,所以只需要使用第一个轮廓进行计算。最后使用 `ArcLength` 函数计算轮廓的周长,将结果保存在 `perimeter` 变量中。
opencv 轮廓安装周长进行排序
要对OpenCV中的轮廓按照周长进行排序,可以按照以下步骤进行操作:
1. 首先,使用OpenCV的`findContours`函数找到图像中的所有轮廓。这个函数会返回一个包含所有轮廓的列表。
2. 接下来,可以使用`arcLength`函数计算每个轮廓的周长。该函数需要传入轮廓的点集和闭合状态(True表示闭合,False表示非闭合)。
3. 将每个轮廓的周长与其对应的轮廓一起存储在一个列表中。
4. 使用Python的`zip`函数将轮廓和周长列表打包在一起。
5. 使用Python的`sorted`函数对打包后的列表进行排序,可以指定按照周长进行升序或降序排序。
6. 最后,可以将排序后的轮廓和周长分开存储在两个不同的列表中,或者直接使用排序后的列表。
下面是一个示例代码:
```python
import cv2
# 读取图像并转为灰度图
image = cv2.imread('image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 寻找轮廓
contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算每个轮廓的周长并存储在列表中
perimeters = [cv2.arcLength(contour, True) for contour in contours]
# 将轮廓和周长打包在一起并按照周长进行排序
sorted_contours = sorted(zip(contours, perimeters), key=lambda x: x[1], reverse=True)
# 分离排序后的轮廓和周长
sorted_contours, sorted_perimeters = zip(*sorted_contours)
# 打印排序后的周长
for perimeter in sorted_perimeters:
print(perimeter)
```
这样,你就可以得到按照周长排序后的轮廓列表和对应的周长列表。