/**
  * RealityTargetに一致するID値を特定します。
  * 複数のパターンにヒットしたときは、一番初めにヒットした項目を返します。
  * @param i_target
  * Realityが検出したターゲット。
  * Unknownターゲットを指定すること。
  * @param i_rtsorce
  * i_targetを検出したRealitySourceインスタンス。
  * @param o_result
  * 返却値を格納するインスタンスを設定します。
  * 返却値がtrueの場合のみ、内容が更新されています。
  * @return
  * 特定に成功すると、trueを返します。
  * @throws NyARException
  */
 public bool identifyId(NyARRealityTarget i_target, NyARRealitySource i_rtsorce, IdentifyIdResult o_result)
 {
     //NyARDoublePoint2d[] i_vertex,NyARRgbRaster i_raster,SelectResult o_result
     return(this.identifyId(
                ((NyARRectTargetStatus)(i_target._ref_tracktarget._ref_status)).vertex,
                i_rtsorce.refRgbSource(),
                o_result));
 }
Example #2
0
 /**
  * i_targetの大きさを推定して、{@link UnknownRectInfo}に結果を保存します。この関数は{@link UnknownRectInfo}の状態を変化させるだけです。
  * @param i_target
  * 大きさを推定するターゲット。
  * @param io_result
  * 入出力パラメータ。前段までの推定結果と現在の推定値をマージして返します。
  * はじめてターゲットの推定をするときは、リセットした{@link UnknownRectInfo}を入力してください。
  * @return
  * 認識状況を返します。
  * @throws NyARException
  */
 public void detectCardDirection(NyARRealityTarget i_target,UnknownRectInfo io_result)
 {
     //成功点数が20点を超えたら推定完了。
     if(io_result._success_point>20){
         io_result.last_status=ESTIMATE_COMPLETE;
         return;
     }
     //10回失敗したら推定失敗
     if(io_result._failed>10){
         io_result.last_status=FAILED_ESTIMATE;
         return;
     }
     NyARDoublePoint2d[] pos=i_target.refTargetVertex();
     //正面から一回認識させてほしい。
     for(int i=0;i<4;i++){
         //正面判定。辺のなす角が90、または-90度の10度以内であること。
         if(getAbsSin(pos[0+i],pos[(1+i)%4],pos[(2+i)%4])<0.984){
             io_result.last_status=MORE_FRONT_CENTER;
             return;
         }
     }
     //線の長さを4本計算
     double d1=Math.Sqrt(pos[0].sqDist(pos[1]));
     double d2=Math.Sqrt(pos[1].sqDist(pos[2]));
     double d3=Math.Sqrt(pos[2].sqDist(pos[3]));
     double d4=Math.Sqrt(pos[3].sqDist(pos[0]));
     //現在の比率を計算
     double t,t2,t3;
     t=d1+d3*0.5;
     t2=d2+d4*0.5;
     t3=t/t2;
     t3=t3<1?1/t3:t3;
     if(io_result._target_serial==NyARRealityTarget.INVALID_REALITY_TARGET_ID){
         //サイクルをリセット
         io_result._target_serial=i_target.getSerialId();
         io_result.rate=t3;
         io_result._success_point=0;
         io_result._failed=0;
         io_result.artk_direction=t<t2?1:0;
     }else{
         if(io_result._target_serial!=i_target.getSerialId()){
             //ターゲットが一致しない。
             io_result.last_status=FAILED_TARGET_MISSMATCH;
             return;
         }
         if(t3/io_result.rate>0.98 && t3/io_result.rate<1.02)
         {
             io_result.rate=(io_result.rate+t3)*0.5;
             io_result._success_point++;
         }else{
             io_result._failed++;
         }
     }
     //推定中
     io_result.last_status=ESTIMATE_NOW;
     return;
 }
