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
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
* @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
return true;\r
}\r
/**\r
+ * パターン分析関数。\r
* i_freqにあるゼロクロス点の周期が、等間隔か調べます。\r
* 次段半周期が、前段の80%より大きく、120%未満であるものを、等間隔周期であるとみなします。\r
* @param i_freq\r
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
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
}\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
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
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
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
}\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
}\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
}\r
}\r
/**\r
- * マーカパターンのエンコーダです。\r
- *\r
+ * このクラスは、マーカパターンのエンコーダです。{@link PerspectivePixelReader}から使います。\r
+ * ピクセルセットから、マーカーデータへエンコードする処理を定義します。\r
+ * 暫定として、5x5と、7x7のマーカについて定義します。\r
*/\r
class MarkerPattEncoder\r
{\r
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
}\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
}\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
return (this._bits[bidx]>>(sidx))&(0x01);\r
}\r
}\r
+ /**\r
+ * この関数は、現在セットされているモデル番号を返します。\r
+ * @return\r
+ * 現在のモデル番号\r
+ */\r
public int getModel()\r
{\r
return this._model;\r
}\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
}\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
/**\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
// }\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
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