前言:
Cv2.HoughCircles
OpenCvSharp で画像内の円を検出するために使用されるメソッドです。これは、ハフ変換に基づいて画像内の円を識別します。
コア機能:
Cv2.HoughCircles
()
CirclesSegment[] HoughCircles(
InputArray image, // 输入图像,应该是单通道灰度图像
HoughMethods method, // 霍夫变换的方法,通常使用 HoughMethods.Gradient
double dp, // 累加器分辨率与图像分辨率的倒数之比,一般设置为 1
double minDist, // 检测到的圆之间的最小距离
double param1 = 100, // Canny 边缘检测的第一个阈值
double param2 = 100, // 圆心检测阈值,通常设置为较小值以减少错误检测
int minRadius = 0, // 最小圆半径
int maxRadius = 0 // 最大圆半径
);
-
InputArray image
:画像を入力して円を検出します。これは通常、単一チャネルのグレースケール画像でなければなりません。 -
HoughMethods method
: ハフ変換法。通常はHoughMethods.Gradient
が使用されます。これは勾配ベースの方法であり、ほとんどの場合に適しています。 -
double dp
: 画像解像度の逆数に対するアキュムレータ解像度の比。通常は 1 に設定され、入力イメージと同じ解像度を示します。 -
double minDist
: 検出された円間の最小距離。このパラメータは、近い円を結合するかどうかを制御するために使用できます。通常、この値はアプリケーションに基づいて調整できます。 -
double param1
: Canny エッジ検出の最初のしきい値。エッジ検出はハフ変換の一部であり、画像内のエッジを検出するために使用されます。通常は 100 に設定します。 -
double param2
: 円中心検出閾値。この閾値は、検出された円が真円であるかどうかを判断するために使用されます。通常、誤検出を減らすために、より小さい値に設定されます。 -
int minRadius
およびint maxRadius
: 検出される円の最小半径と最大半径。検出したい円の半径がわかっている場合は、これら 2 つの値を設定できます。よくわからない場合は、両方を 0 に設定すると、メソッドは任意のサイズの円を自動的に検索します。
戻り値
Cv2.HoughCircles
メソッドは、各要素が検出された円を表す CirclesSegment
の配列を返します。各 CirclesSegment
には次の情報が含まれます:
Center
: 円の中心座標。Radius
:円の半径。
コード
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 霍夫变换检测圆
{
class Program
{
static void Main(string[] args)
{
// 读取图像
Mat image = Cv2.ImRead("C:/Users/CGW/Desktop/digits/气泡.jpg", ImreadModes.Color);
Cv2.ImShow("原图", image);
// 转换为灰度图像
Mat gray = new Mat();
Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY);
// 使用 HoughCircles 方法检测圆
CircleSegment[] circles = Cv2.HoughCircles(
gray,
HoughModes.Gradient, // 使用梯度法进行霍夫圆变换
dp: 1, // 分辨率因子
minDist: 30, // 圆之间的最小距离
param1: 100, // Canny 边缘检测的高阈值
param2: 30, // 圆心累加器的阈值
minRadius: 5, // 最小半径
maxRadius: 50 // 最大半径(如果为0,则根据图像尺寸自动调整)
);
// 绘制检测到的圆
// 如果找到了圆,绘制它们
for (int i = 0; i < circles.Length; i++)
{
Point2f center = circles[i].Center;
Cv2.Circle(image, (int)center.X, (int)center.Y, 1, new Scalar(0, 100, 100), 3, LineTypes.AntiAlias);
// circle outline
Cv2.Circle(image, (int)center.X, (int)center.Y, (int)circles[i].Radius, new Scalar(0, 255, 0), 3, LineTypes.AntiAlias);
}
// 显示结果
Cv2.ImShow("Detected Circles", image);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
}
}
}
結果: