在OpenCvSharp中,FindContours后找到最长的轮廓与最短的轮廓;
时间: 2024-10-20 13:18:03 浏览: 29
OpenCvSharp 轮廓检测.rar
5星 · 资源好评率100%
在OpenCvSharp库中,`FindContours()`函数用于从图像中查找边缘并将其分组成轮廓。如果你想找出最长和最短的轮廓,你需要按照以下步骤操作:
1. **读取并预处理图像**:
使用`imread()`函数加载图片,然后可能需要进行灰度化、二值化等预处理操作以便于轮廓检测。
```csharp
Mat img = Cv2.ImRead("image.jpg", ImreadModes.Color);
Mat grayImage;
Cv2.CvtColor(img, grayImage, ColorConversionCodes.Bgr2Gray);
```
2. **寻找轮廓**:
调用`FindContours()`获取所有轮廓及其级别的信息。记得设置第三个参数为`Contour Retrieval Modes`中的`RetrievalExternal`或`RetrievalBoth`,以便包括外部轮廓。
```csharp
VectorOf<Point> contours;
HierarchyType hierarchy;
Cv2.FindContours(grayImage, out contours, out hierarchy, RetrievalTypes.External, ContourApproximationModes.ApproxSimple);
```
3. **测量轮廓长度**:
对每个轮廓应用`Length()`函数计算长度。你可以创建两个变量分别存储最长和最短的长度,并遍历找到的轮廓更新这两个变量。
```csharp
int maxContourLen = 0, minContourLen = Int32.MaxValue;
foreach (Point contour in contours)
{
int contourLength = Cv2.ApproxPolyDP(contour, 0.01 * cv2.arcLength(contour, true), true).Size;
if (contourLength > maxContourLen)
maxContourLen = contourLength;
else if (contourLength < minContourLen)
minContourLen = contourLength;
}
```
4. **找到相应的轮廓点**:
如果需要,可以根据长度找到最长和最短轮廓的具体点,可以遍历`contours`并检查哪些接近最大或最小长度。
5. **输出结果**:
最后,你可以打印出最长和最短轮廓的信息,或者将它们保存起来供后续分析。
```csharp
Console.WriteLine($"最长轮廓长度: {maxContourLen}");
Console.WriteLine($"最短轮廓长度: {minContourLen}");
```
阅读全文