OSDN Git Service

[更新]NyARToolkit
[nyartoolkit-and/nyartoolkit-and.git] / src / jp / nyatla / nyartoolkit / detector / NyARSingleDetectMarker.java
index 91c09a9..2545bb6 100644 (file)
@@ -33,44 +33,16 @@ package jp.nyatla.nyartoolkit.detector;
 \r
 import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.*;\r
-import jp.nyatla.nyartoolkit.core.match.*;\r
 import jp.nyatla.nyartoolkit.core.param.NyARParam;\r
-import jp.nyatla.nyartoolkit.core.pickup.*;\r
 import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
-import jp.nyatla.nyartoolkit.core.raster.*;\r
-import jp.nyatla.nyartoolkit.core.transmat.*;\r
-import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
 import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.NyARRasterFilter_ARToolkitThreshold;\r
 \r
 /**\r
  * 画像からARCodeに最も一致するマーカーを1個検出し、その変換行列を計算するクラスです。\r
  * \r
  */\r
-public class NyARSingleDetectMarker\r
+public class NyARSingleDetectMarker extends NyARCustomSingleDetectMarker\r
 {\r
-       private static final int AR_SQUARE_MAX = 100;\r
-\r
-       private boolean _is_continue = false;\r
-       private NyARMatchPatt_Color_WITHOUT_PCA _match_patt;\r
-       private INyARSquareDetector _square_detect;\r
-\r
-       private final NyARSquareStack _square_list = new NyARSquareStack(AR_SQUARE_MAX);\r
-\r
-       private NyARCode _code;\r
-\r
-       protected INyARTransMat _transmat;\r
-\r
-       private double _marker_width;\r
-\r
-       // 検出結果の保存用\r
-       private int _detected_direction;\r
-\r
-       private double _detected_confidence;\r
-\r
-       private NyARSquare _detected_square;\r
-\r
-       private INyARColorPatt _patt;\r
-\r
        /**\r
         * 検出するARCodeとカメラパラメータから、1個のARCodeを検出するNyARSingleDetectMarkerインスタンスを作ります。\r
         * \r
@@ -84,23 +56,9 @@ public class NyARSingleDetectMarker
         */\r
        public NyARSingleDetectMarker(NyARParam i_param, NyARCode i_code, double i_marker_width) throws NyARException\r
        {\r
-               final NyARIntSize scr_size=i_param.getScreenSize();             \r
-               // 解析オブジェクトを作る\r
-               this._square_detect = new NyARSquareDetector(i_param.getDistortionFactor(),scr_size);\r
-               this._transmat = new NyARTransMat(i_param);\r
-               // 比較コードを保存\r
-               this._code = i_code;\r
-               this._marker_width = i_marker_width;\r
-               // 評価パターンのホルダを作る\r
-               this._patt = new NyARColorPatt_O3(_code.getWidth(), _code.getHeight());\r
-               // 評価器を作る。\r
-               this._match_patt = new NyARMatchPatt_Color_WITHOUT_PCA();\r
-               //2値画像バッファを作る\r
-               this._bin_raster=new NyARBinRaster(scr_size.w,scr_size.h);\r
+               super(i_param,i_code,i_marker_width,new NyARRasterFilter_ARToolkitThreshold(100));\r
        }\r
 \r
-       NyARBinRaster _bin_raster;\r
-       NyARRasterFilter_ARToolkitThreshold _tobin_filter=new NyARRasterFilter_ARToolkitThreshold(100);\r
 \r
        /**\r
         * i_imageにマーカー検出処理を実行し、結果を記録します。\r
@@ -113,114 +71,7 @@ public class NyARSingleDetectMarker
         */\r
        public boolean detectMarkerLite(INyARRgbRaster i_raster,int i_threshold) throws NyARException\r
        {\r
-               //サイズチェック\r
-               if(!this._bin_raster.getSize().isEqualSize(i_raster.getSize())){\r
-                       throw new NyARException();\r
-               }\r
-\r
-               //ラスタを2値イメージに変換する.\r
-               this._tobin_filter.setThreshold(i_threshold);\r
-               this._tobin_filter.doFilter(i_raster,this._bin_raster);\r
-               \r
-               \r
-               this._detected_square = null;\r
-               NyARSquareStack l_square_list = this._square_list;\r
-               // スクエアコードを探す\r
-               this._square_detect.detectMarker(this._bin_raster, l_square_list);\r
-\r
-\r
-               int number_of_square = l_square_list.getLength();\r
-               // コードは見つかった?\r
-               if (number_of_square < 1) {\r
-                       return false;\r
-               }\r
-\r
-               // 評価基準になるパターンをイメージから切り出す\r
-               if (!this._patt.pickFromRaster(i_raster, (NyARSquare)l_square_list.getItem(0))) {\r
-                       // パターンの切り出しに失敗\r
-                       return false;\r
-               }\r
-               // パターンを評価器にセット\r
-               if (!this._match_patt.setPatt(this._patt)) {\r
-                       // 計算に失敗した。\r
-                       throw new NyARException();\r
-               }\r
-               // コードと比較する\r
-               this._match_patt.evaluate(this._code);\r
-               int square_index = 0;\r
-               int direction = this._match_patt.getDirection();\r
-               double confidence = this._match_patt.getConfidence();\r
-               for (int i = 1; i < number_of_square; i++) {\r
-                       // 次のパターンを取得\r
-                       this._patt.pickFromRaster(i_raster, (NyARSquare)l_square_list.getItem(i));\r
-                       // 評価器にセットする。\r
-                       this._match_patt.setPatt(this._patt);\r
-                       // コードと比較する\r
-                       this._match_patt.evaluate(this._code);\r
-                       double c2 = this._match_patt.getConfidence();\r
-                       if (confidence > c2) {\r
-                               continue;\r
-                       }\r
-                       // もっと一致するマーカーがあったぽい\r
-                       square_index = i;\r
-                       direction = this._match_patt.getDirection();\r
-                       confidence = c2;\r
-               }\r
-               // マーカー情報を保存\r
-               this._detected_square = (NyARSquare)l_square_list.getItem(square_index);\r
-               this._detected_direction = direction;\r
-               this._detected_confidence = confidence;\r
-               return true;\r
-       }\r
-\r
-       /**\r
-        * 検出したマーカーの変換行列を計算して、o_resultへ値を返します。\r
-        * 直前に実行したdetectMarkerLiteが成功していないと使えません。\r
-        * \r
-        * @param o_result\r
-        * 変換行列を受け取るオブジェクトを指定します。\r
-        * @throws NyARException\r
-        */\r
-       public void getTransmationMatrix(NyARTransMatResult o_result) throws NyARException\r
-       {\r
-               // 一番一致したマーカーの位置とかその辺を計算\r
-               if (this._is_continue) {\r
-                       this._transmat.transMatContinue(this._detected_square,this._detected_direction,this._marker_width, o_result);\r
-               } else {\r
-                       this._transmat.transMat(this._detected_square,this._detected_direction,this._marker_width, o_result);\r
-               }\r
-               return;\r
-       }\r
-\r
-       /**\r
-        * 検出したマーカーの一致度を返します。\r
-        * \r
-        * @return マーカーの一致度を返します。0~1までの値をとります。 一致度が低い場合には、誤認識の可能性が高くなります。\r
-        * @throws NyARException\r
-        */\r
-       public double getConfidence()\r
-       {\r
-               return this._detected_confidence;\r
-       }\r
-\r
-       /**\r
-        * 検出したマーカーの方位を返します。\r
-        * \r
-        * @return 0,1,2,3の何れかを返します。\r
-        */\r
-       public int getDirection()\r
-       {\r
-               return this._detected_direction;\r
-       }\r
-\r
-       /**\r
-        * getTransmationMatrixの計算モードを設定します。 初期値はTRUEです。\r
-        * \r
-        * @param i_is_continue\r
-        * TRUEなら、transMatCont互換の計算をします。 FALSEなら、transMat互換の計算をします。\r
-        */\r
-       public void setContinueMode(boolean i_is_continue)\r
-       {\r
-               this._is_continue = i_is_continue;\r
+               ((NyARRasterFilter_ARToolkitThreshold)this._tobin_filter).setThreshold(i_threshold);\r
+               return super.detectMarkerLite(i_raster);\r
        }\r
 }\r