OSDN Git Service

[NyARToolKit for java]update document
[nyartoolkit-and/nyartoolkit-and.git] / lib / src / jp / nyatla / nyartoolkit / nyidmarker / NyIdMarkerPickup.java
index aec8562..b0e9fed 100644 (file)
@@ -31,13 +31,111 @@ import jp.nyatla.nyartoolkit.core.types.*;
 import jp.nyatla.nyartoolkit.core.utils.*;\r
 \r
 \r
+/**\r
+ * このクラスは、ラスタ画像に定義したの任意矩形から、NyIdパターンのデータを読み取ります。\r
+ * 読み取り結果は、{@link NyARIdMarkerData}クラスのオブジェクト出力します。\r
+ *\r
+ */\r
+public class NyIdMarkerPickup\r
+{\r
+       private PerspectivePixelReader _perspective_reader;\r
+       private final PerspectivePixelReader.TThreshold __pickFromRaster_th=new PerspectivePixelReader.TThreshold();\r
+       private final MarkerPattEncoder __pickFromRaster_encoder=new MarkerPattEncoder();\r
+\r
+       /**\r
+        * コンストラクタです。インスタンスを生成します。\r
+        */\r
+       public NyIdMarkerPickup()\r
+       {\r
+               this._perspective_reader=new PerspectivePixelReader();\r
+               return;\r
+       }\r
+       /**\r
+        * この関数は、ラスタからNyIdマーカの情報を読み出します。\r
+        * @param image\r
+        * NyIdマーカが撮影されている(見込みのある)ラスタ\r
+        * @param i_vertex\r
+        * マーカの頂点位置を示す配列。4要素である事。\r
+        * @param o_data\r
+        * 抽出したパターンデータを格納するオブジェクト。\r
+        * @param o_param\r
+        * 抽出したパターンパラメータを格納するオブジェクト。\r
+        * @return\r
+        * 抽出に成功するとtrue.失敗するとfalseです。\r
+        * @throws NyARException\r
+        */\r
+       public final boolean pickFromRaster(INyARRgbRaster image, NyARDoublePoint2d[] i_vertex,NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
+       {\r
+               //遠近法のパラメータを計算\r
+               if(!this._perspective_reader.setSourceSquare(i_vertex)){\r
+                       return false;\r
+               }\r
+               return this._pickFromRaster(image,o_data,o_param);\r
+       }\r
+       /**\r
+        * この関数は、ラスタからNyIdマーカの情報を読み出します。\r
+        * @param image\r
+        * NyIdマーカが撮影されている(見込みのある)ラスタ\r
+        * @param i_vertex\r
+        * マーカの頂点位置を示す配列。4要素である事。\r
+        * @param o_data\r
+        * 抽出したパターンデータを格納するオブジェクト。\r
+        * @param o_param\r
+        * 抽出したパターンパラメータを格納するオブジェクト。\r
+        * @return\r
+        * 抽出に成功するとtrue.失敗するとfalseです。\r
+        * @throws NyARException\r
+        */\r
+       public final boolean pickFromRaster(INyARRgbRaster image, NyARIntPoint2d[] i_vertex,NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
+       {\r
+               if(!this._perspective_reader.setSourceSquare(i_vertex)){\r
+                       return false;\r
+               }\r
+               return this._pickFromRaster(image,o_data,o_param);\r
+       }\r
+       \r
+       /**\r
+        * i_imageから、idマーカを読みだします。\r
+        * o_dataにはマーカデータ、o_paramにはマーカのパラメータを返却します。\r
+        * @param image\r
+        * @param i_vertex\r
+        * @param o_data\r
+        * @param o_param\r
+        * @return\r
+        * @throws NyARException\r
+        */\r
+       private final boolean _pickFromRaster(INyARRgbRaster image, NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
+       {\r
+               INyARRgbPixelReader reader=image.getRgbPixelReader();\r
+               NyARIntSize raster_size=image.getSize();\r
+\r
+               final PerspectivePixelReader.TThreshold th=this.__pickFromRaster_th;\r
+               final MarkerPattEncoder encoder=this.__pickFromRaster_encoder;\r
+               //マーカパラメータを取得\r
+               this._perspective_reader.detectThresholdValue(reader,raster_size,th);\r
+\r
+               if(!this._perspective_reader.readDataBits(reader,raster_size,th, encoder)){\r
+                       return false;\r
+               }\r
+               final int d=encoder.encode(o_data);\r
+               if(d<0){\r
+                       return false;\r
+               }\r
+               o_param.direction=d;\r
+               o_param.threshold=th.th;\r
+               \r
+               return true;\r
+       }\r
+}\r
 \r
 \r
 \r
 \r
 \r
 /**\r
- * NyARColorPatt_NyIdMarkerがラスタからPerspective変換して読みだすためのクラス\r
+ * {@link NyARColorPatt_NyIdMarker}がラスタからPerspective変換して読みだすためのクラス\r
+ * 画像処理全般を担当します。\r
+ * ユーザがこのクラスを使うことはありません。\r
  *\r
  */\r
 final class PerspectivePixelReader\r
@@ -46,22 +144,40 @@ final class PerspectivePixelReader
        private NyARPerspectiveParamGenerator _param_gen=new NyARPerspectiveParamGenerator_O1(1,1);\r
        private double[] _cparam=new double[8];\r
 \r
-\r
+       /**\r
+        * コンストラクタです。\r
+        */\r
        public PerspectivePixelReader()\r
        {\r
                return;\r
        }\r
-\r
+       /**\r
+        * この関数は、マーカ四角形をインスタンスにセットします。\r
+        * @param i_vertex\r
+        * セットする四角形頂点座標。4要素である必要があります。\r
+        * @return\r
+        * 成功するとtrueです。\r
+        * @throws NyARException\r
+        */\r
        public boolean setSourceSquare(NyARIntPoint2d[] i_vertex)throws NyARException\r
        {\r
                return this._param_gen.getParam(READ_RESOLUTION,READ_RESOLUTION,i_vertex, this._cparam);\r
        }\r
+       /**\r
+        * この関数は、マーカ四角形をインスタンスにセットします。\r
+        * @param i_vertex\r
+        * セットする四角形頂点座標。4要素である必要があります。\r
+        * @return\r
+        * 成功するとtrueです。\r
+        * @throws NyARException\r
+        */\r
        public boolean setSourceSquare(NyARDoublePoint2d[] i_vertex)throws NyARException\r
        {\r
                return this._param_gen.getParam(READ_RESOLUTION,READ_RESOLUTION,i_vertex, this._cparam);\r
        }\r
+\r
        /**\r
-        * 矩形からピクセルを切り出します\r
+        * ラスタから射影変換したピクセルを得ます。\r
         * @param i_lt_x\r
         * @param i_lt_y\r
         * @param i_step_x\r
@@ -69,7 +185,7 @@ final class PerspectivePixelReader
         * @param i_width\r
         * @param i_height\r
         * @param i_out_st\r
-        * o_pixelへの格納場所の先頭インデクス\r
+        * 格納バッファo_pixelの先頭のインデクス。\r
         * @param o_pixel\r
         * @throws NyARException\r
         */\r
@@ -120,6 +236,7 @@ final class PerspectivePixelReader
                return true;\r
        }\r
        /**\r
+        * パターン分析関数。\r
         * i_freqにあるゼロクロス点の周期が、等間隔か調べます。\r
         * 次段半周期が、前段の80%より大きく、120%未満であるものを、等間隔周期であるとみなします。\r
         * @param i_freq\r
@@ -140,6 +257,7 @@ final class PerspectivePixelReader
                return true;\r
        }\r
        /**\r
+        * パターン分析関数。\r
         * i_freq_count_tableとi_freq_tableの内容を調査し、最も大きな周波数成分を返します。\r
         * @param i_freq_count_table\r
         * @param i_freq_table\r
@@ -191,18 +309,20 @@ final class PerspectivePixelReader
        private final int[] _freq_table=new int[(MAX_FREQ*2-1)*MAX_FREQ*2/2];\r
 \r
        /**\r
-        * i_y1行目とi_y2行目を平均して、タイミングパターンの周波数を得ます。\r
-        * LHLを1周期として、たとえばLHLHLの場合は2を返します。LHLHやHLHL等の始端と終端のレベルが異なるパターンを\r
+        * この関数は、マーカ画像のi_y1行目とi_y2行目を平均して、タイミングパターンの周波数を得ます。\r
+        * L=暗点、H=明点、LHL=1周期として、たとえばLHLHLの場合は2を返します。LHLHやHLHL等の始端と終端のレベルが異なるパターンを\r
         * 検出した場合、関数は失敗します。\r
-        * \r
         * @param i_y1\r
-        * @param i_y2\r
+        * ライン1のインデクス\r
         * @param i_th_h\r
+        * 明点の敷居値\r
         * @param i_th_l\r
+        * 暗点の敷居値\r
         * @param o_edge_index\r
-        * æ¤\9cå\87ºã\81\97ã\81\9fã\82¨ã\83\83ã\82¸ä½\8dç½®(H->L,L->H)ã\81®ã\82¤ã\83³ã\83\87ã\82¯ã\82¹ã\82\92å\8f\97ã\81\91å\8f\96ã\82\8bé\85\8då\88\97ã\81§ã\81\99ã\80\82\r
-        * [FRQ_POINTS]以ä¸\8aã\81®é\85\8då\88\97ã\82\92æ\8c\87å®\9aã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84\r
+        * 検出したエッジ位置(H->L,L->H)のインデクスを受け取る配列。\r
+        * [FRQ_POINTS]以ä¸\8aã\81®é\85\8då\88\97ã\82\92æ\8c\87å®\9aã\81\99ã\82\8bã\81\93ã\81¨\r
         * @return\r
+        * 周波数の値。失敗すると-1\r
         * @throws NyARException\r
         */\r
        public int getRowFrequency(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,int i_y1,int i_th_h,int i_th_l,int[] o_edge_index)throws NyARException\r
@@ -276,11 +396,26 @@ final class PerspectivePixelReader
                }\r
                return getMaxFreq(freq_count_table,freq_table,o_edge_index);\r
        }\r