Example #3
0
        /**
         * 指定したシリアル番号のUnknownターゲットを、Knownターゲットへ移動します。
         * @param i_serial
         * ターゲットのシリアル番号を示す値
         * @param i_dir
         * ターゲットの予備知識。ARToolkitのdirectionでどの方位であるかを示す値
         * @param i_marker_width
         * ターゲットの予備知識。マーカーのサイズがいくらであるかを示す値[mm単位]
         * @return
         * 成功すると、trueを返します。
         * @throws NyARException
         */
        public bool changeTargetToKnownBySerial(long i_serial, int i_dir, double i_marker_width)
        {
            NyARRealityTarget item = this.target.getItemBySerial(i_serial);

            if (item == null)
            {
                return(false);
            }
            return(changeTargetToKnown(item, i_dir, i_marker_width));
        }
Example #4
0
        /**
         * 指定したシリアル番号のKnown/UnknownターゲットをDeadターゲットへ遷移します。
         * @param i_serial
         * @throws NyARException
         */
        public NyARRealityTarget changeTargetToDeadBySerial(long i_serial)
        {
            NyARRealityTarget item = this.target.getItemBySerial(i_serial);

            if (item == null)
            {
                return(null);
            }
            changeTargetToDead(item);
            return(item);
        }
Example #5
0
        /**
         * Realityターゲットリストの全ての項目のアップグレード処理を行います。この関数内でリスト要素の加算/減算/種別変更処理を行います。
         * {@link #progress}のサブ関数です。
         * @throws NyARException
         */
        private void updateLists()
        {
            NyARRealityTarget[] rt_array = this.target.getArray();

            for (int i = this.target.getLength() - 1; i >= 0; i--)
            {
                NyARRealityTarget tar = rt_array[i];
                if (tar._ref_tracktarget._delay_tick == 0)
                {
                    //30fps前後で1秒間の認識率とする。
                    tar.grab_rate += 3;
                    if (tar.grab_rate > 100)
                    {
                        tar.grab_rate = 100;
                    }
                    switch (tar._target_type)
                    {
                    case NyARRealityTarget.RT_DEAD:
                        //何もしない
                        continue;

                    case NyARRealityTarget.RT_KNOWN:
                        //矩形座標計算
                        setSquare(((NyARRectTargetStatus)(tar._ref_tracktarget._ref_status)).vertex, tar._screen_square);
                        //3d座標計算
                        //					this._transmat.transMat(tar._screen_square,tar._offset,tar._transform_matrix);
                        this._transmat.transMatContinue(tar._screen_square, tar._offset, tar._transform_matrix, tar._result_param.last_error, tar._transform_matrix, tar._result_param);
                        continue;

                    case NyARRealityTarget.RT_UNKNOWN:
                        continue;

                    default:
                        break;
                    }
                }
                else
                {
                    //更新をパスして補足レートの再計算(混ぜて8で割る)
                    tar.grab_rate = tar.grab_rate - (3 * tar._ref_tracktarget._delay_tick);
                    if (tar.grab_rate < 0)
                    {
                        tar.grab_rate = 0;
                    }
                }
            }
        }
Example #6
0
        //RealityTargetの編集関数

        /**
         * Realityターゲットリストへ新しい{@link NyARRealityTarget}を追加する。
         * @param i_track_target
         * UnknownTargetに関連付ける{@link NyARTarget}.このターゲットは、{@link NyARTargetStatus#ST_RECT}であること?
         */
        private NyARRealityTarget addUnknownTarget(NyARTarget i_track_target)
        {
            Debug.Assert(i_track_target._st_type == NyARTargetStatus.ST_RECT);
            NyARRealityTarget rt = this._pool.newNewTarget(i_track_target);

            if (rt == null)
            {
                return(null);
            }
            //個数制限
            if (this._number_of_unknown >= this.MAX_LIMIT_UNKNOWN)
            {
                return(null);
            }
            rt._target_type = NyARRealityTarget.RT_UNKNOWN;
            this.target.pushAssert(rt);
            this._number_of_unknown++;
            return(rt);
        }
