當前位置: 妍妍網 > 碼農

【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);
}
}
}