-       \r
+       /**\r
+        * この関数は、マーカ画像のi_x1列目とi_x2列目を平均して、タイミングパターンの周波数を得ます。\r
+        * L=暗点、H=明点、LHL=1周期として、たとえばLHLHLの場合は2を返します。LHLHやHLHL等の始端と終端のレベルが異なるパターンを\r
+        * 検出した場合、関数は失敗します。\r
+        * @param i_x1\r
+        * ライン1のインデクス\r
+        * @param i_th_h\r
+        * 明点の敷居値\r
+        * @param i_th_l\r
+        * 暗点の敷居値\r
+        * @param o_edge_index\r
+        * 検出したエッジ位置(H->L,L->H)のインデクスを受け取る配列。\r
+        * [FRQ_POINTS]以上の配列を指定すること。\r
+        * @return\r
+        * 周波数の値。失敗すると-1\r
+        * @throws NyARException\r
+        */\r
        public int getColFrequency(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,int i_x1,int i_th_h,int i_th_l,int[] o_edge_index)throws NyARException\r
        {\r
                final double[] cpara=this._cparam;\r
-//             final INyARRgbPixelReader reader=this._raster.getRgbPixelReader();\r
                final int[] ref_x=this._ref_x;\r
                final int[] ref_y=this._ref_y;\r
                final int[] pixcel_temp=this._pixcel_temp;\r
@@ -400,7 +535,9 @@ final class PerspectivePixelReader
        private static final int THRESHOLD_SAMPLE=THRESHOLD_PIXEL*THRESHOLD_PIXEL;\r
        private static final int THRESHOLD_SAMPLE_LT=THRESHOLD_EDGE;\r
        private static final int THRESHOLD_SAMPLE_RB=100-THRESHOLD_WIDTH-THRESHOLD_EDGE;\r
-       \r
+       /**\r
+        * 敷居値の保持型\r
+        */\r
        public static class TThreshold{\r
                public int th_h;\r
                public int th_l;\r
@@ -410,8 +547,11 @@ final class PerspectivePixelReader
                public int rb_x;\r
                public int rb_y;\r
        }       \r
-\r
-       class THighAndLow{\r
+       /**\r
+        * H/Lの保持型\r
+        */\r
+       class THighAndLow\r
+       {\r
                public int h;\r
                public int l;\r
        }\r
@@ -480,11 +620,13 @@ final class PerspectivePixelReader
        private NyARIntPoint2d __detectThresholdValue_tpt=new NyARIntPoint2d();\r
        private int[] _th_pixels=new int[THRESHOLD_SAMPLE*4];\r
        /**\r
-        * 指定した場所のピクセル値を調査して、閾値を計算して返します。\r
+        * この関数はマーカパターンから、敷居値を決定します。\r
         * @param i_reader\r
-        * @param i_x\r
-        * @param i_y\r
-        * @return\r
+        * ラスタリーダオブジェクト\r
+        * @param i_raster_size\r
+        * ラスのタのサイズ\r
+        * @param o_threshold\r
+        * 敷居値を受け取るオブジェクト\r
         * @throws NyARException\r
         */\r
        public void detectThresholdValue(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,TThreshold o_threshold)throws NyARException\r
@@ -650,7 +792,20 @@ final class PerspectivePixelReader
        }\r
        private double[] __readDataBits_index_bit_x=new double[MAX_DATA_BITS*2];\r
        private double[] __readDataBits_index_bit_y=new double[MAX_DATA_BITS*2];\r
-       \r
+       /**\r
+        * この関数は、マーカパターンからデータを読み取ります。\r
+        * @param i_reader\r
+        * ラスタリーダ\r
+        * @param i_raster_size\r
+        * ラスタのサイズ\r
+        * @param i_th\r
+        * 敷居値情報\r
+        * @param o_bitbuffer\r
+        * データビットの出力先\r
+        * @return\r
+        * 成功するとtrue\r
+        * @throws NyARException\r
+        */\r
        public boolean readDataBits(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,PerspectivePixelReader.TThreshold i_th,MarkerPattEncoder o_bitbuffer)throws NyARException\r
        {\r
                final int raster_width=i_raster_size.w;\r
@@ -766,15 +921,10 @@ final class PerspectivePixelReader
                }\r
                return true;\r
        }\r
