当前位置: 欣欣网 > 码农

【OpenCvSharp】霍夫圆检测:轻松实现圆形计数的神奇技巧!

2024-04-01码农

效果

项目

代码

using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
namespace OpenCvSharp_HoughCircles_霍夫圆检测
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
pictureBox1.Image = new Bitmap("test01.jpg");
Mat mat = new Mat("test01.jpg");
Mat matClone = mat.Clone();
Cv2.CvtColor(mat, mat, ColorConversionCodes.RGB2GRAY);//将彩色图像变成单通道灰度图像
//霍夫圆检测:使用霍夫变换查找灰度图像中的圆。
/*
* 参数:
* 1:输入参数 :8位、单通道、灰度输入图像
* 2:实现方法 :目前,唯一的实现方法是HoughCirclesMethod.Gradient
* 3:dp :累加器分辨率与图像分辨率的反比。默认=1
* 4:minDist :检测到的圆的中心之间的最小距离。(最短距离-可以分辨是两个圆的,否则认为是同心圆- src_gray.rows/8)
* 5:param1 :第一个方法特定的参数。[默认值是100] canny边缘检测阈值低
* 6:param2 :第二个方法特定于参数。[默认值是100] 中心点累加器阈值 – 候选圆心
* 7:minRadius:最小半径
* 8:maxRadius:最大半径
*/
CircleSegment[] cs = Cv2.HoughCircles(mat, HoughMethods.Gradient, 1, 100, 100, 30, 40, 50);
//排序
Array.Sort(cs, (cs1, cs2) =>
{
if (cs1 != null && cs1 != null)
{
if (cs1.Center.Y > cs2.Center.Y)
return 1;
elseif (cs1.Center.Y == cs2.Center.Y)
{
if (cs1.Center.X < cs2.Center.X)
return 1;
elsereturn -1;
}
else
return -1;
}
return 0;
});
int index = 1;
for (int i = 0; i < cs.Count(); i++)
{
//画圆
Cv2.Circle(matClone, (OpenCvSharp.Point)cs[i].Center, (int)cs[i].Radius, new Scalar(255, 255, 0), 2);
OpenCvSharp.Point temp = (OpenCvSharp.Point)cs[i].Center;
temp.Y = temp.Y + 8;
temp.X = temp.X - 8;
if (i >= 9 && i < 99)
{
temp.X = temp.X - 10;
}
elseif (i >= 99)
{
temp.X = temp.X - 23;
}
Cv2.PutText(matClone, (index++).ToString(), temp, 0, 1, new OpenCvSharp.Scalar(0, 0, 0), 2);
}
pictureBox2.Image = BitmapConverter.ToBitmap(matClone);
}
}
}