原理:
直交座標系を極座標系に変換
原点から直線までの距離:ρ=xcosɵ+ysinɵ 直線
上の任意の点を上式に代入すると、原点から直線までの距離が計算できます。直線であり、固定値です。
ɵ と ρ が決まると、対応する一意の直線が求められます。
ターゲット画像の各ピクセルを横断し、上記の式を使用して、下図に示すように、ρ と ɵ の間の正弦波関係画像を描画します。 上図の同じ点で正弦関数が交差する回数は、その数を表します
。当該点に対応する直線上の有効特徴点の数と、
API:
public static LineSegmentPoint[] HoughLinesP(InputArray image, double rho, double theta, int threshold, double minLineLength = 0, double maxLineGap = 0);
コード:
if (fileDialog.ShowDialog() == DialogResult.OK)
{
picFile = fileDialog.FileName;
inputMat = Cv2.ImRead(picFile, ImreadModes.AnyColor);
Mat finallyOutMat = inputMat.Clone();
outMat = new Mat(new Size(inputMat.Cols, inputMat.Rows), inputMat.Type());
//二值化
Cv2.Threshold(inputMat, outMat, 90, 255, ThresholdTypes.Binary);
//提取边缘
Cv2.Canny(inputMat, outMat, 50, 200);
var lines = Cv2.HoughLinesP(outMat, 1, Cv2.PI / 180, 100, 90, 60);
//绘制直线
Scalar scalar = new Scalar(0, 0, 255);//线的颜色
for (int i = 0; i < lines.Length; i++)
{
Cv2.Line(finallyOutMat, lines[i].P1, lines[i].P2, scalar, 4);
}
outMat = finallyOutMat.Clone();
picBox_Display.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(inputMat);
picBox_After.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(outMat);
}
追記:
この場合、.NET で使用される OpenCV ライブラリはOpenCvSharp4です。