opencvsharp canny高精度亚像素分块并行计算后将所有找到的点合并找圆心,请编写c#函数
时间: 2023-11-22 13:51:42 浏览: 107
以下是一个基于OpenCVSharp的Canny边缘检测和霍夫变换的圆检测函数,它使用并行计算和亚像素级别的检测来提高精度。
```csharp
using OpenCvSharp;
public static Point[] FindCircles(Mat image, double cannyThreshold1, double cannyThreshold2, int minRadius, int maxRadius)
{
Mat gray = new Mat();
Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY);
Mat edges = new Mat();
Cv2.Canny(gray, edges, cannyThreshold1, cannyThreshold2);
Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(edges, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
CircleSegment[] circles = Parallel.ForEach(contours, (contour) =>
{
CircleSegment[] localCircles = Cv2.HoughCircles(
edges,
HoughModes.Gradient,
1.0,
1.0,
cannyThreshold1,
100.0,
minRadius,
maxRadius);
return localCircles;
}).SelectMany(x => x).ToArray();
List<Point> centers = new List<Point>();
foreach (CircleSegment circle in circles)
{
centers.Add(circle.Center);
}
Point[] uniqueCenters = centers.Distinct().ToArray();
return uniqueCenters;
}
```
这个函数接受一个输入图像、两个Canny边缘检测的阈值、最小和最大半径,并返回找到的圆心的数组。它首先将输入图像转换为灰度图像,然后使用Canny边缘检测找到边缘。接下来,它使用并行计算和霍夫变换来检测圆。最后,它将找到的所有圆心合并成一个唯一的数组并返回。
阅读全文