Example #1
0
        /**
         * 4ポイント限定のHomographyPointsGeometricallyConsistent関数
         * @param H
         * @param i_width
         * @param i_height
         * @return
         */
        virtual public bool geometricallyConsistent(HomographyMat H)
        {
            NyARDoublePoint2d[] x = NyARDoublePoint2d.createArray(4);
            x[0].x = 0;
            x[0].y = 0;
            x[1].x = this._w;
            x[1].y = 0;
            x[2].x = this._w;
            x[2].y = this._h;
            x[3].x = 0;
            x[3].y = this._h;
            NyARDoublePoint2d xp1       = new NyARDoublePoint2d();
            NyARDoublePoint2d xp2       = new NyARDoublePoint2d();
            NyARDoublePoint2d xp3       = new NyARDoublePoint2d();
            NyARDoublePoint2d first_xp1 = new NyARDoublePoint2d();
            NyARDoublePoint2d first_xp2 = new NyARDoublePoint2d();


            int x1_ptr = 0;
            //        int x2_ptr = 0+1;
            //        int x3_ptr = 0+2;

            NyARDoublePoint2d xp1_ptr = xp1;
            NyARDoublePoint2d xp2_ptr = xp2;
            NyARDoublePoint2d xp3_ptr = xp3;

            //
            // Check the first 3 points
            //
            MultiplyPointHomographyInhomogenous(xp1, H, x[x1_ptr]);
            MultiplyPointHomographyInhomogenous(xp2, H, x[x1_ptr + 1]);
            MultiplyPointHomographyInhomogenous(xp3, H, x[x1_ptr + 2]);

            first_xp1.setValue(xp1); //indexing.CopyVector2(first_xp1,0, xp1,0);
            first_xp2.setValue(xp2); //indexing.CopyVector2(first_xp2,0, xp2,0);
            //      public boolean Homography4PointsGeometricallyConsistent(float[] x1, float[] x2, float[] x3, float[] x4,float[] x1p,float[] x2p,float[] x3p,float[] x4p) {


            if (!Homography3PointsGeometricallyConsistent(
                    x[x1_ptr], x[x1_ptr + 1], x[x1_ptr + 2],
                    xp1_ptr, xp2_ptr, xp3_ptr))
            {
                return(false);
            }

            //
            // Check the remaining points
            //

            for (int i = 3; i < x.Length; i++)
            {
                x1_ptr += 1;
                MultiplyPointHomographyInhomogenous(xp1_ptr, H, x[x1_ptr + 2]);

                NyARDoublePoint2d tmp_ptr = xp1_ptr;
                xp1_ptr = xp2_ptr;
                xp2_ptr = xp3_ptr;
                xp3_ptr = tmp_ptr;

                if (!Homography3PointsGeometricallyConsistent(
                        x[x1_ptr], x[x1_ptr + 1], x[x1_ptr + 2],
                        xp1_ptr, xp2_ptr, xp3_ptr))
                {
                    return(false);
                }
            }

            //
            // Check the last 3 points
            //

            if (!Homography3PointsGeometricallyConsistent(
                    x[x1_ptr + 1], x[x1_ptr + 2], x[0],
                    xp2_ptr, xp3_ptr, first_xp1))
            {
                return(false);
            }
            if (!Homography3PointsGeometricallyConsistent(
                    x[x1_ptr + 2], x[0], x[2],
                    xp3_ptr, first_xp1, first_xp2))
            {
                return(false);
            }

            return(true);
        }