/**
         * 画面上の点が、このターゲットを包括する矩形の内側にあるかを判定します。
         * この関数は、Known/Unknownターゲットに使用できます。
         * @param i_x
         * @param i_y
         * @return
         * <p>メモ:この関数にはnewが残ってるので注意</p>
         */
        public bool isInnerRectPoint2d(int i_x, int i_y)
        {
            Debug.Assert(this._target_type == RT_UNKNOWN || this._target_type == RT_KNOWN);
            NyARIntRect rect = new NyARIntRect();

            NyARDoublePoint2d[] vx = ((NyARRectTargetStatus)(this._ref_tracktarget._ref_status)).vertex;
            rect.setAreaRect(vx, 4);
            return(rect.isInnerPoint(i_x, i_y));
        }
Exemple #2
0
        /**
         * このデータが初期チェック(CoordからRectへの遷移)をパスするかチェックします。
         * 条件は、
         *  1.検出四角形の対角点は元の検出矩形内か?
         *  2.一番長い辺と短い辺の比は、0.1~10の範囲か?
         *  3.位置倍長い辺、短い辺が短すぎないか?
         * @param i_sample_area
         * この矩形を検出するために使った元データの範囲(ターゲット検出範囲)
         */
        private bool checkInitialRectCondition(NyARIntRect i_sample_area)
        {
            NyARDoublePoint2d[] this_vx = this.vertex;

            //検出した四角形の対角点が検出エリア内か?
            int cx = (int)(this_vx[0].x + this_vx[1].x + this_vx[2].x + this_vx[3].x) / 4;
            int cy = (int)(this_vx[0].y + this_vx[1].y + this_vx[2].y + this_vx[3].y) / 4;

            if (!i_sample_area.isInnerPoint(cx, cy))
            {
                return(false);
            }


            //一番長い辺と短い辺の比を確認(10倍の比があったらなんか変)
            int max = int.MinValue;
            int min = int.MaxValue;

            for (int i = 0; i < 4; i++)
            {
                int t = (int)this_vx[i].sqDist(this_vx[(i + 1) % 4]);
                if (t > max)
                {
                    max = t;
                }
                if (t < min)
                {
                    min = t;
                }
            }
            //比率係数の確認
            if (max < (5 * 5) || min < (5 * 5))
            {
                return(false);
            }
            //10倍スケールの2乗
            if ((10 * 10) * min / max < (3 * 3))
            {
                return(false);
            }
            return(true);
        }
Exemple #3
0
        /**
         * 輪郭情報を元に矩形パラメータを推定し、値をセットします。
         * この関数は、処理の成功失敗に関わらず、内容変更を行います。
         * @param i_contour_status
         * 関数を実行すると、このオブジェクトの内容は破壊されます。
         * @return
         * @throws NyARException
         */
        public bool setValueWithInitialCheck(NyARContourTargetStatus i_contour_status, NyARIntRect i_sample_area)
        {
            //ベクトルのマージ(マージするときに、3,4象限方向のベクトルは1,2象限のベクトルに変換する。)
            i_contour_status.vecpos.limitQuadrantTo12();
            this._ref_my_pool._vecpos_op.margeResembleCoords(i_contour_status.vecpos);
            if (i_contour_status.vecpos.length < 4)
            {
                return(false);
            }

            //キーベクトルを取得
            i_contour_status.vecpos.getKeyCoord(this._ref_my_pool._indexbuf);
            //点に変換
            NyARDoublePoint2d[] this_vx = this.vertex;
            if (!this._ref_my_pool._line_detect.line2SquareVertex(this._ref_my_pool._indexbuf, this_vx))
            {
                return(false);
            }

            //		//点から直線を再計算
            //		for(int i=3;i>=0;i--){
            //			this_sq.line[i].makeLinearWithNormalize(this_sq.sqvertex[i],this_sq.sqvertex[(i+1)%4]);
            //		}
            this.setEstimateParam(null);
            if (!checkInitialRectCondition(i_sample_area))
            {
                return(false);
            }
            this.detect_type = DT_SQINIT;
            return(true);
        }