-       public boolean setSquare(NyARIntPoint2d[] i_vertex) throws NyARException\r
-       {\r
-               if (!this._param_gen.getParam(READ_RESOLUTION,READ_RESOLUTION,i_vertex,this._cparam)) {\r
-                       return false;\r
-               }\r
-               return true;\r
-       }\r
+\r
 \r
 }\r
+\r
 class MarkerPattDecoder\r
 {\r
        public void decode(int model,int domain,int mask)\r
@@ -783,8 +933,9 @@ class MarkerPattDecoder
        }\r
 }\r
 /**\r
- * マーカパターンのエンコーダです。\r
- *\r
+ * このクラスは、マーカパターンのエンコーダです。{@link PerspectivePixelReader}から使います。\r
+ * ピクセルセットから、マーカーデータへエンコードする処理を定義します。\r
+ * 暫定として、5x5と、7x7のマーカについて定義します。\r
  */\r
 class MarkerPattEncoder\r
 {\r
@@ -816,6 +967,11 @@ class MarkerPattEncoder
        private int[] _bits=new int[16];\r
        private int[] _work=new int[16];\r
        private int _model;\r
+       /**\r
+        * この関数は、\r
+        * @param i_index_no\r
+        * @param i_value\r
+        */\r
        public void setBitByBitIndex(int i_index_no,int i_value)\r
        {\r
                assert i_value==0 || i_value==1;\r
@@ -829,7 +985,13 @@ class MarkerPattEncoder
                }\r
                return;\r
        }\r
