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