Example #7
0
        /**
         * 指定したターゲットを、UnknownターゲットからKnownターゲットへ遷移させます。
         * @param i_item
         * 移動するターゲット
         * @param i_dir
         * ターゲットの予備知識。ARToolkitのdirectionでどの方位であるかを示す値
         * @param i_marker_width
         * ターゲットの予備知識。マーカーの高さがいくらであるかを示す値[mm単位]
         * @param i_marker_height
         * ターゲットの予備知識。マーカーの幅がいくらであるかを示す値[mm単位]
         * @return
         * 成功するとtrueを返します。
         * @throws NyARException
         */
        public bool changeTargetToKnown(NyARRealityTarget i_item, int i_dir, double i_marker_width, double i_marker_height)
        {
            //遷移元制限
            if (i_item._target_type != NyARRealityTarget.RT_UNKNOWN)
            {
                return(false);
            }
            //ステータス制限
            if (i_item._ref_tracktarget._st_type != NyARTargetStatus.ST_RECT)
            {
                return(false);
            }
            //個数制限
            if (this._number_of_known >= this.MAX_LIMIT_KNOWN)
            {
                return(false);
            }
            //ステータス制限
            i_item._target_type = NyARRealityTarget.RT_KNOWN;

            //マーカのサイズを決めておく。
            i_item._offset.setSquare(i_marker_width, i_marker_height);

            //directionに応じて、元矩形のrectを回転しておく。
            ((NyARRectTargetStatus)(i_item._ref_tracktarget._ref_status)).shiftByArtkDirection((4 - i_dir) % 4);
            //矩形セット
            NyARDoublePoint2d[] vx = ((NyARRectTargetStatus)(i_item._ref_tracktarget._ref_status)).vertex;
            for (int i = 3; i >= 0; i--)
            {
                i_item._screen_square.sqvertex[i].setValue(vx[i]);
                i_item._screen_square.line[i].makeLinearWithNormalize(vx[i], vx[(i + 1) % 4]);
            }
            //3d座標計算
            if (!this._transmat.transMat(i_item._screen_square, i_item._offset, i_item._transform_matrix, i_item._result_param))
            {
                return(false);
            }

            //数の調整
            this._number_of_unknown--;
            this._number_of_known++;
            return(true);
        }
Example #8
0
 /**
  * 指定したKnown,またはUnknownターゲットを、Deadターゲットにします。
  * Deadターゲットは次回のサイクルでRealityターゲットリストから削除され、一定のサイクル期間の間システムから無視されます。
  * @param i_item
  * @param i_dead_cycle
  * 無視するサイクルを指定します。1サイクルは1フレームです。デフォルトは50です。
  * @throws NyARException
  */
 public void changeTargetToDead(NyARRealityTarget i_item, int i_dead_cycle)
 {
     Debug.Assert(i_item._target_type == NyARRealityTarget.RT_UNKNOWN || i_item._target_type == NyARRealityTarget.RT_KNOWN);
     //IG検出して遷移した場合
     if (i_item._ref_tracktarget._st_type != NyARTargetStatus.ST_IGNORE)
     {
         //所有するトラックターゲットがIGNOREに設定
         this._tracker.changeStatusToIgnore(i_item._ref_tracktarget, i_dead_cycle);
     }
     //数の調整
     if (i_item._target_type == NyARRealityTarget.RT_UNKNOWN)
     {
         this._number_of_unknown--;
     }
     else
     {
         this._number_of_known--;
     }
     i_item._target_type = NyARRealityTarget.RT_DEAD;
     this._number_of_dead++;
     return;
 }
