OpenCvSharp 编写多线程CircularCaliper找圆心函数 , 输入图像、找圆扇形区域的最小半径和最大半径、找圆扇形中心点、设定扇形区域起始角度、扇形区域结束角度 找圆扇形区域图像以外的图像Mask处理 输入Caliper个数,宽度、长度、 输入从内到外找圆心、从黑到白找圆 输入canny参数 并行计Caliper区域,将Caliper区域所有canny点合并,拟合圆心 输出圆中心点、半径请编写函数
时间: 2023-07-10 07:07:26 浏览: 106
以下是一个使用OpenCvSharp进行多线程CircularCaliper找圆心的示例代码:
```
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using OpenCvSharp;
namespace CircularCaliper
{
class Program
{
static void Main(string[] args)
{
// 读取输入图像
Mat src = Cv2.ImRead("input_image.jpg", ImreadModes.GrayScale);
// 设置找圆扇形区域的最小半径和最大半径
int minRadius = 50;
int maxRadius = 150;
// 设置找圆扇形中心点
Point center = new Point(src.Width / 2, src.Height / 2);
// 设置扇形区域起始角度和结束角度
int startAngle = 0;
int endAngle = 360;
// 找圆扇形区域图像以外的图像Mask处理
Mat mask = new Mat(src.Size(), MatType.CV_8UC1, Scalar.Black);
Cv2.Circle(mask, center, maxRadius, Scalar.White, -1);
Cv2.Circle(mask, center, minRadius, Scalar.Black, -1);
// 输入Caliper个数、宽度、长度
int numCalipers = 100;
int caliperWidth = 5;
int caliperLength = 40;
// 输入从内到外找圆心、从黑到白找圆
bool searchFromInside = true;
bool searchBlackToWhite = true;
// 输入canny参数
int cannyThreshold1 = 50;
int cannyThreshold2 = 150;
// 并行计算Caliper区域
List<Rect> caliperRegions = new List<Rect>();
int regionWidth = (int)Math.Ceiling(maxRadius * 2.0 / numCalipers);
int regionHeight = caliperLength + caliperWidth;
for (int i = 0; i < numCalipers; i++)
{
int x = (int)Math.Ceiling(center.X - maxRadius + i * regionWidth);
int y = (int)Math.Ceiling(center.Y - caliperLength / 2);
caliperRegions.Add(new Rect(x, y, regionWidth, regionHeight));
}
List<Point[]> cannyPointsList = new List<Point[]>();
Parallel.ForEach(caliperRegions, (caliperRegion) =>
{
// 获取Caliper区域的图像
Mat caliperImg = src.SubMat(caliperRegion);
// 计算Canny边缘
Mat edges = new Mat();
Cv2.Canny(caliperImg, edges, cannyThreshold1, cannyThreshold2);
// 将Canny边缘点存储在列表中
List<Point> cannyPoints = new List<Point>();
for (int x = 0; x < edges.Width; x++)
{
for (int y = 0; y < edges.Height; y++)
{
if (edges.At<byte>(y, x) != 0)
{
cannyPoints.Add(new Point(caliperRegion.X + x, caliperRegion.Y + y));
}
}
}
cannyPointsList.Add(cannyPoints.ToArray());
});
// 合并所有Caliper区域的Canny边缘点
List<Point> allCannyPoints = new List<Point>();
foreach (var cannyPoints in cannyPointsList)
{
allCannyPoints.AddRange(cannyPoints);
}
// 拟合圆心
Point2f centerPoint;
float radius;
Cv2.MinEnclosingCircle(allCannyPoints.ToArray(), out centerPoint, out radius);
// 输出圆中心点、半径
Console.WriteLine("Center point: ({0}, {1})", centerPoint.X, centerPoint.Y);
Console.WriteLine("Radius: {0}", radius);
}
}
}
```
在这个示例代码中,我们首先读取输入图像,并设置找圆扇形区域的最小半径和最大半径、找圆扇形中心点、扇形区域起始角度和结束角度。然后,我们创建一个Mask来处理图像,输入Caliper个数、宽度、长度,以及从内到外找圆心、从黑到白找圆等参数。接着,我们并行计算Caliper区域,并将所有Caliper区域的Canny边缘点合并起来,最后拟合圆心并输出圆中心点和半径。
阅读全文