-       \r
+       /**\r
+        * この関数は、ビットイメージ{@link #_bits}のnビット目に、値をセットします。\r
+        * @param i_bit_no\r
+        * ビットイメージのインデクス\r
+        * @param i_value\r
+        * セットする値。\r
+        */\r
        public void setBit(int i_bit_no,int i_value)\r
        {\r
                assert i_value==0 || i_value==1;\r
@@ -842,6 +1004,13 @@ class MarkerPattEncoder
                }\r
                return;\r
        }\r
+       /**\r
+        * この関数は、ビットイメージ{@link #_bits}のnビット目から、値を得ます。\r
+        * @param i_bit_no\r
+        * ビットイメージのインデクス\r
+        * @return\r
+        * ビット値\r
+        */\r
        public int getBit(int i_bit_no)\r
        {\r
                if(i_bit_no==0){\r
@@ -852,6 +1021,11 @@ class MarkerPattEncoder
                        return (this._bits[bidx]>>(sidx))&(0x01);\r
                }\r
        }\r
+       /**\r
+        * この関数は、現在セットされているモデル番号を返します。\r
+        * @return\r
+        * 現在のモデル番号\r
+        */\r
        public int getModel()\r
        {\r
                return this._model;\r
@@ -875,7 +1049,15 @@ class MarkerPattEncoder
                }\r
                return -1;\r
        }\r
-       public static int getCheckValue(int i_model,int[] i_data)\r
+       /**\r
+        * この関数は、チェックドットの値を返します。\r
+        * @param i_model\r
+        * モデル番号\r
+        * @param i_data\r
+        * データ配列\r
+        * @return\r
+        */\r
+       private static int getCheckValue(int i_model,int[] i_data)\r
        {\r
                int v;\r
                switch(i_model){\r
@@ -894,6 +1076,13 @@ class MarkerPattEncoder
                }\r
                return -1;\r
        }\r