Example #9
0
	    public void Test()
	    {

		    try {
			    NyARParam param=NyARParam.createFromARParamFile(new StreamReader(PARAM_FILE));
			    param.changeScreenSize(320,240);
			    NyARReality reality=new NyARReality(param.getScreenSize(),10,1000,param.getPerspectiveProjectionMatrix(),null,10,10);
			    NyARRealitySource reality_in=new NyARRealitySource_Reference(320,240,null,2,100,NyARBufferType.BYTE1D_B8G8R8X8_32);

                //試験イメージの読み出し(320x240 BGRAのRAWデータ)
                StreamReader sr = new StreamReader(DATA_FILE);
                BinaryReader bs = new BinaryReader(sr.BaseStream);
                byte[] raw = bs.ReadBytes(320 * 240 * 4);
                Array.Copy(raw, (byte[])reality_in.refRgbSource().getBuffer(), raw.Length);
                
                
                Stopwatch sw = new Stopwatch();
                sw.Start();
			    for(int i=0;i<1000;i++){
				    reality.progress(reality_in);
			    }
                sw.Stop();
                Console.WriteLine(sw.ElapsedMilliseconds + "[ms]");    			
			    Console.WriteLine(reality.getNumberOfKnown());
			    Console.WriteLine(reality.getNumberOfUnknown());
			    Console.WriteLine(reality.getNumberOfDead());
                NyARRealityTarget[] rt = new NyARRealityTarget[10];
			    reality.selectUnKnownTargets(rt);
			    reality.changeTargetToKnown(rt[0],2,80);
			    Console.WriteLine(rt[0]._transform_matrix.m00+","+rt[0]._transform_matrix.m01+","+rt[0]._transform_matrix.m02+","+rt[0]._transform_matrix.m03);
			    Console.WriteLine(rt[0]._transform_matrix.m10+","+rt[0]._transform_matrix.m11+","+rt[0]._transform_matrix.m12+","+rt[0]._transform_matrix.m13);
			    Console.WriteLine(rt[0]._transform_matrix.m20+","+rt[0]._transform_matrix.m21+","+rt[0]._transform_matrix.m22+","+rt[0]._transform_matrix.m23);
			    Console.WriteLine(rt[0]._transform_matrix.m30+","+rt[0]._transform_matrix.m31+","+rt[0]._transform_matrix.m32+","+rt[0]._transform_matrix.m33);
		    } catch (Exception e) {
			   Console.WriteLine(e.StackTrace);
		    }
            return;
	    }
Example #10
0
        /**
         * RealityTargetに最も一致するパターンをテーブルから検索して、メタデータを返します。
         * @param i_target
         * Realityが検出したターゲット。
         * Unknownターゲットを指定すること。
         * @param i_rtsorce
         * i_targetを検出したRealitySourceインスタンス。
         * @param o_result
         * 返却値を格納するインスタンスを設定します。
         * 返却値がtrueの場合のみ、内容が更新されています。
         * @return
         * 特定に成功すると、trueを返します。
         * @throws NyARException
         */
        public bool getBestMatchTarget(NyARRealityTarget i_target, NyARRealitySource i_rtsorce, GetBestMatchTargetResult o_result)
        {
            //パターン抽出
            NyARMatchPattResult  tmp_patt_result = this.__tmp_patt_result;
            INyARPerspectiveCopy r = i_rtsorce.refPerspectiveRasterReader();

            r.copyPatt(i_target.refTargetVertex(), this._edge_x, this._edge_y, this._sample_per_pix, this._tmp_raster);
            //比較パターン生成
            this._deviation_data.setRaster(this._tmp_raster);
            int    ret = -1;
            int    dir = -1;
            double cf  = Double.MinValue;

            for (int i = this._table.getLength() - 1; i >= 0; i--)
            {
                this._match_patt.setARCode(this._table.getItem(i).code);
                this._match_patt.evaluate(this._deviation_data, tmp_patt_result);
                if (cf < tmp_patt_result.confidence)
                {
                    ret = i;
                    cf  = tmp_patt_result.confidence;
                    dir = tmp_patt_result.direction;
                }
            }
            if (ret < 0)
            {
                return(false);
            }
            //戻り値を設定
            MarkerTable.SerialTableRow row = this._table.getItem(ret);
            o_result.artk_direction = dir;
            o_result.confidence     = cf;
            o_result.idtag          = row.idtag;
            o_result.marker_height  = row.marker_height;
            o_result.marker_width   = row.marker_width;
            o_result.name           = row.name;
            return(true);
        }
