2

(Probabilistic Hough Transform を実装する HoughLinesBinary メソッドを使用する代わりに) 標準の Hough Transformation を使用する必要があり、HoughLinesBinary メソッドのカスタム バージョンを作成してそれを試みました。

using (MemStorage stor = new MemStorage())
     {
        IntPtr lines = CvInvoke.cvHoughLines2(canny.Ptr, stor.Ptr, Emgu.CV.CvEnum.HOUGH_TYPE.CV_HOUGH_STANDARD, rhoResolution, (thetaResolution*Math.PI)/180, threshold, 0, 0);

        Seq<MCvMat> segments = new Seq<MCvMat>(lines, stor);
        List<MCvMat> lineslist = segments.ToList();
        foreach(MCvMat line in lineslist)
        {
           //Process lines: (rho, theta)
        }
     }

私の問題は、返されるシーケンスの型がわからないことです。CvMat* が OpenCV で使用されているというドキュメントを読んでいるため、MCvMat である必要があると思います。これには、STANDARD の場合、「マトリックスは CV_32FC2 タイプでなければならない (作成されるシーケンスは次のようになります)」と記載されています。

STANDARD ハフ ライン (つまり、ローとシータの情報を与える各ラインの 2x1 ベクトル) から正しい出力データを返して処理するために何をする必要があるかは不明です。

どんな助けでも大歓迎です。ありがとうございました

-サル

4

1 に答える 1

2

私は数日前に同じ問題を抱えていました。これがマーシャリングを使用して解決した方法です。もっと簡単な解決策を見つけたら教えてください。

using (MemStorage stor = new MemStorage())
{
    IntPtr lines = CvInvoke.cvHoughLines2(canny.Ptr, stor.Ptr, Emgu.CV.CvEnum.HOUGH_TYPE.CV_HOUGH_STANDARD, rhoResolution, (thetaResolution*Math.PI)/180, threshold, 0, 0);

    int maxLines = 100;
    for(int i = 0; i < maxLines; i++)
    {
        IntPtr line = CvInvoke.cvGetSeqElem(lines, i);
        if (line == IntPtr.Zero)
        {
            // No more lines
            break;
        }
        PolarCoordinates coords = (PolarCoordinates)System.Runtime.InteropServices.Marshal.PtrToStructure(line, typeof(PolarCoordinates));

        // Do something with your Hough lines
    }
}

次のように定義された構造体を使用します。

public struct PolarCoordinates
{
    public float Rho;
    public float Theta;
}
于 2013-03-12T16:06:43.070 に答える