チェンジセット 1752

差分発生行の前後
無視リスト:
コミット日時:
2008/10/29 19:01:00 (2 ヶ月前)
コミッタ:
tarotarorg
ログメッセージ:

キューブ型マーカの認識に向けて格闘中

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/FLARToolKit/trunk/samples/org/tarotaro/flash/ar/layers/FLARMultiMarkerLayer.as

    r1743 r1752  
    3838        import org.libspark.flartoolkit.core.raster.rgb.IFLARRgbRaster; 
    3939        import org.libspark.flartoolkit.core.transmat.FLARTransMatResult; 
    40         import org.libspark.flartoolkit.detector.CubeMarkerDetector; 
     40        import org.libspark.flartoolkit.detector.FLARMultiMarkerDetector; 
     41        import org.libspark.flartoolkit.detector.FLARMultiMarkerDetector; 
    4142        import org.libspark.flartoolkit.detector.FLARMultiMarkerDetectorResult; 
    4243         
     
    6263                { 
    6364                        super(src, thresh); 
    64                         this._detector = new CubeMarkerDetector(param, codeList, markerWidthList, codeList.length); 
     65                        this._detector = new FLARMultiMarkerDetector(param, codeList, markerWidthList, codeList.length); 
    6566                        this._detector.sizeCheckEnabled = false; 
    6667                        this._resultMat = new FLARTransMatResult(); 
  • as3/FLARToolKit/trunk/src/org/libspark/flartoolkit/core/raster/FLARRaster_BasicClass.as

    r1630 r1752  
    1 /*  
     1/*  
    22 * PROJECT: FLARToolKit 
    33 * -------------------------------------------------------------------------------- 
  • as3/FLARToolKit/trunk/src/org/libspark/flartoolkit/core/types/FLARIntSize.as

    r1630 r1752  
    1 /*  
     1/*  
    22 * PROJECT: FLARToolKit 
    33 * -------------------------------------------------------------------------------- 
     
    7676                        return false; 
    7777                } 
     78                 
     79                override public function toString():String  
     80                { 
     81                        return "(width=" + _size.w + " , height=" + this._size.h + ")"; 
     82                } 
    7883        } 
    7984} 
  • as3/FLARToolKit/trunk/src/org/libspark/flartoolkit/detector/CubeMarkerDetector.as

    r1743 r1752  
    2323 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
    2424 *  
    25  * For further information please contact. 
     25 * For further information of this Class please contact. 
    2626 *      http://www.libspark.org/wiki/saqoosha/FLARToolKit 
    27  *      <saq(at)saqoosha.net
     27 *      <taro(at)tarotaro.org
    2828 *  
    2929 */ 
     
    4949        import org.libspark.flartoolkit.core.transmat.IFLARTransMat; 
    5050        import org.libspark.flartoolkit.core.types.FLARIntSize;  
     51        import org.tarotaro.flash.ar.detector.CubeMarker; 
    5152 
    5253        /** 
     
    6970 
    7071                private var _codes:Array; // FLARCode[] 
     72                private var _marker:CubeMarker; 
    7173                private var _codeResult:Array; 
    7274 
     
    8284                private var _result_holder:FLARMultiMarkerDetectorResultHolder = new FLARMultiMarkerDetectorResultHolder(); 
    8385 
    84                 /** 
    85                  * 複数のマーカーを検出し、最も一致するARCodeをi_codeから検索するオブジェクトを作ります。 
    86                  *  
    87                  * @param i_param 
    88                  * カメラパラメータを指定します。 
    89                  * @param i_code        FLARCode[]  
    90                  * 検出するマーカーのARCode配列を指定します。配列要素のインデックス番号が、そのままgetARCodeIndex関数で 得られるARCodeインデックスになります。 例えば、要素[1]のARCodeに一致したマーカーである場合は、getARCodeIndexは1を返します。 
    91                  * 先頭からi_number_of_code個の要素には、有効な値を指定する必要があります。 
    92                  * @param i_marker_width        double[]  
    93                  * i_codeのマーカーサイズをミリメートルで指定した配列を指定します。 先頭からi_number_of_code個の要素には、有効な値を指定する必要があります。 
    94                  * @param i_number_of_code 
    95                  * i_codeに含まれる、ARCodeの数を指定します。 
    96                  * @throws FLARException 
    97                  */ 
    98                 public function CubeMarkerDetector(i_param:FLARParam, i_code:Array, i_marker_width:Array, i_number_of_code:int) { 
     86                 /** 
     87                  *  
     88                  * @param      i_param カメラパラメータを指定します。 
     89                  * @param      i_code  キューブ型マーカを指定します。 
     90                  */ 
     91                public function CubeMarkerDetector(i_param:FLARParam, i_code:CubeMarker) { 
     92                         
     93                        //scrとは、「screen」の略。srcの打ち間違いではない事に注意! 
    9994                        const scr_size:FLARIntSize = i_param.getScreenSize(); 
     95                         
    10096                        // 解析オブジェクトを作る 
    10197                        this._square_detect = new FLARSquareDetector(i_param.getDistortionFactor(), scr_size); 
    10298                        this._transmat = new FLARTransMat(i_param); 
     99                         
    103100                        // 比較コードを保存 
    104                         this._codes = i_code; 
    105                         this._codeResult = new Array(i_number_of_code); 
    106                         for (var r:int = 0; r < this._codeResult.length; r++) { 
    107                                 this._codeResult[r] = false; 
    108                         } 
    109                         // 比較コードの解像度は全部同じかな?(違うとパターンを複数種つくらないといけないから) 
    110                         const cw:int = i_code[0].getWidth(); 
    111                         const ch:int = i_code[0].getHeight(); 
    112                         for (var i:int = 1; i < i_number_of_code; i++) { 
    113                                 if (cw != i_code[i].getWidth() || ch != i_code[i].getHeight()) { 
    114                                         // 違う解像度のが混ざっている。 
    115                                         throw new FLARException(); 
    116                                 } 
    117                         } 
     101                        this._marker = i_code; 
     102 
    118103                        // 評価パターンのホルダを作る 
    119                         this._patt = new FLARColorPatt_O3(cw, ch); 
    120                         this._number_of_code = i_number_of_code; 
    121  
    122                         this._marker_width = i_marker_width; 
     104                        this._patt = new FLARColorPatt_O3(this._marker.top.getWidth(), this._marker.top.getWidth()); 
     105 
     106                        //マーカの幅を記録 
     107                        this._marker_width = this._marker.size; 
     108                         
    123109                        // 評価器を作る。 
    124110                        this._match_patt = new FLARMatchPatt_Color_WITHOUT_PCA(); 
     111                         
    125112                        //2値画像バッファを作る 
    126 //                      this._bin_raster = new FLARBinRaster(scr_size.w, scr_size.h); 
    127113                        this._bin_raster = new FLARRaster_BitmapData(scr_size.w, scr_size.h); 
    128114                } 
    129115 
     116                /** 
     117                 * #detectMarkerLiteで使用する作業領域 
     118                 */ 
    130119                private var _bin_raster:IFLARRaster; 
    131120 
    132 //              private var _tobin_filter:FLARRasterFilter_ARToolkitThreshold = new FLARRasterFilter_ARToolkitThreshold(100); 
     121                /** 
     122                 * #detectMarkerLiteで使用するフィルタ(画像を2値化) 
     123                 */ 
    133124                private var _tobin_filter:FLARRasterFilter_BitmapDataThreshold = new FLARRasterFilter_BitmapDataThreshold(100); 
    134125 
    135126                /** 
    136                  * i_imageにマーカー検出処理を実行し、結果を記録します。 
    137                  *  
     127                 * i_rasterにマーカー検出処理を実行し、結果を記録します。 
     128                 * 終了条件: 
     129                 * 1.一致度が0.9を超えるマーカが見つかった場合⇒そのマーカが一致とし、即時終了 
     130                 * 2.Squareに対する全マーカ発見後、一致度が0.75を超えるマーカが見つかり、かつそれがSquareに対する最高一致度⇒そのマーカが一致とみなす 
     131                 * 探索条件: 
     132                 * 1.Squareに対して最高一致度を出したマーカは、他のSquareで評価しない 
     133                 * 
    138134                 * @param i_raster 
    139135                 * マーカーを検出するイメージを指定します。 
     
    146142                        // サイズチェック 
    147143                        if(this._sizeCheckEnabled && !this._bin_raster.getSize().isEqualSizeO(i_raster.getSize())) { 
    148                                 throw new FLARException(); 
     144                                throw new FLARException("サイズ不一致(" + this._bin_raster.getSize() + ":" + i_raster.getSize()); 
    149145                        } 
    150146 
     
    153149                        this._tobin_filter.doFilter(i_raster, this._bin_raster); 
    154150 
     151                        // マーカ候補となるSquareを探す 
    155152                        var l_square_list:FLARSquareStack = this._square_list; 
    156                         // スクエアコードを探す 
    157153                        this._square_detect.detectMarker(this._bin_raster, l_square_list); 
    158154 
     155                        // マーカ候補となるSquareが1個も無い場合、終了 
    159156                        const number_of_square:int = l_square_list.getLength(); 
    160                         // コードは見つかった? 
    161157                        if (number_of_square < 1) { 
    162                                 // ないや。おしまい。 
    163                                 //return 0; 
    164158                                return null; 
    165159                        } 
     160 
    166161                        // 保持リストのサイズを調整 
    167162                        this._result_holder.reservHolder(number_of_square); 
    168163 
    169                         //あれの結果の初期化 
    170                         for (var r:int = 0; r < this._codeResult.length; r++) { 
    171                                 this._codeResult[r] = false; 
    172                         } 
    173  
    174                         // 1スクエア毎に、一致するコードを決定していく 
    175                         var i:int; 
    176                         var square:FLARSquare; 
    177                         var code_index:int; 
    178                         var confidence:Number; 
    179                         var direction:int; 
    180                         var i2:int; 
    181                         var c2:Number; 
    182                         for (i = 0; i < number_of_square; i++) { 
     164                        // Square毎に、一致するコードを決定していく 
     165                        var square:FLARSquare;  //検査対象のSquareを格納しておく 
     166                        var code_index:int;             // 
     167                        var confidence:Number;  //マーカパターンとSquareの一致度 
     168                        var direction:int;              //マーカの向き 
     169                        var i2:int;                             // 
     170                        var c2:Number;                  //一致度2 
     171                         
     172                        //Squareリストを走査する 
     173                        for (var i:int = 0; i < number_of_square; i++) { 
     174                                //Squareを取り出す 
    183175                                square = l_square_list.getItem(i) as FLARSquare; 
     176                                 
    184177                                // 評価基準になるパターンをイメージから切り出す 
    185178                                if (!this._patt.pickFromRaster(i_raster, square)) { 
     
    190183                                if (!this._match_patt.setPatt(this._patt)) { 
    191184                                        // 計算に失敗した。 
    192                                         throw new FLARException(); 
     185                                        throw new FLARException("パターンを評価器にセット:失敗!"); 
    193186                                } 
    194187                                // コードと順番に比較していく 
    195                                 code_index = 0; 
    196                                 _match_patt.evaluate(_codes[0]); 
     188                                 
     189                                 
     190                                //まずはTOPから 
     191                                _match_patt.evaluate(this._marker.top); 
    197192                                confidence = _match_patt.getConfidence(); 
    198193                                direction = _match_patt.getDirection(); 
    199                                 trace(i,0, confidence,"(",square.label.area,")"); 
     194                                if (confidence > 0.9) { 
     195                                        //終了条件1に一致 
     196                                        return ; 
     197                                } 
    200198                                for (i2 = 1; i2 < this._number_of_code; i2++) { 
    201199                                        if (this._codeResult[i2]) continue; 
  • as3/FLARToolKit/trunk/src/org/libspark/flartoolkit/detector/FLARMultiMarkerDetector.as

    r1743 r1752  
    141141                        // サイズチェック 
    142142                        if(this._sizeCheckEnabled && !this._bin_raster.getSize().isEqualSizeO(i_raster.getSize())) { 
    143                                 throw new FLARException(); 
     143                                throw new FLARException("サイズ不一致(" + this._bin_raster.getSize() + ":" + i_raster.getSize()); 
    144144                        } 
    145145