Example #11
0
        /**
         * このターゲットについて、非同期に認識依頼を出します。このプログラムはサンプルなので、別スレッドでIDマーカ判定をして、
         * 三秒後に適当なサイズとDirectionを返却するだけです。
         * @param i_target
         * @return
         * @throws NyARException
         */
        public void requestAsyncMarkerDetect(NyARReality i_reality, NyARRealitySource i_source, NyARRealityTarget i_target)
        {
            //ターゲットから画像データなどを取得するときは、スレッドからではなく、ここで同期して取得してコピーしてからスレッドに引き渡します。

            //100x100の領域を切りだして、Rasterを作る。
            NyARRgbRaster raster = new NyARRgbRaster(100, 100, NyARBufferType.INT1D_X8R8G8B8_32);

            i_reality.getRgbPatt2d(i_source, i_target.refTargetVertex(), 1, raster);
            //コピーしたラスタとターゲットのIDをスレッドへ引き渡す。
            Thread t = new Thread(new AsyncThread(this, i_target.getSerialId(), raster).run);

            t.Start();
            return;
        }
Example #12
0
	    /**
	     * Unknownターゲットを検索して、配列に返します。
	     * @param o_result
	     * 結果を格納する配列です。格納されるターゲットの最大数は、コンストラクタの設定値と同じです。
	     * 配列サイズが不足した場合は、発見した順に最大数を返します。
	     * @return
	     * 配列に格納したターゲットの数を返します。
	     */
	    public int selectUnKnownTargets(NyARRealityTarget[] o_result)
	    {
		    return this.target.selectTargetsByType(NyARRealityTarget.RT_UNKNOWN, o_result);
	    }
Example #13
0
	    /**
	     * 指定したKnown,またはUnknownターゲットを、Deadターゲットにします。
	     * Deadターゲットは次回のサイクルでRealityターゲットリストから削除され、一定のサイクル期間の間システムから無視されます。
	     * @param i_item
	     * @param i_dead_cycle
	     * 無視するサイクルを指定します。1サイクルは1フレームです。デフォルトは50です。
	     * @throws NyARException 
	     */
	    public void changeTargetToDead(NyARRealityTarget i_item,int i_dead_cycle)
	    {
            Debug.Assert(i_item._target_type == NyARRealityTarget.RT_UNKNOWN || i_item._target_type == NyARRealityTarget.RT_KNOWN);
		    //IG検出して遷移した場合
		    if(i_item._ref_tracktarget._st_type!=NyARTargetStatus.ST_IGNORE){
			    //所有するトラックターゲットがIGNOREに設定
			    this._tracker.changeStatusToIgnore(i_item._ref_tracktarget,i_dead_cycle);
		    }
		    //数の調整
		    if(i_item._target_type==NyARRealityTarget.RT_UNKNOWN){
			    this._number_of_unknown--;
		    }else{
			    this._number_of_known--;
		    }
		    i_item._target_type=NyARRealityTarget.RT_DEAD;
		    this._number_of_dead++;
		    return;
	    }
Example #14
0
	    /**
	     * 指定したKnown,またはUnknownターゲットを、50サイクルの間Deadターゲットにします。
	     * Deadターゲットは次回のサイクルでRealityターゲットリストから削除され、一定のサイクル期間の間システムから無視されます。
	     * @param i_item
	     * @throws NyARException 
	     */	
	    public void changeTargetToDead(NyARRealityTarget i_item)
	    {
		    changeTargetToDead(i_item,50);
	    }
