Beispiel #1
0
 public void detectMarkerCb(NyARSensor i_sensor, int i_th, NyARSquareContourDetector.CbHandler i_handler)
 {
     this._sd.detectMarker(i_sensor.GetGsImage(), i_th, i_handler);
 }
 public void detectMarkerCb(NyARSensor i_sensor, int i_th, NyARSquareContourDetector.CbHandler i_handler)
 {
     this._sd.detectMarker(i_sensor.GetGsImage(), i_th, i_handler);
 }
Beispiel #3
0
        /**
         * この関数は、入力したセンサ入力値から、インスタンスの状態を更新します。
         * 関数は、センサオブジェクトから画像を取得して、マーカ検出、一致判定、トラッキング処理を実行します。
         * @param i_sensor
         * {@link MarkerSystem}に入力する画像を含むセンサオブジェクト。
         * @throws NyARException
         */
        public void update(NyARSensor i_sensor)
        {
            long time_stamp = i_sensor.GetTimeStamp();

            //センサのタイムスタンプが変化していなければ何もしない。
            if (this._time_stamp == time_stamp)
            {
                return;
            }
            int th = _bin_threshold == THLESHOLD_AUTO?_hist_th.getThreshold(i_sensor.GetGsHistogram()) : _bin_threshold;

            //解析
            this._tracking_list.prepare();
            this._idmk_list.Prepare();
            this._armk_list.Prepare();
            this._psmk_list.Prepare();
            //検出
            this._on_sq_handler.prepare(i_sensor.GetPerspectiveCopy(), i_sensor.GetGsImage(), th);
            this._sqdetect.detectMarkerCb(i_sensor, th, this._on_sq_handler);

            //検出結果の反映処理
            _tracking_list.finish();
            _armk_list.Finish();
            _idmk_list.Finish();
            _psmk_list.Finish();

            //期限切れチェック
            for (int i = this._tracking_list.Count - 1; i >= 0; i--)
            {
                TMarkerData item = this._tracking_list[i];
                if (item.lost_count > this.lost_th)
                {
                    //連続で検出できなかった場合
                    item.life = 0;//活性off
                }
                else if (item.sq != null)
                {
                    //直前のsqを検出できた場合
                    if (!this._transmat.transMatContinue(item.sq, item.marker_offset, item.tmat, item.last_param.last_error, item.tmat, item.last_param))
                    {
                        if (!this._transmat.transMat(item.sq, item.marker_offset, item.tmat, item.last_param))
                        {
                            item.life = 0;//活性off
                        }
                    }
                }
            }
            //各ターゲットの更新
            for (int i = this._armk_list.Count - 1; i >= 0; i--)
            {
                TMarkerData target = this._armk_list[i];
                if (target.lost_count == 0)
                {
                    target.time_stamp = time_stamp;
                    //lifeが1(開始時検出のときのみ)
                    if (target.life != 1)
                    {
                        continue;
                    }
                    this._transmat.transMat(target.sq, target.marker_offset, target.tmat, target.last_param);
                }
            }
            for (int i = this._idmk_list.Count - 1; i >= 0; i--)
            {
                TMarkerData target = this._idmk_list[i];
                if (target.lost_count == 0)
                {
                    target.time_stamp = time_stamp;
                    //lifeが1(開始時検出のときのみ)
                    if (target.life != 1)
                    {
                        continue;
                    }
                    this._transmat.transMat(target.sq, target.marker_offset, target.tmat, target.last_param);
                }
            }
            for (int i = this._psmk_list.Count - 1; i >= 0; i--)
            {
                TMarkerData target = this._psmk_list[i];
                if (target.lost_count == 0)
                {
                    target.time_stamp = time_stamp;
                    //lifeが1(開始時検出のときのみ)
                    if (target.life != 1)
                    {
                        continue;
                    }
                    this._transmat.transMat(target.sq, target.marker_offset, target.tmat, target.last_param);
                }
            }
            //解析/
            //タイムスタンプを更新
            this._time_stamp = time_stamp;
            this._last_gs_th = th;
        }
        /**
         * この関数は、入力したセンサ入力値から、インスタンスの状態を更新します。
         * 関数は、センサオブジェクトから画像を取得して、マーカ検出、一致判定、トラッキング処理を実行します。
         * @param i_sensor
         * {@link MarkerSystem}に入力する画像を含むセンサオブジェクト。
         * @throws NyARException
         */
        public void update(NyARSensor i_sensor)
        {
            long time_stamp = i_sensor.GetTimeStamp();
              //センサのタイムスタンプが変化していなければ何もしない。
              if (this._time_stamp == time_stamp) {
            return;
              }
              int th = _bin_threshold == THLESHOLD_AUTO ? _hist_th.getThreshold(i_sensor.GetGsHistogram()) : _bin_threshold;
              //解析
              this._tracking_list.prepare();
              this._idmk_list.Prepare();
              this._armk_list.Prepare();
              this._psmk_list.Prepare();
              //検出
              this._on_sq_handler.prepare(i_sensor.GetPerspectiveCopy(), i_sensor.GetGsImage(), th);
              this._sqdetect.detectMarkerCb(i_sensor, th, this._on_sq_handler);

              //検出結果の反映処理
              _tracking_list.finish();
              _armk_list.Finish();
              _idmk_list.Finish();
              _psmk_list.Finish();

              //期限切れチェック
              for (int i = this._tracking_list.Count - 1; i >= 0; i--) {
            TMarkerData item = this._tracking_list[i];
            if (item.lost_count > this.lost_th) {
              //連続で検出できなかった場合
              item.life = 0;//活性off
            }
            else if (item.sq != null) {
              //直前のsqを検出できた場合
              if (!this._transmat.transMatContinue(item.sq, item.marker_offset, item.tmat, item.last_param.last_error, item.tmat, item.last_param)) {
            if (!this._transmat.transMat(item.sq, item.marker_offset, item.tmat, item.last_param)) {
              item.life = 0;//活性off
            }
              }
            }
              }
              //各ターゲットの更新
              for (int i = this._armk_list.Count - 1; i >= 0; i--) {
            TMarkerData target = this._armk_list[i];
            if (target.lost_count == 0) {
              target.time_stamp = time_stamp;
              //lifeが1(開始時検出のときのみ)
              if (target.life != 1) {
            continue;
              }
              this._transmat.transMat(target.sq, target.marker_offset, target.tmat, target.last_param);
            }
              }
              for (int i = this._idmk_list.Count - 1; i >= 0; i--) {
            TMarkerData target = this._idmk_list[i];
            if (target.lost_count == 0) {
              target.time_stamp = time_stamp;
              //lifeが1(開始時検出のときのみ)
              if (target.life != 1) {
            continue;
              }
              this._transmat.transMat(target.sq, target.marker_offset, target.tmat, target.last_param);
            }
              }
              for (int i = this._psmk_list.Count - 1; i >= 0; i--) {
            TMarkerData target = this._psmk_list[i];
            if (target.lost_count == 0) {
              target.time_stamp = time_stamp;
              //lifeが1(開始時検出のときのみ)
              if (target.life != 1) {
            continue;
              }
              this._transmat.transMat(target.sq, target.marker_offset, target.tmat, target.last_param);
            }
              }
              //解析/
              //タイムスタンプを更新
              this._time_stamp = time_stamp;
              this._last_gs_th = th;
        }