OpenCvSharp通过 CircularCaliper找圆心,Caliper个数,宽度、长度、中心圆可设定请编写函数
时间: 2024-01-22 18:20:19 浏览: 140
以下是一个通过 CircularCaliper 在图像中寻找圆心、计算 Caliper 数量、宽度、长度以及中心圆的函数示例:
```csharp
using System;
using OpenCvSharp;
class Program
{
static void Main(string[] args)
{
// 读取图像
Mat src = Cv2.ImRead("circle.jpg", ImreadModes.Grayscale);
// 检测圆
Point2f center;
float radius;
Cv2.MinEnclosingCircle(Cv2.FindContours(src, RetrievalModes.External, ContourApproximationModes.ApproxSimple), out center, out radius);
// 设置 CircularCaliper 参数
int caliperCount = 40; // Caliper 数量
int caliperWidth = 5; // Caliper 宽度
int caliperLength = 50; // Caliper 长度
// 创建 CircularCaliper
var cc = new Cv2.CircularCaliper(center, (int)radius, caliperCount, caliperWidth, caliperLength);
// 计算 Caliper 及中心圆参数
double[] gaps;
Point2f[] points;
cc.GetPoints(src, out gaps, out points);
int caliperWithCircle = 0;
for (int i = 0; i < gaps.Length; i++)
{
if (gaps[i] < 0) // 如果存在缺口,则该 Caliper 不完整
{
Console.WriteLine($"Caliper {i}: Incomplete");
}
else // 计算完整 Caliper 宽度和长度
{
Console.WriteLine($"Caliper {i}: Width = {gaps[i]}, Length = {caliperLength}");
caliperWithCircle += 1; // 统计与圆重合的 Caliper 数量
}
}
Console.WriteLine($"Number of Calipers with Circle: {caliperWithCircle}");
Console.WriteLine($"Center Circle: Center = ({center.X}, {center.Y}), Radius = {radius}");
// 等待按下任意键退出程序
Cv2.WaitKey();
}
}
```
该函数读取名为 "circle.jpg" 的图像,并通过 `MinEnclosingCircle` 函数找到图像中心圆的位置和半径。然后,使用 `CircularCaliper` 类创建一个具有给定数量、宽度和长度的 Caliper 数组,并使用 `GetPoints` 函数在图像中找到 Caliper 点。最后,函数计算每个 Caliper 的宽度和长度,并统计与圆重合的 Caliper 数量。函数输出 Caliper 宽度和长度、中心圆位置和半径以及与圆重合的 Caliper 数量。
阅读全文