/**
         * この関数は、入力したセンサ入力値から、インスタンスの状態を更新します。
         * 関数は、センサオブジェクトから画像を取得して、マーカ検出、一致判定、トラッキング処理を実行します。
         * @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 = this._bin_threshold == THLESHOLD_AUTO?this._hist_th.getThreshold(i_sensor.getGsHistogram()) : this._bin_threshold;

            this._sq_stack.clear();    //矩形情報の保持スタック初期化
            //解析
            this._tracking_list.prepare();
            this._idmk_list.prepare();
            this._armk_list.prepare();
            //検出処理
            this._on_sq_handler._ref_input_rfb = i_sensor.getPerspectiveCopy();
            this._on_sq_handler._ref_input_gs  = i_sensor.getGsImage();
            //検出
            this._sqdetect.detectMarkerCb(i_sensor, th, this._on_sq_handler);

            //検出結果の反映処理
            this._tracking_list.finish();
            this._armk_list.finish();
            this._idmk_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
                }
            }
            //各ターゲットの更新
            for (int i = this._armk_list.Count - 1; i >= 0; i--)
            {
                MarkerInfoARMarker target = this._armk_list[i];
                if (target.lost_count == 0)
                {
                    target.time_stamp = time_stamp;
                    this._transmat.transMatContinue(target.sq, target.marker_offset, target.tmat, target.tmat);
                }
            }
            for (int i = this._idmk_list.Count - 1; i >= 0; i--)
            {
                MarkerInfoNyId target = this._idmk_list[i];
                if (target.lost_count == 0)
                {
                    target.time_stamp = time_stamp;
                    this._transmat.transMatContinue(target.sq, target.marker_offset, target.tmat, target.tmat);
                }
            }
            //解析/
            //タイムスタンプを更新
            this._time_stamp = time_stamp;
            this._last_gs_th = th;
        }
예제 #2
0
        public void update(NyARSensor i_sensor)
        {
            long time_stamp = i_sensor.getTimeStamp();

            if (this._time_stamp == time_stamp)
            {
                return;
            }
            int th = this._bin_threshold == THLESHOLD_AUTO
                ? this._hist_th.getThreshold(i_sensor.getGsHistogram())
                : this._bin_threshold;

            if (this.ThresholdValue != -1)
            {
                th = this.ThresholdValue;
            }

            //解析
            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);

            //検出結果の反映処理
            this._tracking_list.finish();
            this._armk_list.finish();
            this._idmk_list.finish();
            this._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;
                }
                else if (item.sq != null)
                {
                    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;
                        }
                    }
                }
            }
            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;
                    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;
                    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;
                    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
         * 画像を含むセンサオブジェクト
         */
        public void update(NyARSensor i_sensor)
        {
            long time_stamp = i_sensor.getTimeStamp();

            //センサのタイムスタンプが変化していなければ何もしない。
            if (this._last_time_stamp == time_stamp)
            {
                return;
            }
            //タイムスタンプの更新
            this._last_time_stamp = time_stamp;

            //ステータス遷移


            NyARDoublePoint2d[]  pos2d = this._pos2d;
            NyARDoublePoint3d[]  pos3d = this._pos3d;
            INyARGrayscaleRaster gs    = i_sensor.getGsImage();

            //KPMスレッドによる更新()
            this._kpm_worker.updateInputImage(gs);

            //SurfaceTrackingによるfrontデータの更新

            foreach (NftTarget target in this._nftdatalist)
            {
                if (target.stage < NftTarget.ST_KPM_FOUND)
                {
                    //System.out.println("NOTHING");
                    //KPM検出前なら何もしない。
                    continue;
                }
                switch (target.stage)
                {
                case NftTarget.ST_AR2_TRACKING:
                    //NftTarget.ST_AR2_TRACKING以降
                    //front_transmatに作る。
                    NyARSurfaceTracker st = this._surface_tracker;
                    int nop = st.tracking(gs, target.dataset.surface_dataset, target.front_transmat, this._pos2d, pos3d, 16);
                    if (nop == 0)
                    {
                        //失敗
                        target.stage = NftTarget.ST_KPM_SEARCH;
                        //System.out.println("ST_KPM_SEARCH");
                        continue;
                    }
                    //Transmatの試験
                    NyARDoublePoint3d off = NyARSurfaceTrackingTransmatUtils.centerOffset(pos3d, nop, new NyARDoublePoint3d());
                    NyARSurfaceTrackingTransmatUtils.modifyInputOffset(target.front_transmat, pos3d, nop, off);    //ARTK5の補正
                    if (!this._sftrackingutils.surfaceTrackingTransmat(target.front_transmat, pos2d, pos3d, nop, target.front_transmat, this.result_param))
                    {
                        //失敗
                        target.stage = NftTarget.ST_KPM_SEARCH;
                        //System.out.println("ST_KPM_SEARCH");
                        continue;
                    }
                    NyARSurfaceTrackingTransmatUtils.restoreOutputOffset(target.front_transmat, off);    //ARTK5の補正
                    break;

                case NftTarget.ST_KPM_FOUND:
                    target.stage = NftTarget.ST_AR2_TRACKING;
                    //System.out.println("ST_AR2_TRACKING");
                    break;
                }
            }
        }
예제 #4
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 = this._bin_threshold == THLESHOLD_AUTO?this._hist_th.getThreshold(i_sensor.getGsHistogram()) : this._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);

            //検出結果の反映処理
            this._tracking_list.finish();
            this._armk_list.finish();
            this._idmk_list.finish();
            this._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=this._bin_threshold==THLESHOLD_AUTO?this._hist_th.getThreshold(i_sensor.getGsHistogram()):this._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);

		//検出結果の反映処理
		this._tracking_list.finish();
		this._armk_list.finish();
		this._idmk_list.finish();
        this._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=this._bin_threshold==THLESHOLD_AUTO?this._hist_th.getThreshold(i_sensor.getGsHistogram()):this._bin_threshold;
            this._sq_stack.clear();//矩形情報の保持スタック初期化
            //解析
            this._tracking_list.prepare();
            this._idmk_list.prepare();
            this._armk_list.prepare();
            //検出処理
            this._on_sq_handler._ref_input_rfb=i_sensor.getPerspectiveCopy();
            this._on_sq_handler._ref_input_gs=i_sensor.getGsImage();
            //検出
            this._sqdetect.detectMarkerCb(i_sensor,th,this._on_sq_handler);

            //検出結果の反映処理
            this._tracking_list.finish();
            this._armk_list.finish();
            this._idmk_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
            }
            }
            //各ターゲットの更新
            for(int i=this._armk_list.Count-1;i>=0;i--){
            MarkerInfoARMarker target=this._armk_list[i];
            if(target.lost_count==0){
                target.time_stamp=time_stamp;
                this._transmat.transMatContinue(target.sq,target.marker_offset,target.tmat,target.tmat);
            }
            }
            for(int i=this._idmk_list.Count-1;i>=0;i--){
            MarkerInfoNyId target=this._idmk_list[i];
            if(target.lost_count==0){
                target.time_stamp=time_stamp;
                this._transmat.transMatContinue(target.sq,target.marker_offset,target.tmat,target.tmat);
            }
            }
            //解析/
            //タイムスタンプを更新
            this._time_stamp=time_stamp;
            this._last_gs_th=th;
        }