2

黒い画像で白い四角形を検出しようとしています。Canny の後に HoughLinesP を使用しましたが、検出は正確です。問題は、一部の線が非常に似ていて、ほぼ同じエッジを定義していることです。したがって、HgouhLinesP が返す行列には、4 行ではなく、それ以上の行があります。HoughLinesP のパラメーターを変更して、4 行のみを生成することはできますか?

生成されたすべての線の方程式を比較する方法を実装しようとしましたが、同様の線は非常に異なる方程式を持っているようで、結果は間違っています。つまり、基本的には 4x4 マトリックスを作成し、最初の行をその中に入れます。次に、次の行を比較し、そのうちの 1 つが異なる場合は、4x4 マトリックスなどに入れます。残りの行を、4x4 マトリックスに既にある行と比較します。誰でも助けてもらえますか?

 Imgproc.Canny(diff, diff2, 100, 100, 3);

        Mat lines = new Mat();
        int threshold = 80;
        int minLineSize = 150;
        int lineGap = 80;
        Imgproc.HoughLinesP(diff2, lines, 1, Math.PI / 180, threshold, minLineSize, lineGap);
        double[][] linesFinal = new double[4][4];
        linesFinal[0] = lines.get(0, 0);

        double x01 = linesFinal[0][0],
                y01 = linesFinal[0][1],
                x02 = linesFinal[0][2],
                y02 = linesFinal[0][3];
        double a = y02 - y01 / x02 - x01;
        double b = y01 - a * x01;
        Log.i(TAG, "aaaaaaaaaaaaaaaaaaaaa:    " + String.valueOf(a) + "bbbbbbbbbb     " + String.valueOf(b));
        Point start0 = new Point(x01, y01);
        Point end0 = new Point(x02, y02);

        Core.circle(finaleuh, end0, 10, new Scalar(255, 0, 0, 255), 10);
        Core.circle(finaleuh, start0, 10, new Scalar(255, 0, 0, 255), 10);

        int index = 1;
        int x = 1;


        while (index < 4 && x < lines.cols()) {

            // Log.i(TAG,"xxxxxxxxxxxxxxxx:    "+ String.valueOf(x)+"   indeeeeeex      "+ String.valueOf(index));
            double[] vec = lines.get(0, x);
            double Xi1 = vec[0],
                    Yi1 = vec[1],
                    Xi2 = vec[2],
                    Yi2 = vec[3];
            double Ai = (Yi2 - Yi1) / (Xi2 - Xi1);
            double Bi = Yi1 - Ai * Xi1;
            //  Log.i(TAG,"aaaaaaaaaaaaaaaaaaaaa:    "+ String.valueOf(Ai)+ "bbbbbbbbbb     " + String.valueOf(Bi));

            int counter = 0;
            for (int i = 0; i < index; i++)

            {

                double xF = linesFinal[i][0],
                        yF = linesFinal[i][1],
                        xFF = linesFinal[i][2],
                        yFF = linesFinal[i][3];


                double aF = yFF - yF / xFF - xF;
                double bF = yF - aF * xF;
                Log.i(TAG, "aaaaaaaaaaaaaaaaaaaaa:    " + String.valueOf(aF) + "bbbbbbbbbb     " + String.valueOf(bF));

                double diffFA = Math.abs(aF - Ai);
                double diffFB = Math.abs(bF - Bi);

                if (diffFA > 250 && diffFB > 300) {
                    counter = counter + 1;


                }

            }


            if (counter == index)


            {
                linesFinal[index] = vec;
                double xF = linesFinal[index][0],
                        yF = linesFinal[index][1],
                        xFF = linesFinal[index][2],
                        yFF = linesFinal[index][3];

                Point startF = new Point(xF, yF);
                Point endF = new Point(xFF, yFF);
                Core.circle(finaleuh, endF, 10, new Scalar(255, 0, 0, 255), 10);
                Core.circle(finaleuh, startF, 10, new Scalar(255, 0, 0, 255), 10);
                index++;
                x++;
            } else {
                x++;
            }


        }
4

1 に答える 1

0

必要かもしれない人のために、結局整理しました。私は基本的に自分の線で 2 つのカテゴリを作成しました。各カテゴリでは、すべての線が平行です。最初の線の傾きを残りのすべての線と比較することでそれを行いました。次に、各カテゴリで、B の値を比較しました (方程式 y = Ax+B から)。4行だけで終わりました。

于 2015-12-14T12:27:14.630 に答える