2

kinect を使用して特定のオブジェクトを認識したいと考えています。私が使用したい方法の 1 つは、Houghtransformation です。これを行うには、AForge ライブラリを使用しています。

しかし、私が見つけた行は完全に間違っています。大事なものが抜けていたり、絵に無駄なセリフがたくさん入っています。

この問題に対処するために、私は次のように考えました。

最初に、ハフを介して最も強い100本の線を検出し、すべての正しい線も検出されるようにします。

エッジ検出からのすべてのポイントをリストに書き込んでおり、検出されたラインが少なくとも X ポイント (15、50、および 150 を使用) 上にあるかどうかを各ラインでチェックしていますが、それでも結果は悪いです。

正しい線を画像に描画してジオメトリをさらに分析する前に、どのように正しい線を見つけることができるか、何か考えはありますか? または、私のコードに重大な間違いがあるだけかもしれませんが、それはわかりません。

結果画像

SobelEdgeDetector Kante = new SobelEdgeDetector();
        System.Drawing.Bitmap neu2 = Kante.Apply(neu1);

        neu2.Save("test.png");

        for (int a = 0; a < 320; a++) //alle mögliche Kantenpunkte in eine Liste
        {
            for (int b = 0; b < 240; b++)
            {
                color = neu2.GetPixel(a, b);
                if ((color.R+color.G+color.B)/3 >= 50)
                {
                    Kantenpunkte.Add(new System.Drawing.Point(a, b));
                }
            }
        }

        Bitmap Hough = new Bitmap(320, 240);

        Hough.Save("C:\\Users\\Nikolas Rieble\\Desktop\\Hough.png");

        //houghtrans            
        HoughLineTransformation lineTransform = new HoughLineTransformation();

        // apply Hough line transofrm
        lineTransform.ProcessImage(neu2);
        Bitmap houghLineImage = lineTransform.ToBitmap();

        houghLineImage.Save("1.png");


        // get most intensive lines
        HoughLine[] lines = lineTransform.GetMostIntensiveLines(100);
        UnmanagedImage fertig = UnmanagedImage.FromManagedImage(neu2);

        foreach (HoughLine line in lines)
        {
            // get line's radius and theta values
            int r = line.Radius;
            double t = line.Theta;

            // check if line is in lower part of the image
            if (r < 0)
            {
                t += 180;
                r = -r;
            }

            // convert degrees to radians
            t = (t / 180) * Math.PI;

            // get image centers (all coordinate are measured relative
            // to center)
            int w2 = neu2.Width / 2;
            int h2 = neu2.Height / 2;

            double x0 = 0, x1 = 0, y0 = 0, y1 = 0;

            if (line.Theta != 0)
            {
                // none-vertical line
                x0 = -w2; // most left point
                x1 = w2;  // most right point

                // calculate corresponding y values
                y0 = (-Math.Cos(t) * x0 + r) / Math.Sin(t);
                y1 = (-Math.Cos(t) * x1 + r) / Math.Sin(t);
            }
            else
            {
                // vertical line
                x0 = line.Radius;
                x1 = line.Radius;

                y0 = h2;
                y1 = -h2;
            }

            // draw line on the image
            int a = 0;

            foreach (System.Drawing.Point p in Kantenpunkte) //count number of detected edge points that are on this line
            {
                double m1 = ((double)p.Y - y0)/((double)p.X - x0);       
                double m2 = ((y0 - y1)) / (x0 - x1);

                if (m1-m2<0.0001)
                {
                    a=a+1;
                }
            }

            if (a > 150) //only draw lines, which cover at least A points
            {
                AForge.Imaging.Drawing.Line(fertig,
                   new IntPoint((int)x0 + w2, h2 - (int)y0),
                   new IntPoint((int)x1 + w2, h2 - (int)y1),
                   System.Drawing.Color.Red); 
            }


        }
4

0 に答える 0