ハフの直線変換原理とOpenCVの直線検出(C#)

原理:
直交座標系を極座標系に変換
ここに画像の説明を挿入します
原点から直線までの距離:ρ=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です。

.NET環境用のOpenCvライブラリ

おすすめ

転載: blog.csdn.net/weixin_40671962/article/details/127253890