Example #15
0
	    /**
	     * 指定したターゲットを、UnknownターゲットからKnownターゲットへ遷移させます。
	     * @param i_item
	     * 移動するターゲット
	     * @param i_dir
	     * ターゲットの予備知識。ARToolkitのdirectionでどの方位であるかを示す値
	     * @param i_marker_width
	     * ターゲットの予備知識。マーカーの高さがいくらであるかを示す値[mm単位]
	     * @param i_marker_height
	     * ターゲットの予備知識。マーカーの幅がいくらであるかを示す値[mm単位]
	     * @return
	     * 成功するとtrueを返します。
	     * @throws NyARException 
	     */
        public bool changeTargetToKnown(NyARRealityTarget i_item, int i_dir, double i_marker_width, double i_marker_height)
	    {
		    //遷移元制限
		    if(i_item._target_type!=NyARRealityTarget.RT_UNKNOWN){
			    return false;
		    }
		    //ステータス制限
		    if(i_item._ref_tracktarget._st_type!=NyARTargetStatus.ST_RECT){
			    return false;
		    }
		    //個数制限
		    if(this._number_of_known>=this.MAX_LIMIT_KNOWN)
		    {
			    return false;
		    }
		    //ステータス制限
		    i_item._target_type=NyARRealityTarget.RT_KNOWN;
    		
		    //マーカのサイズを決めておく。
		    i_item._offset.setSquare(i_marker_width,i_marker_height);
    		
		    //directionに応じて、元矩形のrectを回転しておく。
		    ((NyARRectTargetStatus)(i_item._ref_tracktarget._ref_status)).shiftByArtkDirection((4-i_dir)%4);		
		    //矩形セット
		    NyARDoublePoint2d[] vx=((NyARRectTargetStatus)(i_item._ref_tracktarget._ref_status)).vertex;
		    for(int i=3;i>=0;i--){
			    i_item._screen_square.sqvertex[i].setValue(vx[i]);
			    i_item._screen_square.line[i].makeLinearWithNormalize(vx[i],vx[(i+1)%4]);
		    }
            //3d座標計算
            if (!this._transmat.transMat(i_item._screen_square, i_item._offset, i_item._transform_matrix, i_item._result_param))
            {
                return false;
            }
    		
		    //数の調整
		    this._number_of_unknown--;
		    this._number_of_known++;
		    return true;
	    }
Example #16
0
 /**
  * Unknown/Knownを維持できる条件を書きます。
  * @param i_target
  * @return
  */
 private bool isTargetAlive(NyARRealityTarget i_target)
 {
     return(i_target._ref_tracktarget._st_type == NyARTargetStatus.ST_RECT);
 }
Example #17
0
 /**
  * 指定したKnown,またはUnknownターゲットを、50サイクルの間Deadターゲットにします。
  * Deadターゲットは次回のサイクルでRealityターゲットリストから削除され、一定のサイクル期間の間システムから無視されます。
  * @param i_item
  * @throws NyARException
  */
 public void changeTargetToDead(NyARRealityTarget i_item)
 {
     changeTargetToDead(i_item, 50);
 }
Example #18
0
        ////////////////////////////////////////////////////////////////////////////////
        //Public:
        //RealityTargetの操作関数
        //
        ////////////////////////////////////////////////////////////////////////////////

        /**
         * 指定したターゲットを、UnknownターゲットからKnownターゲットへ遷移させます。
         * @param i_item
         * 移動するターゲット
         * @param i_dir
         * ターゲットの予備知識。ARToolkitのdirectionでどの方位であるかを示す値
         * @param i_marker_size
         * ターゲットの予備知識。マーカーの高さ/幅がいくらであるかを示す値[mm単位]
         * @return
         * 成功するとtrueを返します。
         * @throws NyARException
         */
        public bool changeTargetToKnown(NyARRealityTarget i_item, int i_dir, double i_marker_size)
        {
            return(changeTargetToKnown(i_item, i_dir, i_marker_size, i_marker_size));
        }
