著作権:帰属、紙ベースを作成するために他人を許可し、(同じライセンスで元のライセンス契約に基づいて用紙配布する必要がありますクリエイティブコモンズ)
0から戦闘OpenCVのN〜(9) - ハフは、直線と円の検出を変換
ハフラインはラウンド変換、変換します
図1に示すように、ハフ変換線が直線を検出する方法であり、主に直線、を介してすべての可能な点の極座標表現を用いて第1の直線と複数の点によって決定されます
極性式は同じ点で交差が、それらが既知の点の正弦波を複数比較することによって、同じ通る直線かどうかを決定することができるかどうかを、正弦曲線です。
図2に示すように、円形ハフは交点の同じ複数の場合、すべて、少し円記載曲線を与えるために、円を表現するために、中心座標を用いて、同様の線にハフ変換を変換し、極座標、
同じラウンドでこれらの点について説明しています。
3、OpenCVの機能:
(1)標準ハフ線変換
HoughLines関数は極座標のパラメータのいくつかを与えるOpenCVのことによって達成されます
(2)統計的確率ハフラインを変換します
直線の端点を与えるために、OpenCVのHoughLinesPに機能することにより達成されます
(3)円形ハフ変換HoughCircles(src_gray、円、CV_HOUGH_GRADIENT、1/8、200、100、0、0 src_gray.rows)。
次の引数を持つ関数:
src_gray:入力画像(グレースケール)
丸社会:検出された各円を表すように設定コンテナ:次の三つのパラメータを格納します。
CV_HOUGH_GRADIENT :.検出方法を指定することは、今だけOpenCVのハフ勾配であります
DP = 1:アキュムレータの逆画像解像度
min_dist = src_gray.rows / 8:中心間の最短距離を検出します
PARAM_1 = 200:キャニーエッジ高い閾値関数
PARAM_2 = 100:中央検出閾値。
min_radius = 0:デフォルトは0であり、最小の半径を検出することができます。
max_radius = 0:最大半径を検出することができ、デフォルト値は0であります
4、プログラムテスト:
void main()
{
Mat src, dst,gray;
/// 装载图像
src = imread("5.jpg");
cvtColor(src, gray,CV_BGR2GRAY);
imshow("src", gray);
GaussianBlur(gray, gray, Size(3, 3), 1, 2);
vector<Vec4i> lines;
vector<Vec3f> circles;
//HoughLinesP(gray, lines, 1, CV_PI / 20, 200, 20, 10);
HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 1, 200, 60, 0, 2000);
//for (size_t i = 0; i < lines.size(); i++)
//{
// Vec4i l = lines[i];
// line(src, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, CV_AA);
//}
for (size_t i = 0; i < circles.size(); i++)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
// circle center
circle(src, center, 3, Scalar(0, 255, 0), -1, 8, 0);
// circle outline
circle(src, center, radius, Scalar(0, 0, 255), 3, 8, 0);
}
imshow("dst", src);
waitKey(0);
}
マイクロチャンネル公衆番号にもっと注意:ML_Study