+       /**\r
+        * この関数は、インスタンスの状態を、指定モデル向けにセットします。\r
+        * @param i_model\r
+        * モデル番号\r
+        * @return\r
+        * 成功するとtrueを返します。\r
+        */\r
        public boolean initEncoder(int i_model)\r
        {\r
                if(i_model>3 || i_model<2){\r
@@ -946,10 +1135,10 @@ class MarkerPattEncoder
        /**\r
         * 格納しているマーカパターンをエンコードして、マーカデータを返します。\r
         * @param o_out\r
+        * マーカデータを受け取るオブジェクト。\r
         * @return\r
         * 成功すればマーカの方位を返却します。失敗すると-1を返します。\r
         */\r
-\r
        public int encode(NyIdMarkerPattern o_out)\r
        {\r
                final int d=getDirection();\r
@@ -1013,6 +1202,18 @@ class MarkerPattEncoder
 //             }\r
                return;\r
        }\r
+       /**\r
+        * この関数は、ビットパックi_packを指定ビットだけ左シフトします。\r
+        * 現在未使用です。\r
+        * @param i_pack\r
+        * 操作する配列\r
+        * @param i_start\r
+        * シフトの開始アドレス\r
+        * @param i_length\r
+        * シフトする配列の長さ\r
+        * @param i_ls\r
+        * シフト量\r
+        */\r
        public void shiftLeft(int[] i_pack,int i_start,int i_length,int i_ls)\r
        {\r
                int[] work=this._work;\r
@@ -1030,86 +1231,3 @@ class MarkerPattEncoder
                return;\r
        }       \r
 }\r
-/**\r
- * ラスタ画像の任意矩形から、NyARIdMarkerDataを抽出します。\r
- *\r
- */\r
-public class NyIdMarkerPickup\r
-{\r
-       private PerspectivePixelReader _perspective_reader;\r
-       private final PerspectivePixelReader.TThreshold __pickFromRaster_th=new PerspectivePixelReader.TThreshold();\r
-       private final MarkerPattEncoder __pickFromRaster_encoder=new MarkerPattEncoder();\r
-\r
-\r
-       public NyIdMarkerPickup()\r
-       {\r
-               this._perspective_reader=new PerspectivePixelReader();\r
-               return;\r
-       }\r
-       /**\r
-        * imageの4頂点で囲まれた矩形からidマーカを読みだします。\r
-        * @param image\r
-        * @param i_vertex\r
-        * @param o_data\r
-        * @param o_param\r
-        * @return\r
-        * @throws NyARException\r
-        */\r
-       public final boolean pickFromRaster(INyARRgbRaster image, NyARDoublePoint2d[] i_vertex,NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
-       {\r
-               //遠近法のパラメータを計算\r
-               if(!this._perspective_reader.setSourceSquare(i_vertex)){\r
-                       return false;\r
-               }\r
-               return this._pickFromRaster(image,o_data,o_param);\r
-       }\r
-       /**\r
-        * imageの4頂点で囲まれた矩形からidマーカを読みだします。\r
-        * @param image\r
-        * @param i_vertex\r
-        * @param o_data\r
-        * @param o_param\r
-        * @return\r
-        * @throws NyARException\r
-        */\r
-       public final boolean pickFromRaster(INyARRgbRaster image, NyARIntPoint2d[] i_vertex,NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
-       {\r
-               if(!this._perspective_reader.setSourceSquare(i_vertex)){\r
-                       return false;\r
-               }\r
-               return this._pickFromRaster(image,o_data,o_param);\r
-       }\r
-       \r
-       /**\r
-        * i_imageから、idマーカを読みだします。\r
-        * o_dataにはマーカデータ、o_paramにはマーカのパラメータを返却します。\r
-        * @param image\r
-        * @param i_vertex\r
-        * @param o_data\r
-        * @param o_param\r
-        * @return\r
-        * @throws NyARException\r
-        */\r
-       private final boolean _pickFromRaster(INyARRgbRaster image, NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
-       {\r
-               INyARRgbPixelReader reader=image.getRgbPixelReader();\r
-               NyARIntSize raster_size=image.getSize();\r
-\r
-               final PerspectivePixelReader.TThreshold th=this.__pickFromRaster_th;\r
-               final MarkerPattEncoder encoder=this.__pickFromRaster_encoder;\r
-               //マーカパラメータを取得\r
-               this._perspective_reader.detectThresholdValue(reader,raster_size,th);\r
-\r
-               if(!this._perspective_reader.readDataBits(reader,raster_size,th, encoder)){\r
-                       return false;\r
-               }\r
-               final int d=encoder.encode(o_data);\r
-               if(d<0){\r
-                       return false;\r
-               }\r
-               o_param.direction=d;\r
-               o_param.threshold=th.th;\r
-               \r
-               return true;\r
-       }\r
-}\r