Example #19
0
        /**
         * i_targetの大きさを推定して、{@link UnknownRectInfo}に結果を保存します。この関数は{@link UnknownRectInfo}の状態を変化させるだけです。
         * @param i_target
         * 大きさを推定するターゲット。
         * @param io_result
         * 入出力パラメータ。前段までの推定結果と現在の推定値をマージして返します。
         * はじめてターゲットの推定をするときは、リセットした{@link UnknownRectInfo}を入力してください。
         * @return
         * 認識状況を返します。
         * @throws NyARException
         */
        public void detectCardDirection(NyARRealityTarget i_target, UnknownRectInfo io_result)
        {
            //成功点数が20点を超えたら推定完了。
            if (io_result._success_point > 20)
            {
                io_result.last_status = ESTIMATE_COMPLETE;
                return;
            }
            //10回失敗したら推定失敗
            if (io_result._failed > 10)
            {
                io_result.last_status = FAILED_ESTIMATE;
                return;
            }
            NyARDoublePoint2d[] pos = i_target.refTargetVertex();
            //正面から一回認識させてほしい。
            for (int i = 0; i < 4; i++)
            {
                //正面判定。辺のなす角が90、または-90度の10度以内であること。
                if (getAbsSin(pos[0 + i], pos[(1 + i) % 4], pos[(2 + i) % 4]) < 0.984)
                {
                    io_result.last_status = MORE_FRONT_CENTER;
                    return;
                }
            }
            //線の長さを4本計算
            double d1 = Math.Sqrt(pos[0].sqDist(pos[1]));
            double d2 = Math.Sqrt(pos[1].sqDist(pos[2]));
            double d3 = Math.Sqrt(pos[2].sqDist(pos[3]));
            double d4 = Math.Sqrt(pos[3].sqDist(pos[0]));
            //現在の比率を計算
            double t, t2, t3;

            t  = d1 + d3 * 0.5;
            t2 = d2 + d4 * 0.5;
            t3 = t / t2;
            t3 = t3 < 1?1 / t3:t3;
            if (io_result._target_serial == NyARRealityTarget.INVALID_REALITY_TARGET_ID)
            {
                //サイクルをリセット
                io_result._target_serial = i_target.getSerialId();
                io_result.rate           = t3;
                io_result._success_point = 0;
                io_result._failed        = 0;
                io_result.artk_direction = t < t2?1:0;
            }
            else
            {
                if (io_result._target_serial != i_target.getSerialId())
                {
                    //ターゲットが一致しない。
                    io_result.last_status = FAILED_TARGET_MISSMATCH;
                    return;
                }
                if (t3 / io_result.rate > 0.98 && t3 / io_result.rate < 1.02)
                {
                    io_result.rate = (io_result.rate + t3) * 0.5;
                    io_result._success_point++;
                }
                else
                {
                    io_result._failed++;
                }
            }
            //推定中
            io_result.last_status = ESTIMATE_NOW;
            return;
        }
Example #20
0
	    /**
	     * Unknown/Knownを維持できる条件を書きます。
	     * @param i_target
	     * @return
	     */
        private bool isTargetAlive(NyARRealityTarget i_target)
	    {
		    return i_target._ref_tracktarget._st_type==NyARTargetStatus.ST_RECT;
	    }
        /**
         * このターゲットについて、非同期に認識依頼を出します。このプログラムはサンプルなので、別スレッドでIDマーカ判定をして、
         * 三秒後に適当なサイズとDirectionを返却するだけです。
         * @param i_target
         * @return
         * @throws NyARException
         */
        public void requestAsyncMarkerDetect(NyARReality i_reality,NyARRealitySource i_source,NyARRealityTarget i_target)
        {
            //ターゲットから画像データなどを取得するときは、スレッドからではなく、ここで同期して取得してコピーしてからスレッドに引き渡します。

            //100x100の領域を切りだして、Rasterを作る。
            NyARRgbRaster raster=new NyARRgbRaster(100,100,NyARBufferType.INT1D_X8R8G8B8_32);
            i_reality.getRgbPatt2d(i_source, i_target.refTargetVertex(),1, raster);
            //コピーしたラスタとターゲットのIDをスレッドへ引き渡す。
            Thread t=new Thread(new AsyncThread(this,i_target.getSerialId(),raster).run);
            t.Start();
            return;
        }
Example #22
0
	    ////////////////////////////////////////////////////////////////////////////////
	    //Public:
	    //RealityTargetの操作関数
	    //
	    ////////////////////////////////////////////////////////////////////////////////

	    /**
	     * 指定したターゲットを、UnknownターゲットからKnownターゲットへ遷移させます。
	     * @param i_item
	     * 移動するターゲット
	     * @param i_dir
	     * ターゲットの予備知識。ARToolkitのdirectionでどの方位であるかを示す値
	     * @param i_marker_size
	     * ターゲットの予備知識。マーカーの高さ/幅がいくらであるかを示す値[mm単位]
	     * @return
	     * 成功するとtrueを返します。
	     * @throws NyARException 
	     */
        public bool changeTargetToKnown(NyARRealityTarget i_item, int i_dir, double i_marker_size)
	    {
		    return changeTargetToKnown(i_item,i_dir,i_marker_size,i_marker_size);
	    }