OSDN Git Service

[Backup]NyARToolkit for Java
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Tue, 11 Aug 2009 12:46:36 +0000 (12:46 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Tue, 11 Aug 2009 12:46:36 +0000 (12:46 +0000)
新型ラベリングの追加など

51 files changed:
src/jp/nyatla/nyartoolkit/core/NyARSquareDetector.java [deleted file]
src/jp/nyatla/nyartoolkit/core/NyARSquareStack.java
src/jp/nyatla/nyartoolkit/core/labeling/INyARLabelingImage.java [deleted file]
src/jp/nyatla/nyartoolkit/core/labeling/NyARLabelInfo.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/labeling/NyARLabelInfoStack.java [moved from src/jp/nyatla/nyartoolkit/core/labeling/NyARLabelingLabelStack.java with 74% similarity]
src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabelingImage.java [moved from src/jp/nyatla/nyartoolkit/core/labeling/NyARLabelingImage.java with 64% similarity]
src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabelingLabel.java [moved from src/jp/nyatla/nyartoolkit/core/labeling/NyARLabelingLabel.java with 85% similarity]
src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabelingLabelStack.java [moved from src/jp/nyatla/nyartoolkit/core/labeling/INyARLabeling.java with 72% similarity]
src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabeling_ARToolKit.java [moved from src/jp/nyatla/nyartoolkit/core/labeling/NyARLabeling_ARToolKit.java with 86% similarity]
src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/RleLabelFragmentInfoStack.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/pca2d/NyARPca2d_MatrixPCA.java
src/jp/nyatla/nyartoolkit/core/pickup/NyARColorPatt_O3.java
src/jp/nyatla/nyartoolkit/core/raster/NyARGrayscaleRaster.java
src/jp/nyatla/nyartoolkit/core/raster/rgb/NyARRgbRaster_BGRA.java
src/jp/nyatla/nyartoolkit/core/raster/rgb/NyARRgbRaster_Blank.java
src/jp/nyatla/nyartoolkit/core/raster/rgb/NyARRgbRaster_RGB.java
src/jp/nyatla/nyartoolkit/core/rasterfilter/rgb2bin/NyARRasterFilter_ARToolkitThreshold.java
src/jp/nyatla/nyartoolkit/core/rasterreader/INyARBufferReader.java
src/jp/nyatla/nyartoolkit/core/rasterreader/INyARRgbPixelReader.java
src/jp/nyatla/nyartoolkit/core/rasterreader/NyARRgbPixelReader_BYTE1D_X8R8G8B8_32.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/rasterreader/NyARRgbPixelReader_INT1D_GRAY_8.java [moved from src/jp/nyatla/nyartoolkit/core/rasterreader/NyARRgbPixelReader_INT1D_GLAY_8.java with 79% similarity]
src/jp/nyatla/nyartoolkit/core/rasterreader/NyARRgbPixelReader_INT1D_X8R8G8B8_32.java
src/jp/nyatla/nyartoolkit/core/rasterreader/NyARRgbPixelReader_RGB24.java
src/jp/nyatla/nyartoolkit/core/squaredetect/ContourPickup.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/squaredetect/LabelOverlapChecker.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_ARToolKit.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_Rle.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/squaredetect/SquareContourDetector.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/transmat/NyARTransMatResult.java
src/jp/nyatla/nyartoolkit/core/transmat/NyARTransOffset.java
src/jp/nyatla/nyartoolkit/core/types/stack/NyARIntPointStack.java
src/jp/nyatla/nyartoolkit/core/types/stack/NyARIntRectStack.java
src/jp/nyatla/nyartoolkit/core2/rasteranalyzer/NyARRasterDetector_QrCodeEdge.java
src/jp/nyatla/nyartoolkit/core2/rasteranalyzer/threshold/NyARRasterThresholdAnalyzer_DiffHistgram.java
src/jp/nyatla/nyartoolkit/core2/rasteranalyzer/threshold/NyARRasterThresholdAnalyzer_PTile.java
src/jp/nyatla/nyartoolkit/core2/rasteranalyzer/threshold/NyARRasterThresholdAnalyzer_SlidePTile.java
src/jp/nyatla/nyartoolkit/core2/rasterfilter/NyARRasterFilter_Edge.java
src/jp/nyatla/nyartoolkit/detector/NyARCustomSingleDetectMarker.java
src/jp/nyatla/nyartoolkit/detector/NyARDetectMarker.java
src/jp/nyatla/nyartoolkit/detector/NyARSingleDetectMarker.java
src/jp/nyatla/nyartoolkit/nyidmarker/NyIdMarkerPattern.java
src/jp/nyatla/nyartoolkit/nyidmarker/NyIdMarkerPickup.java
src/jp/nyatla/nyartoolkit/nyidmarker/data/NyIdMarkerData_RawBit.java
src/jp/nyatla/nyartoolkit/processor/SingleARMarkerProcesser.java
src/jp/nyatla/nyartoolkit/processor/SingleNyIdMarkerProcesser.java
src/jp/nyatla/nyartoolkit/sample/NyIdTest.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/sample/RawFileTest.java
src/jp/nyatla/utils/NyObjectStack.java
src/jp/nyatla/utils/j2se/BufferedImageSink.java
src/jp/nyatla/utils/j2se/LabelingBufferdImage.java

diff --git a/src/jp/nyatla/nyartoolkit/core/NyARSquareDetector.java b/src/jp/nyatla/nyartoolkit/core/NyARSquareDetector.java
deleted file mode 100644 (file)
index e34f9d1..0000000
+++ /dev/null
@@ -1,459 +0,0 @@
-/* \r
- * PROJECT: NyARToolkit\r
- * --------------------------------------------------------------------------------\r
- * This work is based on the original ARToolKit developed by\r
- *   Hirokazu Kato\r
- *   Mark Billinghurst\r
- *   HITLab, University of Washington, Seattle\r
- * http://www.hitl.washington.edu/artoolkit/\r
- *\r
- * The NyARToolkit is Java version ARToolkit class library.\r
- * Copyright (C)2008 R.Iizuka\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- * \r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- * \r
- * You should have received a copy of the GNU General Public License\r
- * along with this framework; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
- * \r
- * For further information please contact.\r
- *     http://nyatla.jp/nyatoolkit/\r
- *     <airmail(at)ebony.plala.or.jp>\r
- * \r
- */\r
-package jp.nyatla.nyartoolkit.core;\r
-import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.nyartoolkit.core.labeling.*;\r
-import jp.nyatla.nyartoolkit.core.raster.*;\r
-import jp.nyatla.nyartoolkit.core.types.*;\r
-import jp.nyatla.nyartoolkit.core.param.*;\r
-import jp.nyatla.nyartoolkit.core.pca2d.NyARPca2d_MatrixPCA_O2;\r
-import jp.nyatla.nyartoolkit.core.types.matrix.*;\r
-import jp.nyatla.nyartoolkit.core.pca2d.*;\r
-\r
-\r
-\r
-\r
-/**\r
- * イメージから正方形候補を検出するクラス。\r
- * このクラスは、arDetectMarker2.cとの置き換えになります。\r
- * \r
- */\r
-public class NyARSquareDetector implements INyARSquareDetector\r
-{\r
-       private static final double VERTEX_FACTOR = 1.0;// 線検出のファクタ\r
-       private static final int AR_AREA_MAX = 100000;// #define AR_AREA_MAX 100000\r
-       private static final int AR_AREA_MIN = 70;// #define AR_AREA_MIN 70\r
-       private final int _width;\r
-       private final int _height;\r
-\r
-       private final NyARLabeling_ARToolKit _labeling;\r
-\r
-       private final NyARLabelingImage _limage;\r
-\r
-       private final OverlapChecker _overlap_checker = new OverlapChecker();\r
-       private final NyARObserv2IdealMap _dist_factor;\r
-       \r
-       private final double[] _xpos;\r
-       private final double[] _ypos;\r
-\r
-       /**\r
-        * 最大i_squre_max個のマーカーを検出するクラスを作成する。\r
-        * \r
-        * @param i_param\r
-        */\r
-       public NyARSquareDetector(NyARCameraDistortionFactor i_dist_factor_ref,NyARIntSize i_size) throws NyARException\r
-       {\r
-               this._width = i_size.w;\r
-               this._height = i_size.h;\r
-               //歪み計算テーブルを作ると、8*width/height*2の領域を消費します。\r
-               //領域を取りたくない場合は、i_dist_factor_refの値をそのまま使ってください。\r
-               this._dist_factor = new NyARObserv2IdealMap(i_dist_factor_ref,i_size);\r
-               this._labeling = new NyARLabeling_ARToolKit();\r
-               this._limage = new NyARLabelingImage(this._width, this._height);\r
-               this._labeling.attachDestination(this._limage);\r
-\r
-               // 輪郭の最大長は画面に映りうる最大の長方形サイズ。\r
-               int number_of_coord = (this._width + this._height) * 2;\r
-\r
-               // 輪郭バッファは頂点変換をするので、輪郭バッファの2倍取る。\r
-               this._max_coord = number_of_coord;\r
-               this._xcoord = new int[number_of_coord * 2];\r
-               this._ycoord = new int[number_of_coord * 2];\r
-               this._pca=new NyARPca2d_MatrixPCA_O2();\r
-               this._xpos=new double[this._width+this._height];//最大辺長はthis._width+this._height\r
-               this._ypos=new double[this._width+this._height];//最大辺長はthis._width+this._height\r
-               return;\r
-       }\r
-\r
-       private final int _max_coord;\r
-       private final int[] _xcoord;\r
-       private final int[] _ycoord;\r
-\r
-       private void normalizeCoord(int[] i_coord_x, int[] i_coord_y, int i_index, int i_coord_num)\r
-       {\r
-               // vertex1を境界にして、後方に配列を連結\r
-               System.arraycopy(i_coord_x, 1, i_coord_x, i_coord_num, i_index);\r
-               System.arraycopy(i_coord_y, 1, i_coord_y, i_coord_num, i_index);\r
-       }\r
-\r
-       private final int[] __detectMarker_mkvertex = new int[5];\r
-\r
-       /**\r
-        * arDetectMarker2を基にした関数\r
-        * この関数はNyARSquare要素のうち、directionを除くパラメータを取得して返します。\r
-        * directionの確定は行いません。\r
-        * @param i_raster\r
-        * 解析する2値ラスタイメージを指定します。\r
-        * @param o_square_stack\r
-        * 抽出した正方形候補を格納するリスト\r
-        * @throws NyARException\r
-        */\r
-       public final void detectMarker(NyARBinRaster i_raster, NyARSquareStack o_square_stack) throws NyARException\r
-       {\r
-               final NyARLabelingImage limage = this._limage;\r
-\r
-               // 初期化\r
-\r
-               // マーカーホルダをリセット\r
-               o_square_stack.clear();\r
-\r
-               // ラベリング\r
-               this._labeling.labeling(i_raster);\r
-\r
-               // ラベル数が0ならここまで\r
-               final int label_num = limage.getLabelStack().getLength();\r
-               if (label_num < 1) {\r
-                       return;\r
-               }\r
-\r
-               final NyARLabelingLabelStack stack = limage.getLabelStack();\r
-               final NyARLabelingLabel[] labels = (NyARLabelingLabel[])stack.getArray();\r
-               \r
-               \r
-               // ラベルを大きい順に整列\r
-               stack.sortByArea();\r
-\r
-               // デカいラベルを読み飛ばし\r
-               int i;\r
-               for (i = 0; i < label_num; i++) {\r
-                       // 検査対象内のラベルサイズになるまで無視\r
-                       if (labels[i].area <= AR_AREA_MAX) {\r
-                               break;\r
-                       }\r
-               }\r
-\r
-               final int xsize = this._width;\r
-               final int ysize = this._height;\r
-               final int[] xcoord = this._xcoord;\r
-               final int[] ycoord = this._ycoord;\r
-               final int coord_max = this._max_coord;\r
-               final int[] mkvertex = this.__detectMarker_mkvertex;\r
-               final OverlapChecker overlap = this._overlap_checker;\r
-               int coord_num;\r
-               int label_area;\r
-               NyARLabelingLabel label_pt;\r
-\r
-               //重なりチェッカの最大数を設定\r
-               overlap.reset(label_num);\r
-\r
-               for (; i < label_num; i++) {\r
-                       label_pt = labels[i];\r
-                       label_area = label_pt.area;\r
-                       // 検査対象サイズよりも小さくなったら終了\r
-                       if (label_area < AR_AREA_MIN) {\r
-                               break;\r
-                       }\r
-                       // クリップ領域が画面の枠に接していれば除外\r
-                       if (label_pt.clip_l == 1 || label_pt.clip_r == xsize - 2) {// if(wclip[i*4+0] == 1 || wclip[i*4+1] ==xsize-2){\r
-                               continue;\r
-                       }\r
-                       if (label_pt.clip_t == 1 || label_pt.clip_b == ysize - 2) {// if( wclip[i*4+2] == 1 || wclip[i*4+3] ==ysize-2){\r
-                               continue;\r
-                       }\r
-                       // 既に検出された矩形との重なりを確認\r
-                       if (!overlap.check(label_pt)) {\r
-                               // 重なっているようだ。\r
-                               continue;\r
-                       }\r
-\r
-                       // 輪郭を取得\r
-                       coord_num = limage.getContour(i, coord_max, xcoord, ycoord);\r
-                       if (coord_num == coord_max) {\r
-                               // 輪郭が大きすぎる。\r
-                               continue;\r
-                       }\r
-                       //頂点候補のインデクスを取得\r
-                       final int vertex1 = scanVertex(xcoord, ycoord, coord_num);\r
-\r
-                       // 頂点候補(vertex1)を先頭に並べなおした配列を作成する。\r
-                       normalizeCoord(xcoord, ycoord, vertex1, coord_num);\r
-\r
-                       // 領域を準備する。\r
-                       NyARSquare square_ptr = (NyARSquare)o_square_stack.prePush();\r
-\r
-                       // 頂点情報を取得\r
-                       if (!getSquareVertex(xcoord, ycoord, vertex1, coord_num, label_area, mkvertex)) {\r
-                               o_square_stack.pop();// 頂点の取得が出来なかったので破棄\r
-                               continue;\r
-                       }\r
-                       // マーカーを検出\r
-                       if (!getSquareLine(mkvertex, xcoord, ycoord, square_ptr)) {\r
-                               // 矩形が成立しなかった。\r
-                               o_square_stack.pop();\r
-                               continue;\r
-                       }\r
-                       // 検出済の矩形の属したラベルを重なりチェックに追加する。\r
-                       overlap.push(label_pt);\r
-               }       \r
-               return;\r
-       }\r
-\r
-       /**\r
-        * 辺からの対角線が最長になる点を対角線候補として返す。\r
-        * \r
-        * @param i_xcoord\r
-        * @param i_ycoord\r
-        * @param i_coord_num\r
-        * @return\r
-        */\r
-       private int scanVertex(int[] i_xcoord, int[] i_ycoord, int i_coord_num)\r
-       {\r
-               final int sx = i_xcoord[0];\r
-               final int sy = i_ycoord[0];\r
-               int d = 0;\r
-               int w, x, y;\r
-               int ret = 0;\r
-               for (int i = 1; i < i_coord_num; i++) {\r
-                       x = i_xcoord[i] - sx;\r
-                       y = i_ycoord[i] - sy;\r
-                       w = x * x + y * y;\r
-                       if (w > d) {\r
-                               d = w;\r
-                               ret = i;\r
-                       }\r
-                       // ここでうまく終了条件入れられないかな。\r
-               }\r
-               return ret;\r
-       }\r
-\r
-       private final NyARVertexCounter __getSquareVertex_wv1 = new NyARVertexCounter();\r
-\r
-       private final NyARVertexCounter __getSquareVertex_wv2 = new NyARVertexCounter();\r
-\r
-       /**\r
-        * static int arDetectMarker2_check_square( int area, ARMarkerInfo2 *marker_info2, double factor ) 関数の代替関数 OPTIMIZED STEP [450->415] o_squareに頂点情報をセットします。\r
-        * \r
-        * @param i_x_coord\r
-        * @param i_y_coord\r
-        * @param i_vertex1_index\r
-        * @param i_coord_num\r
-        * @param i_area\r
-        * @param o_vertex\r
-        * 要素数はint[4]である事\r
-        * @return\r
-        */\r
-       private boolean getSquareVertex(int[] i_x_coord, int[] i_y_coord, int i_vertex1_index, int i_coord_num, int i_area, int[] o_vertex)\r
-       {\r
-               final NyARVertexCounter wv1 = this.__getSquareVertex_wv1;\r
-               final NyARVertexCounter wv2 = this.__getSquareVertex_wv2;\r
-               final int end_of_coord = i_vertex1_index + i_coord_num - 1;\r
-               final int sx = i_x_coord[i_vertex1_index];// sx = marker_info2->x_coord[0];\r
-               final int sy = i_y_coord[i_vertex1_index];// sy = marker_info2->y_coord[0];\r
-               int dmax = 0;\r
-               int v1 = i_vertex1_index;\r
-               for (int i = 1 + i_vertex1_index; i < end_of_coord; i++) {// for(i=1;i<marker_info2->coord_num-1;i++)\r
-                       // {\r
-                       final int d = (i_x_coord[i] - sx) * (i_x_coord[i] - sx) + (i_y_coord[i] - sy) * (i_y_coord[i] - sy);\r
-                       if (d > dmax) {\r
-                               dmax = d;\r
-                               v1 = i;\r
-                       }\r
-               }\r
-               final double thresh = (i_area / 0.75) * 0.01 * VERTEX_FACTOR;\r
-\r
-               o_vertex[0] = i_vertex1_index;\r
-\r
-               if (!wv1.getVertex(i_x_coord, i_y_coord, i_vertex1_index, v1, thresh)) { // if(get_vertex(marker_info2->x_coord,marker_info2->y_coord,0,v1,thresh,wv1,&wvnum1)<\r
-                                                                                                                                                                       // 0 ) {\r
-                       return false;\r
-               }\r
-               if (!wv2.getVertex(i_x_coord, i_y_coord, v1, end_of_coord, thresh)) {// if(get_vertex(marker_info2->x_coord,marker_info2->y_coord,v1,marker_info2->coord_num-1,thresh,wv2,&wvnum2)\r
-                       // < 0) {\r
-                       return false;\r
-               }\r
-\r
-               int v2;\r
-               if (wv1.number_of_vertex == 1 && wv2.number_of_vertex == 1) {// if(wvnum1 == 1 && wvnum2== 1) {\r
-                       o_vertex[1] = wv1.vertex[0];\r
-                       o_vertex[2] = v1;\r
-                       o_vertex[3] = wv2.vertex[0];\r
-               } else if (wv1.number_of_vertex > 1 && wv2.number_of_vertex == 0) {// }else if( wvnum1 > 1 && wvnum2== 0) {\r
-                       //頂点位置を、起点から対角点の間の1/2にあると予想して、検索する。\r
-                       v2 = (v1-i_vertex1_index)/2+i_vertex1_index;\r
-                       if (!wv1.getVertex(i_x_coord, i_y_coord, i_vertex1_index, v2, thresh)) {\r
-                               return false;\r
-                       }\r
-                       if (!wv2.getVertex(i_x_coord, i_y_coord, v2, v1, thresh)) {\r
-                               return false;\r
-                       }\r
-                       if (wv1.number_of_vertex == 1 && wv2.number_of_vertex == 1) {\r
-                               o_vertex[1] = wv1.vertex[0];\r
-                               o_vertex[2] = wv2.vertex[0];\r
-                               o_vertex[3] = v1;\r
-                       } else {\r
-                               return false;\r
-                       }\r
-               } else if (wv1.number_of_vertex == 0 && wv2.number_of_vertex > 1) {\r
-                       //v2 = (v1-i_vertex1_index+ end_of_coord-i_vertex1_index) / 2+i_vertex1_index;\r
-                       v2 = (v1+ end_of_coord)/2;\r
-\r
-                       if (!wv1.getVertex(i_x_coord, i_y_coord, v1, v2, thresh)) {\r
-                               return false;\r
-                       }\r
-                       if (!wv2.getVertex(i_x_coord, i_y_coord, v2, end_of_coord, thresh)) {\r
-                               return false;\r
-                       }\r
-                       if (wv1.number_of_vertex == 1 && wv2.number_of_vertex == 1) {\r
-                               o_vertex[1] = v1;\r
-                               o_vertex[2] = wv1.vertex[0];\r
-                               o_vertex[3] = wv2.vertex[0];\r
-                       } else {\r
-                               return false;\r
-                       }\r
-               } else {\r
-                       return false;\r
-               }\r
-               o_vertex[4] = end_of_coord;\r
-               return true;\r
-       }\r
-\r
-       private final INyARPca2d _pca;\r
-       private final NyARDoubleMatrix22 __getSquareLine_evec=new NyARDoubleMatrix22();\r
-       private final NyARDoublePoint2d __getSquareLine_mean=new NyARDoublePoint2d();\r
-       private final NyARDoublePoint2d __getSquareLine_ev=new NyARDoublePoint2d();\r
-       /**\r
-        * arGetLine(int x_coord[], int y_coord[], int coord_num,int vertex[], double line[4][3], double v[4][2]) arGetLine2(int x_coord[], int y_coord[], int\r
-        * coord_num,int vertex[], double line[4][3], double v[4][2], double *dist_factor) の2関数の合成品です。 マーカーのvertex,lineを計算して、結果をo_squareに保管します。\r
-        * Optimize:STEP[424->391]\r
-        * \r
-        * @param i_cparam\r
-        * @return\r
-        * @throws NyARException\r
-        */\r
-       private boolean getSquareLine(int[] i_mkvertex, int[] i_xcoord, int[] i_ycoord, NyARSquare o_square) throws NyARException\r
-       {\r
-               final NyARLinear[] l_line = o_square.line;\r
-               final NyARDoubleMatrix22 evec=this.__getSquareLine_evec;\r
-               final NyARDoublePoint2d mean=this.__getSquareLine_mean;\r
-               final NyARDoublePoint2d ev=this.__getSquareLine_ev;\r
-       \r
-               \r
-               for (int i = 0; i < 4; i++) {\r
-                       final double w1 = (double) (i_mkvertex[i + 1] - i_mkvertex[i] + 1) * 0.05 + 0.5;\r
-                       final int st = (int) (i_mkvertex[i] + w1);\r
-                       final int ed = (int) (i_mkvertex[i + 1] - w1);\r
-                       final int n = ed - st + 1;\r
-                       if (n < 2) {\r
-                               // nが2以下でmatrix.PCAを計算することはできないので、エラー\r
-                               return false;\r
-                       }\r
-                       //配列作成\r
-                       this._dist_factor.observ2IdealBatch(i_xcoord, i_ycoord, st, n,this._xpos,this._ypos);\r
-                       \r
-                       //主成分分析する。\r
-                       this._pca.pca(this._xpos,this._ypos,n,evec, ev,mean);\r
-                       final NyARLinear l_line_i = l_line[i];\r
-                       l_line_i.run = evec.m01;// line[i][0] = evec->m[1];\r
-                       l_line_i.rise = -evec.m00;// line[i][1] = -evec->m[0];\r
-                       l_line_i.intercept = -(l_line_i.run * mean.x + l_line_i.rise * mean.y);// line[i][2] = -(line[i][0]*mean->v[0] + line[i][1]*mean->v[1]);\r
-               }\r
-\r
-               final NyARDoublePoint2d[] l_sqvertex = o_square.sqvertex;\r
-               final NyARIntPoint2d[] l_imvertex = o_square.imvertex;\r
-               for (int i = 0; i < 4; i++) {\r
-                       final NyARLinear l_line_i = l_line[i];\r
-                       final NyARLinear l_line_2 = l_line[(i + 3) % 4];\r
-                       final double w1 = l_line_2.run * l_line_i.rise - l_line_i.run * l_line_2.rise;\r
-                       if (w1 == 0.0) {\r
-                               return false;\r
-                       }\r
-                       l_sqvertex[i].x = (l_line_2.rise * l_line_i.intercept - l_line_i.rise * l_line_2.intercept) / w1;\r
-                       l_sqvertex[i].y = (l_line_i.run * l_line_2.intercept - l_line_2.run * l_line_i.intercept) / w1;\r
-                       // 頂点インデクスから頂点座標を得て保存\r
-                       l_imvertex[i].x = i_xcoord[i_mkvertex[i]];\r
-                       l_imvertex[i].y = i_ycoord[i_mkvertex[i]];\r
-               }\r
-               return true;\r
-       }\r
-}\r
-\r
-\r
-\r
-/**\r
- * ラベル同士の重なり(内包関係)を調べるクラスです。 \r
- * ラベルリストに内包するラベルを蓄積し、それにターゲットのラベルが内包されているか を確認します。\r
- */\r
-class OverlapChecker\r
-{\r
-       private NyARLabelingLabel[] _labels = new NyARLabelingLabel[32];\r
-\r
-       private int _length;\r
-\r
-       /**\r
-        * 最大i_max_label個のラベルを蓄積できるようにオブジェクトをリセットする\r
-        * \r
-        * @param i_max_label\r
-        */\r
-       public void reset(int i_max_label)\r
-       {\r
-               if (i_max_label > this._labels.length) {\r
-                       this._labels = new NyARLabelingLabel[i_max_label];\r
-               }\r
-               this._length = 0;\r
-       }\r
-\r
-       /**\r
-        * チェック対象のラベルを追加する。\r
-        * \r
-        * @param i_label_ref\r
-        */\r
-       public void push(NyARLabelingLabel i_label_ref)\r
-       {\r
-               this._labels[this._length] = i_label_ref;\r
-               this._length++;\r
-       }\r
-\r
-       /**\r
-        * 現在リストにあるラベルと重なっているかを返す。\r
-        * \r
-        * @param i_label\r
-        * @return 何れかのラベルの内側にあるならばfalse,独立したラベルである可能性が高ければtrueです.\r
-        */\r
-       public boolean check(NyARLabelingLabel i_label)\r
-       {\r
-               // 重なり処理かな?\r
-               final NyARLabelingLabel[] label_pt = this._labels;\r
-               final int px1 = (int) i_label.pos_x;\r
-               final int py1 = (int) i_label.pos_y;\r
-               for (int i = this._length - 1; i >= 0; i--) {\r
-                       final int px2 = (int) label_pt[i].pos_x;\r
-                       final int py2 = (int) label_pt[i].pos_y;\r
-                       final int d = (px1 - px2) * (px1 - px2) + (py1 - py2) * (py1 - py2);\r
-                       if (d < label_pt[i].area / 4) {\r
-                               // 対象外\r
-                               return false;\r
-                       }\r
-               }\r
-               // 対象\r
-               return true;\r
-       }\r
-}
\ No newline at end of file
index 889add1..f81d943 100644 (file)
  */\r
 package jp.nyatla.nyartoolkit.core;\r
 \r
+\r
 import jp.nyatla.utils.*;\r
 \r
-public class NyARSquareStack extends NyObjectStack\r
+public class NyARSquareStack extends NyObjectStack<NyARSquare>\r
 {\r
        public NyARSquareStack(int i_length)\r
        {\r
-               super(new NyARSquare[i_length]);\r
+               super(i_length,NyARSquare.class);\r
 \r
        }\r
-\r
-       protected void onReservRequest(int i_start, int i_end, Object[] i_buffer)\r
+       protected NyARSquare createElement()\r
        {\r
-               for (int i = i_start; i < i_end; i++) {\r
-                       i_buffer[i] = new NyARSquare();\r
-               }\r
-       }\r
+               return new NyARSquare();\r
+       }       \r
 }\r
diff --git a/src/jp/nyatla/nyartoolkit/core/labeling/INyARLabelingImage.java b/src/jp/nyatla/nyartoolkit/core/labeling/INyARLabelingImage.java
deleted file mode 100644 (file)
index 8d66292..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* \r
- * PROJECT: NyARToolkit\r
- * --------------------------------------------------------------------------------\r
- * This work is based on the original ARToolKit developed by\r
- *   Hirokazu Kato\r
- *   Mark Billinghurst\r
- *   HITLab, University of Washington, Seattle\r
- * http://www.hitl.washington.edu/artoolkit/\r
- *\r
- * The NyARToolkit is Java version ARToolkit class library.\r
- * Copyright (C)2008 R.Iizuka\r
- *\r
- * This program is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU General Public License\r
- * as published by the Free Software Foundation; either version 2\r
- * of the License, or (at your option) any later version.\r
- * \r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- * \r
- * You should have received a copy of the GNU General Public License\r
- * along with this framework; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
- * \r
- * For further information please contact.\r
- *     http://nyatla.jp/nyatoolkit/\r
- *     <airmail(at)ebony.plala.or.jp>\r
- * \r
- */\r
-package jp.nyatla.nyartoolkit.core.labeling;\r
-import jp.nyatla.nyartoolkit.core.raster.*;\r
-\r
-public interface INyARLabelingImage extends INyARRaster\r
-{\r
-       public int[] getIndexArray();\r
-       public NyARLabelingLabelStack getLabelStack();\r
-       public void reset(boolean i_label_index_enable);\r
-}\r
diff --git a/src/jp/nyatla/nyartoolkit/core/labeling/NyARLabelInfo.java b/src/jp/nyatla/nyartoolkit/core/labeling/NyARLabelInfo.java
new file mode 100644 (file)
index 0000000..6079691
--- /dev/null
@@ -0,0 +1,10 @@
+package jp.nyatla.nyartoolkit.core.labeling;\r
+\r
+/**\r
+ * \r
+ *\r
+ */\r
+public class NyARLabelInfo\r
+{\r
+       public int area;\r
+}\r
  */\r
 package jp.nyatla.nyartoolkit.core.labeling;\r
 \r
+\r
 import jp.nyatla.utils.*;\r
 \r
 /**\r
  * NyLabelの予約型動的配列\r
  * \r
  */\r
-public class NyARLabelingLabelStack extends NyObjectStack\r
+public abstract class NyARLabelInfoStack<T extends NyARLabelInfo> extends NyObjectStack<T>\r
 {\r
-       protected NyARLabelingLabelStack(NyARLabelingLabel[] i_label_array)\r
-       {\r
-               super(i_label_array);           \r
-       }\r
-       public NyARLabelingLabelStack(int i_max_array_size)\r
+       public NyARLabelInfoStack(int i_length,Class<T> i_element_type)\r
        {\r
-               super(new NyARLabelingLabel[i_max_array_size]);\r
+               super(i_length,i_element_type);\r
        }\r
-\r
-       protected void onReservRequest(int i_start, int i_end, Object[] i_buffer)\r
-       {\r
-               for (int i = i_start; i < i_end; i++) {\r
-                       i_buffer[i] = new NyARLabelingLabel();\r
-               }\r
-       }\r
-\r
+               \r
        /**\r
         * エリアの大きい順にラベルをソートします。\r
         */\r
@@ -62,12 +52,12 @@ public class NyARLabelingLabelStack extends NyObjectStack
        {\r
                int len=this._length;\r
                int h = len *13/10;\r
-               NyARLabelingLabel[] item=(NyARLabelingLabel[])this._items;\r
+               T[] item=this._items;\r
                for(;;){\r
                    int swaps = 0;\r
                    for (int i = 0; i + h < len; i++) {\r
                        if (item[i + h].area > item[i].area) {\r
-                           final NyARLabelingLabel temp = item[i + h];\r
+                           final T temp = item[i + h];\r
                            item[i + h] = item[i];\r
                            item[i] = temp;\r
                            swaps++;\r
@@ -29,7 +29,7 @@
  *     <airmail(at)ebony.plala.or.jp>\r
  * \r
  */\r
-package jp.nyatla.nyartoolkit.core.labeling;\r
+package jp.nyatla.nyartoolkit.core.labeling.artoolkit;\r
 \r
 import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.raster.*;\r
@@ -40,7 +40,7 @@ import jp.nyatla.nyartoolkit.core.types.*;
 /**\r
  *\r
  */\r
-public class NyARLabelingImage extends NyARRaster_BasicClass implements INyARLabelingImage\r
+public class NyARLabelingImage extends NyARRaster_BasicClass\r
 {\r
        private final static int MAX_LABELS = 1024*32;  \r
        protected int[] _ref_buf;\r
@@ -56,14 +56,34 @@ public class NyARLabelingImage extends NyARRaster_BasicClass implements INyARLab
                this._index_table=new int[MAX_LABELS];\r
                this._is_index_table_enable=false;\r
                this._buffer_reader=new NyARBufferReader(this._ref_buf,INyARBufferReader.BUFFERFORMAT_INT1D);\r
-               \r
+               //生成時に枠を書きます。\r
+               drawFrameEdge();\r
                return;\r
        }\r
        public INyARBufferReader getBufferReader()\r
        {\r
                return this._buffer_reader;\r
        }\r
-\r
+       /**\r
+        * エッジを書きます。\r
+        */\r
+       public void drawFrameEdge()\r
+       {\r
+               int w=this._size.w;\r
+               int h=this._size.h;\r
+               // NyLabelingImageのイメージ初期化(枠書き)\r
+               int[] img = (int[]) this._ref_buf;\r
+               int bottom_ptr = (h - 1) * w;\r
+               for (int i = 0; i < w; i++) {\r
+                       img[i] = 0;\r
+                       img[bottom_ptr + i] = 0;\r
+               }\r
+               for (int i = 0; i < h; i++) {\r
+                       img[i * w] = 0;\r
+                       img[(i + 1) * w - 1] = 0;\r
+               }\r
+               return;\r
+       }\r
 \r
        /**\r
         * ラベリング結果がインデックステーブルを持つ場合、その配列を返します。\r
@@ -92,15 +112,16 @@ public class NyARLabelingImage extends NyARRaster_BasicClass implements INyARLab
                this._is_index_table_enable=i_label_index_enable;\r
                return;\r
        }\r
-       \r
-       protected final int[] _getContour_xdir = { 0, 1, 1, 1, 0,-1,-1,-1};\r
-       protected final int[] _getContour_ydir = {-1,-1, 0, 1, 1, 1, 0,-1};\r
+       //巡回参照できるように、テーブルを二重化\r
+       //                                           0  1  2  3  4  5  6  7   0  1  2  3  4  5  6\r
+       protected final static int[] _getContour_xdir = { 0, 1, 1, 1, 0,-1,-1,-1 , 0, 1, 1, 1, 0,-1,-1};\r
+       protected final static int[] _getContour_ydir = {-1,-1, 0, 1, 1, 1, 0,-1 ,-1,-1, 0, 1, 1, 1, 0};\r
        /**\r
         * i_labelのラベルの、クリップ領域が上辺に接しているx座標を返します。\r
         * @param i_index\r
         * @return\r
         */\r
-       protected int getTopClipTangentX(NyARLabelingLabel i_label) throws NyARException\r
+       public int getTopClipTangentX(NyARLabelingLabel i_label) throws NyARException\r
        {\r
                int pix;\r
                int i_label_id=i_label.id;\r
@@ -118,64 +139,4 @@ public class NyARLabelingImage extends NyARRaster_BasicClass implements INyARLab
                //あれ?見つからないよ?\r
                throw new NyARException();\r
        }\r
-       /**\r
-        * i_index番目のラベルの輪郭線を配列に返します。\r
-        * @param i_index\r
-        * @param i_array_size\r
-        * @param o_coord_x\r
-        * @param o_coord_y\r
-        * @return\r
-        * 輪郭線の長さを返します。\r
-        * @throws NyARException\r
-        */\r
-       public int getContour(int i_index,int i_array_size,int[] o_coord_x,int[] o_coord_y) throws NyARException\r
-       {\r
-               final int width=this._size.w;\r
-               final int[] xdir = this._getContour_xdir;// static int xdir[8] = { 0,1, 1, 1, 0,-1,-1,-1};\r
-               final int[] ydir = this._getContour_ydir;// static int ydir[8] = {-1,-1,0, 1, 1, 1, 0,-1};\r
-               final NyARLabelingLabel label=(NyARLabelingLabel)this._label_list.getItem(i_index);             \r
-               int i;\r
-               //クリップ領域の上端に接しているポイントを得る。\r
-               int sx=getTopClipTangentX(label);\r
-               int sy=label.clip_t;\r
-\r
-               int coord_num = 1;\r
-               o_coord_x[0] = sx;\r
-               o_coord_y[0] = sy;\r
-               int dir = 5;\r
-\r
-               int[] limage=this._ref_buf;\r
-               int c = o_coord_x[0];\r
-               int r = o_coord_y[0];\r
-               for (;;) {\r
-                       dir = (dir + 5) % 8;\r
-                       for (i = 0; i < 8; i++) {\r
-                               if (limage[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {\r
-                                       break;\r
-                               }\r
-                               dir = (dir + 1) % 8;\r
-                       }\r
-                       if (i == 8) {\r
-                               //8方向全て調べたけどラベルが無いよ?\r
-                               throw new NyARException();// return(-1);\r
-                       }\r
-                       // xcoordとycoordをc,rにも保存\r
-                       c = c + xdir[dir];\r
-                       r = r + ydir[dir];\r
-                       o_coord_x[coord_num] = c;\r
-                       o_coord_y[coord_num] = r;\r
-                       // 終了条件判定\r
-                       if (c == sx && r == sy){\r
-                               coord_num++;\r
-                               break;\r
-                       }\r
-                       coord_num++;\r
-                       if (coord_num == i_array_size) {\r
-                               //輪郭が末端に達した\r
-                               return coord_num;\r
-                       }\r
-               }\r
-               return coord_num;               \r
-               \r
-       }\r
 }\r
  *     <airmail(at)ebony.plala.or.jp>\r
  * \r
  */\r
-package jp.nyatla.nyartoolkit.core.labeling;\r
+package jp.nyatla.nyartoolkit.core.labeling.artoolkit;\r
 \r
-public class NyARLabelingLabel\r
+import jp.nyatla.nyartoolkit.core.labeling.*;\r
+/**\r
+ * [[Strage class]]\r
+ *\r
+ */\r
+public class NyARLabelingLabel extends NyARLabelInfo\r
 {\r
        public int id;\r
-       public int area;\r
        public int clip_r;// 0\r
        public int clip_l;// 1\r
        public int clip_b;// 2\r
  *     <airmail(at)ebony.plala.or.jp>\r
  * \r
  */\r
-package jp.nyatla.nyartoolkit.core.labeling;\r
+package jp.nyatla.nyartoolkit.core.labeling.artoolkit;\r
 \r
-import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.nyartoolkit.core.raster.*;\r
 \r
-public interface INyARLabeling\r
-{\r
-       public void attachDestination(INyARLabelingImage i_destination_image) throws NyARException;\r
-       public INyARLabelingImage getAttachedDestination();\r
 \r
-       public void labeling(NyARBinRaster i_raster) throws NyARException;\r
+import jp.nyatla.nyartoolkit.core.labeling.*;\r
+\r
+/**\r
+ * NyLabelの予約型動的配列\r
+ * \r
+ */\r
+public class NyARLabelingLabelStack extends NyARLabelInfoStack<NyARLabelingLabel>\r
+{\r
+       public NyARLabelingLabelStack(int i_max_array_size)\r
+       {\r
+               super(i_max_array_size,NyARLabelingLabel.class);\r
+       }\r
+       protected NyARLabelingLabel createElement()\r
+       {\r
+               return new NyARLabelingLabel();\r
+       }               \r
 }\r
+       \r
@@ -29,7 +29,7 @@
  *     <airmail(at)ebony.plala.or.jp>\r
  * \r
  */\r
-package jp.nyatla.nyartoolkit.core.labeling;\r
+package jp.nyatla.nyartoolkit.core.labeling.artoolkit;\r
 \r
 import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.raster.*;\r
@@ -39,43 +39,12 @@ import jp.nyatla.nyartoolkit.core.types.*;
  * ARToolKit互換のラベリングクラスです。 ARToolKitと同一な評価結果を返します。\r
  * \r
  */\r
-public class NyARLabeling_ARToolKit implements INyARLabeling\r
+final public class NyARLabeling_ARToolKit\r
 {\r
        private static final int WORK_SIZE = 1024 * 32;// #define WORK_SIZE 1024*32\r
 \r
        private final NyARWorkHolder work_holder = new NyARWorkHolder(WORK_SIZE);\r
 \r
-       private NyARIntSize _dest_size;\r
-\r
-       private INyARLabelingImage _out_image;\r
-\r
-       public void attachDestination(INyARLabelingImage i_destination_image) throws NyARException\r
-       {\r
-               // サイズチェック\r
-               NyARIntSize size = i_destination_image.getSize();\r
-               this._out_image = i_destination_image;\r
-\r
-               // NyLabelingImageのイメージ初期化(枠書き)\r
-               int[] img = (int[]) i_destination_image.getBufferReader().getBuffer();\r
-               int bottom_ptr = (size.h - 1) * size.w;\r
-               for (int i = 0; i < size.w; i++) {\r
-                       img[i] = 0;\r
-                       img[bottom_ptr + i] = 0;\r
-               }\r
-               for (int i = 0; i < size.h; i++) {\r
-                       img[i * size.w] = 0;\r
-                       img[(i + 1) * size.w - 1] = 0;\r
-               }\r
-\r
-               // サイズ(参照値)を保存\r
-               this._dest_size = size;\r
-               return;\r
-       }\r
-\r
-       public INyARLabelingImage getAttachedDestination()\r
-       {\r
-               return this._out_image;\r
-       }\r
 \r
        /**\r
         * static ARInt16 *labeling2( ARUint8 *image, int thresh,int *label_num, int **area, double **pos, int **clip,int **label_ref, int LorR ) 関数の代替品\r
@@ -84,26 +53,26 @@ public class NyARLabeling_ARToolKit implements INyARLabeling
         * @param i_raster\r
         * @throws NyARException\r
         */\r
-       public void labeling(NyARBinRaster i_raster) throws NyARException\r
+       public void labeling(NyARBinRaster i_raster,NyARLabelingImage o_destination) throws NyARException\r
        {\r
                int label_img_ptr1, label_pixel;\r
                int i, j;\r
                int n, k; /* work */\r
-\r
+               \r
                // サイズチェック\r
                NyARIntSize in_size = i_raster.getSize();\r
-               this._dest_size.isEqualSize(in_size);\r
+               assert(o_destination.getSize().isEqualSize(in_size));\r
 \r
                final int lxsize = in_size.w;// lxsize = arUtil_c.arImXsize;\r
                final int lysize = in_size.h;// lysize = arUtil_c.arImYsize;\r
-               final int[] label_img = (int[]) this._out_image.getBufferReader().getBuffer();\r
+               final int[] label_img = (int[]) o_destination.getBufferReader().getBuffer();\r
 \r
                // 枠作成はインスタンスを作った直後にやってしまう。\r
 \r
                // ラベリング情報のリセット(ラベリングインデックスを使用)\r
-               this._out_image.reset(true);\r
+               o_destination.reset(true);\r
 \r
-               int[] label_idxtbl = this._out_image.getIndexArray();\r
+               int[] label_idxtbl = o_destination.getIndexArray();\r
                int[] raster_buf = (int[]) i_raster.getBufferReader().getBuffer();\r
 \r
                int[] work2_pt;\r
@@ -243,18 +212,18 @@ public class NyARLabeling_ARToolKit implements INyARLabeling
                wlabel_num -= 1;// *label_num = *wlabel_num = j - 1;\r
                if (wlabel_num == 0) {// if( *label_num == 0 ) {\r
                        // 発見数0\r
-                       this._out_image.getLabelStack().clear();\r
+                       o_destination.getLabelStack().clear();\r
                        return;\r
                }\r
                // ラベル情報の保存等\r
-               NyARLabelingLabelStack label_list = this._out_image.getLabelStack();\r
+               NyARLabelingLabelStack label_list = o_destination.getLabelStack();\r
 \r
                // ラベルバッファを予約\r
                label_list.reserv(wlabel_num);\r
 \r
                // エリアと重心、クリップ領域を計算\r
                NyARLabelingLabel label_pt;\r
-               NyARLabelingLabel[] labels = (NyARLabelingLabel[]) label_list.getArray();\r
+               NyARLabelingLabel[] labels =label_list.getArray();\r
                for (i = 0; i < wlabel_num; i++) {\r
                        label_pt = labels[i];\r
                        label_pt.id = i + 1;\r
diff --git a/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java b/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java
new file mode 100644 (file)
index 0000000..02e677d
--- /dev/null
@@ -0,0 +1,236 @@
+/* このソースは実験用のソースです。\r
+ * 動いたり動かなかったりします。\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.core.labeling.rlelabeling;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+\r
+\r
+\r
+/**\r
+ * [strage class]\r
+ */\r
+\r
+\r
+class RleElement\r
+{\r
+       short l;\r
+       short r;\r
+       short id;\r
+       public static RleElement[] createArray(int i_length)\r
+       {\r
+               RleElement[] ret = new RleElement[i_length];\r
+               for (int i = 0; i < i_length; i++) {\r
+                       ret[i] = new RleElement();\r
+               }\r
+               return ret;\r
+       }\r
+}\r
+\r
+// RleImageをラベリングする。\r
+public class NyARLabeling_Rle\r
+{\r
+       private RleElement[] _rle1;\r
+\r
+       private RleElement[] _rle2;\r
+\r
+       private short number_of_fragment; // 現在のフラグメントの数\r
+\r
+       public NyARLabeling_Rle(int i_width)\r
+       {\r
+               this._rle1 = RleElement.createArray(i_width/2+1);\r
+               this._rle2 = RleElement.createArray(i_width/2+1);\r
+               return;\r
+       }\r
+\r
+       /**\r
+        * i_bin_bufのbinイメージをREL圧縮する。\r
+        * \r
+        * @param i_bin_raster\r
+        */\r
+       private int toRel(int[] i_bin_buf, int i_st, int i_len, RleElement[] i_out)\r
+       {\r
+               short current = 0;\r
+               short r = -1;\r
+               // 行確定開始\r
+               int x = i_st;\r
+               final int right_edge = i_st + i_len - 1;\r
+               while (x < right_edge) {\r
+                       // 暗点(0)スキャン\r
+                       if (i_bin_buf[x] != 0) {\r
+                               x++;\r
+                               continue;\r
+                       }\r
+                       // 暗点発見→暗点長を調べる\r
+                       r = (short) (x - i_st);\r
+                       i_out[current].l = r;\r
+                       r++;// 暗点+1\r
+                       x++;\r
+                       while (x < right_edge) {\r
+                               if (i_bin_buf[x] != 0) {\r
+                                       // 明点(1)→暗点(0)配列終了>登録\r
+                                       i_out[current].r = r;\r
+                                       current++;\r
+                                       x++;// 次点の確認。\r
+                                       r = -1;// 右端の位置を0に。\r
+                                       break;\r
+                               } else {\r
+                                       // 暗点(0)長追加\r
+                                       r++;\r
+                                       x++;\r
+                               }\r
+                       }\r
+               }\r
+               // 最後の1点だけ判定方法が少し違うの。\r
+               if (i_bin_buf[x] != 0) {\r
+                       // 明点→rカウント中なら暗点配列終了>登録\r
+                       if (r >= 0) {\r
+                               i_out[current].r = r;\r
+                               current++;\r
+                       }\r
+               } else {\r
+                       // 暗点→カウント中でなければl1で追加\r
+                       if (r >= 0) {\r
+                               i_out[current].r = (short) (r + 1);\r
+                       } else {\r
+                               // 最後の1点の場合\r
+                               i_out[current].l = (short) (i_st + i_len - 1);\r
+                               i_out[current].r = (short) (i_st + i_len);\r
+                       }\r
+                       current++;\r
+               }\r
+               // 行確定\r
+               return current;\r
+       }\r
+\r
+       private void addFragment(RleElement i_rel_img, short i_nof, int i_row_index, int i_rel_index,RleLabelFragmentInfoStack o_stack) throws NyARException\r
+       {\r
+               i_rel_img.id = i_nof;// REL毎の固有ID\r
+               RleLabelFragmentInfoStack.RleLabelFragmentInfo v = o_stack.prePush();\r
+               v.id = i_nof;\r
+               v.entry_x = i_rel_img.l;\r
+               v.entry_y = (short) i_row_index;\r
+               v.area = i_rel_img.r - i_rel_img.l;\r
+               return;\r
+       }\r
+\r
+       //\r
+       public void labeling(NyARBinRaster i_bin_raster, int i_top, int i_bottom,RleLabelFragmentInfoStack o_stack) throws NyARException\r
+       {\r
+               // リセット処理\r
+               this.number_of_fragment = 0;\r
+               o_stack.clear();\r
+               //\r
+               RleElement[] rle_prev = this._rle1;\r
+               RleElement[] rle_current = this._rle2;\r
+               int len_prev = 0;\r
+               int len_current = 0;\r
+               final int width = i_bin_raster.getWidth();\r
+               int[] in_buf = (int[]) i_bin_raster.getBufferReader().getBuffer();\r
+\r
+               short nof = this.number_of_fragment;\r
+               // 初段登録\r
+\r
+               len_prev = toRel(in_buf, i_top, width, rle_prev);\r
+               for (int i = 0; i < len_prev; i++) {\r
+                       // フラグメントID=フラグメント初期値、POS=Y値、RELインデクス=行\r
+                       addFragment(rle_prev[i], nof, i_top, i,o_stack);\r
+                       nof++;\r
+                       // nofの最大値チェック\r
+               }\r
+               RleLabelFragmentInfoStack.RleLabelFragmentInfo[] f_array = o_stack.getArray();\r
+               // 次段結合\r
+               for (int y = i_top + 1; y < i_bottom; y++) {\r
+                       // カレント行の読込\r
+                       len_current = toRel(in_buf, y * width, width, rle_current);\r
+                       int index_prev = 0;\r
+\r
+                       SCAN_CUR: for (int i = 0; i < len_current; i++) {\r
+                               // index_prev,len_prevの位置を調整する\r
+                               short id = -1;\r
+                               // チェックすべきprevがあれば確認\r
+                               SCAN_PREV: while (index_prev < len_prev) {\r
+                                       if (rle_current[i].l - rle_prev[index_prev].r > 0) {// 0なら8方位ラベリング\r
+                                               // prevがcurの左方にある→次のフラグメントを探索\r
+                                               index_prev++;\r
+                                               continue;\r
+                                       } else if (rle_prev[index_prev].l - rle_current[i].r > 0) {// 0なら8方位ラベリングになる\r
+                                               // prevがcur右方にある→独立フラグメント\r
+                                               addFragment(rle_current[i], nof, y, i,o_stack);\r
+                                               nof++;\r
+                                               // 次のindexをしらべる\r
+                                               continue SCAN_CUR;\r
+                                       }\r
+                                       // 結合対象->prevのIDをコピーして、対象フラグメントの情報を更新\r
+                                       id = f_array[rle_prev[index_prev].id].id;\r
+                                       RleLabelFragmentInfoStack.RleLabelFragmentInfo prev_ptr;\r
+                                       final RleLabelFragmentInfoStack.RleLabelFragmentInfo id_ptr = f_array[id];\r
+                                       prev_ptr = f_array[rle_prev[index_prev].id];\r
+                                       rle_current[i].id = id;\r
+                                       id_ptr.area += (rle_current[i].r - rle_current[i].l);\r
+                                       // エントリポイントの情報をコピー\r
+                                       id_ptr.entry_x = prev_ptr.entry_x;\r
+                                       id_ptr.entry_y = prev_ptr.entry_y;\r
+                                       // 多重リンクの確認\r
+\r
+                                       index_prev++;\r
+                                       while (index_prev < len_prev) {\r
+                                               if (rle_current[i].l - rle_prev[index_prev].r > 0) {// 0なら8方位ラベリング\r
+                                                       // prevがcurの左方にある→prevはcurに連結していない。\r
+                                                       break SCAN_PREV;\r
+                                               } else if (rle_prev[index_prev].l - rle_current[i].r > 0) {// 0なら8方位ラベリングになる\r
+                                                       // prevがcurの右方にある→prevはcurに連結していない。\r
+                                                       index_prev--;\r
+                                                       continue SCAN_CUR;\r
+                                               }\r
+                                               // prevとcurは連結している。\r
+                                               final short prev_id = rle_prev[index_prev].id;\r
+                                               prev_ptr = f_array[prev_id];\r
+                                               if (id != prev_id) {\r
+                                                       id_ptr.area += prev_ptr.area;\r
+                                                       prev_ptr.area = 0;\r
+                                                       // 結合対象->現在のidをインデクスにセット\r
+                                                       prev_ptr.id = id;\r
+                                                       // エントリポイントを訂正\r
+                                                       if (id_ptr.entry_y > prev_ptr.entry_y) {\r
+                                                               // 現在のエントリポイントの方が下にある。(何もしない)\r
+                                                       }\r
+                                                       if (id_ptr.entry_y < prev_ptr.entry_y) {\r
+                                                               // 現在のエントリポイントの方が上にある。(エントリポイントの交換)\r
+                                                               prev_ptr.entry_y = id_ptr.entry_y;\r
+                                                               prev_ptr.entry_x = id_ptr.entry_x;\r
+                                                       } else {\r
+                                                               // 水平方向で小さい方がエントリポイント。\r
+                                                               if (id_ptr.entry_x < prev_ptr.entry_x) {\r
+                                                                       prev_ptr.entry_y = id_ptr.entry_y;\r
+                                                                       prev_ptr.entry_x = id_ptr.entry_x;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                               index_prev++;\r
+                                       }\r
+                                       index_prev--;\r
+                                       break;\r
+                               }\r
+                               // curにidが割り当てられたかを確認\r
+                               // 右端独立フラグメントを追加\r
+                               if (id < 0) {\r
+                                       addFragment(rle_current[i], nof, y, i,o_stack);\r
+                                       nof++;\r
+                               }\r
+                       }\r
+                       // prevとrelの交換\r
+                       RleElement[] tmp = rle_prev;\r
+                       rle_prev = rle_current;\r
+                       len_prev = len_current;\r
+                       rle_current = tmp;\r
+               }\r
+               // フラグメントの数を更新\r
+               this.number_of_fragment = nof;\r
+       }       \r
+}\r
+\r
+\r
+\r
diff --git a/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/RleLabelFragmentInfoStack.java b/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/RleLabelFragmentInfoStack.java
new file mode 100644 (file)
index 0000000..34c9bbf
--- /dev/null
@@ -0,0 +1,32 @@
+package jp.nyatla.nyartoolkit.core.labeling.rlelabeling;\r
+\r
+\r
+import jp.nyatla.nyartoolkit.core.labeling.NyARLabelInfo;\r
+import jp.nyatla.nyartoolkit.core.labeling.NyARLabelInfoStack;\r
+\r
+\r
+public class RleLabelFragmentInfoStack  extends NyARLabelInfoStack<RleLabelFragmentInfoStack.RleLabelFragmentInfo>\r
+{\r
+       public class RleLabelFragmentInfo extends NyARLabelInfo\r
+       {\r
+               //継承メンバ\r
+               //int area; // フラグメントラベルの領域数\r
+               public short id; // フラグメントラベルのインデクス\r
+               public short entry_x; // フラグメントラベルの位置\r
+               public short entry_y; // フラグメントラベルの位置\r
+               public short clip_t;\r
+               public short clip_l;\r
+               public short clip_r;\r
+               public short clip_b;\r
+       }       \r
+       public RleLabelFragmentInfoStack(int i_length)\r
+       {\r
+               super(i_length, RleLabelFragmentInfoStack.RleLabelFragmentInfo.class);\r
+               return;\r
+       }\r
+\r
+       protected RleLabelFragmentInfoStack.RleLabelFragmentInfo createElement()\r
+       {\r
+               return new RleLabelFragmentInfoStack.RleLabelFragmentInfo();\r
+       }\r
+}
\ No newline at end of file
index 316b4e6..2fb558a 100644 (file)
@@ -67,7 +67,7 @@ public class NyARPca2d_MatrixPCA implements INyARPca2d
                o_evec.m10=evec_array[1][0];\r
                o_evec.m11=evec_array[1][1];\r
                o_ev.x=ev_array[0];\r
-               o_ev.x=ev_array[1];\r
+               o_ev.y=ev_array[1];\r
                o_mean.x=mean_array[0];\r
                o_mean.y=mean_array[1];\r
                return;\r
index f5030b2..fc3302b 100644 (file)
@@ -212,6 +212,8 @@ public class NyARColorPatt_O3 implements INyARColorPatt
                        this.__updateExtpat_xw=new double[i_xdiv];\r
                        this.__updateExtpat_yw=new double[i_ydiv];\r
                        this.__updateExtpat_rgbset=new int[i_xdiv*i_ydiv*3];\r
+                       this._last_pix_resolution_x=i_xdiv;\r
+                       this._last_pix_resolution_y=i_ydiv;\r
                }\r
                return;\r
        }\r
index 03809d3..7cacffa 100644 (file)
@@ -45,7 +45,7 @@ public final class NyARGrayscaleRaster extends NyARRaster_BasicClass
        {\r
                super(new NyARIntSize(i_width,i_height));\r
                this._ref_buf = new int[i_height*i_width];\r
-               this._buffer_reader=new NyARBufferReader(this._ref_buf,INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8);\r
+               this._buffer_reader=new NyARBufferReader(this._ref_buf,INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8);\r
        }\r
        public INyARBufferReader getBufferReader()\r
        {\r
index ed83cf0..84d357d 100644 (file)
@@ -31,6 +31,7 @@
  */\r
 package jp.nyatla.nyartoolkit.core.raster.rgb;\r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.rasterreader.*;\r
 import jp.nyatla.nyartoolkit.core.types.*;\r
 \r
@@ -68,6 +69,15 @@ public class NyARRgbRaster_BGRA extends NyARRgbRaster_BasicClass implements INyA
                        }\r
                        return;\r
                }\r
+               public void setPixel(int i_x, int i_y, int[] i_rgb) throws NyARException\r
+               {\r
+                       NyARException.notImplement();           \r
+               }\r
+               public void setPixels(int[] i_x, int[] i_y, int i_num, int[] i_intrgb) throws NyARException\r
+               {\r
+                       NyARException.notImplement();           \r
+               }\r
+               \r
        }\r
 \r
        private INyARRgbPixelReader _rgb_reader;\r
@@ -79,12 +89,12 @@ public class NyARRgbRaster_BGRA extends NyARRgbRaster_BasicClass implements INyA
                return new NyARRgbRaster_BGRA(i_buffer, i_width, i_height);\r
        }\r
 \r
-       private NyARRgbRaster_BGRA(byte[] i_buffer, int i_width, int i_height)\r
+       private NyARRgbRaster_BGRA(byte[] i_ref_buffer, int i_width, int i_height)\r
        {\r
                super(new NyARIntSize(i_width,i_height));\r
-               this._ref_buf = i_buffer;\r
+               this._ref_buf = i_ref_buffer;\r
                this._rgb_reader = new PixelReader(this);\r
-               this._buffer_reader=new NyARBufferReader(i_buffer,INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32);\r
+               this._buffer_reader=new NyARBufferReader(i_ref_buffer,INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32);\r
                return;\r
        }\r
        public INyARRgbPixelReader getRgbPixelReader()\r
index 875707d..e463f8a 100644 (file)
@@ -31,6 +31,7 @@
  */\r
 package jp.nyatla.nyartoolkit.core.raster.rgb;\r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.rasterreader.INyARBufferReader;\r
 import jp.nyatla.nyartoolkit.core.rasterreader.INyARRgbPixelReader;\r
 import jp.nyatla.nyartoolkit.core.rasterreader.NyARBufferReader;\r
@@ -59,7 +60,16 @@ public class NyARRgbRaster_Blank extends NyARRgbRaster_BasicClass
                                o_rgb[i * 3 + 1] = 0;// G\r
                                o_rgb[i * 3 + 2] = 0;// B\r
                        }\r
-               }               \r
+               }\r
+               public void setPixel(int i_x, int i_y, int[] i_rgb) throws NyARException\r
+               {\r
+                       NyARException.notImplement();           \r
+               }\r
+               public void setPixels(int[] i_x, int[] i_y, int i_num, int[] i_intrgb) throws NyARException\r
+               {\r
+                       NyARException.notImplement();           \r
+               }\r
+               \r
        }\r
 \r
        private INyARRgbPixelReader _reader;\r
index 33d6918..2e4d36e 100644 (file)
@@ -46,12 +46,12 @@ public class NyARRgbRaster_RGB extends NyARRgbRaster_BasicClass
                return new NyARRgbRaster_RGB(i_buffer, i_width, i_height);\r
        }\r
 \r
-       private NyARRgbRaster_RGB(byte[] i_buffer, int i_width, int i_height)\r
+       private NyARRgbRaster_RGB(byte[] i_ref_buffer, int i_width, int i_height)\r
        {\r
                super(new NyARIntSize(i_width,i_height));\r
-               this._ref_buf = i_buffer;\r
-               this._reader = new NyARRgbPixelReader_RGB24(i_buffer, this._size);\r
-               this._buffer_reader=new NyARBufferReader(i_buffer,INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24);\r
+               this._ref_buf = i_ref_buffer;\r
+               this._reader = new NyARRgbPixelReader_RGB24(i_ref_buffer, this._size);\r
+               this._buffer_reader=new NyARBufferReader(i_ref_buffer,INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24);\r
                return;\r
        }\r
        public INyARRgbPixelReader getRgbPixelReader()\r
index d2149aa..fab4534 100644 (file)
@@ -43,156 +43,268 @@ import jp.nyatla.nyartoolkit.core.types.*;
  */\r
 public class NyARRasterFilter_ARToolkitThreshold implements INyARRasterFilter_RgbToBin\r
 {\r
-       private int _threshold;\r
-\r
-       public NyARRasterFilter_ARToolkitThreshold(int i_threshold)\r
+       interface IdoThFilterImpl\r
        {\r
-               this._threshold = i_threshold;\r
+               public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold);\r
        }\r
-       public void setThreshold(int i_threshold)\r
+       class doThFilterImpl_BUFFERFORMAT_BYTE1D_RGB_24 implements IdoThFilterImpl\r
        {\r
-               this._threshold = i_threshold;\r
+               public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold)\r
+               {\r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       byte[] in_buf = (byte[]) i_input.getBuffer();\r
+                       \r
+                       final int th=i_threshold*3;\r
+                       int bp =(i_size.w*i_size.h-1)*3;\r
+                       int w;\r
+                       int xy;\r
+                       final int pix_count   =i_size.h*i_size.w;\r
+                       final int pix_mod_part=pix_count-(pix_count%8);\r
+                       for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                       }\r
+                       //タイリング\r
+                       for (;xy>=0;) {\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 3;\r
+                               xy--;\r
+                       }\r
+                       return;                 \r
+               }\r
+               \r
        }\r
-\r
-       public void doFilter(INyARRgbRaster i_input, NyARBinRaster i_output) throws NyARException\r
+       class doThFilterImpl_BUFFERFORMAT_BYTE1D_B8G8R8X8_32 implements IdoThFilterImpl\r
        {\r
-               INyARBufferReader in_buffer_reader=i_input.getBufferReader();   \r
-               INyARBufferReader out_buffer_reader=i_output.getBufferReader();\r
-               int in_buf_type=in_buffer_reader.getBufferType();\r
-\r
-               assert (out_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_BIN_8));\r
-               assert (checkInputType(in_buf_type)==true);     \r
-               assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
+               public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold)\r
+               {\r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       byte[] in_buf = (byte[]) i_input.getBuffer();\r
+                       \r
+                       final int th=i_threshold*3;\r
+                       int bp =(i_size.w*i_size.h-1)*4;\r
+                       int w;\r
+                       int xy;\r
+                       final int pix_count   =i_size.h*i_size.w;\r
+                       final int pix_mod_part=pix_count-(pix_count%8);\r
+                       for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                       }\r
+                       //タイリング\r
+                       for (;xy>=0;) {\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp] & 0xff) + (in_buf[bp + 1] & 0xff) + (in_buf[bp + 2] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                       }                       \r
+               }               \r
+       }\r
+       \r
+       class doThFilterImpl_BUFFERFORMAT_BYTE1D_X8R8G8B8_32 implements IdoThFilterImpl\r
+       {\r
+               public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold)\r
+               {\r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       byte[] in_buf = (byte[]) i_input.getBuffer();\r
+                       \r
+                       final int th=i_threshold*3;\r
+                       int bp =(i_size.w*i_size.h-1)*4;\r
+                       int w;\r
+                       int xy;\r
+                       final int pix_count   =i_size.h*i_size.w;\r
+                       final int pix_mod_part=pix_count-(pix_count%8);\r
+                       for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                       }\r
+                       //タイリング\r
+                       for (;xy>=0;) {\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                               w= ((in_buf[bp+1] & 0xff) + (in_buf[bp + 2] & 0xff) + (in_buf[bp + 3] & 0xff));\r
+                               out_buf[xy]=w<=th?0:1;\r
+                               bp -= 4;\r
+                               xy--;\r
+                       }\r
+                       return;                 \r
+               }\r
+               \r
+       }       \r
+       \r
+       class doThFilterImpl_BUFFERFORMAT_INT1D_X8R8G8B8_32 implements IdoThFilterImpl\r
+       {\r
+               public void doThFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size,int i_threshold)\r
+               {\r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       int[] in_buf = (int[]) i_input.getBuffer();\r
+                       \r
+                       final int th=i_threshold*3;\r
+                       int w;\r
+                       int xy;\r
+                       final int pix_count   =i_size.h*i_size.w;\r
+                       final int pix_mod_part=pix_count-(pix_count%8);\r
 \r
-               int[] out_buf = (int[]) out_buffer_reader.getBuffer();\r
-               byte[] in_buf = (byte[]) in_buffer_reader.getBuffer();\r
+                       for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                       }\r
+                       //タイリング\r
+                       for (;xy>=0;) {\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                               w=in_buf[xy];\r
+                               out_buf[xy]=(((w>>16)&0xff)+((w>>8)&0xff)+(w&0xff))<=th?0:1;\r
+                               xy--;\r
+                       }                       \r
+               }               \r
+       }       \r
+       private int _threshold;\r
+       private IdoThFilterImpl _do_threshold_impl;\r
 \r
-               NyARIntSize size = i_output.getSize();\r
-               switch (in_buffer_reader.getBufferType()) {\r
+       public NyARRasterFilter_ARToolkitThreshold(int i_threshold,int i_input_raster_type) throws NyARException\r
+       {\r
+               this._threshold = i_threshold;\r
+               switch (i_input_raster_type) {\r
                case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
                case INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
-                       convert24BitRgb(in_buf, out_buf, size);\r
+                       this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_BYTE1D_RGB_24();\r
                        break;\r
                case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32:\r
-                       convert32BitRgbx(in_buf, out_buf, size);\r
+                       this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_BYTE1D_B8G8R8X8_32();\r
                        break;\r
+               case INyARBufferReader.BUFFERFORMAT_BYTE1D_X8R8G8B8_32:\r
+                       this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_BYTE1D_X8R8G8B8_32();\r
+                       break;\r
+               case INyARBufferReader.BUFFERFORMAT_INT1D_X8R8G8B8_32:\r
+                       this._do_threshold_impl=new doThFilterImpl_BUFFERFORMAT_INT1D_X8R8G8B8_32();\r
+                       break;\r
+                       \r
                default:\r
                        throw new NyARException();\r
                }\r
-               return;\r
-       }\r
 \r
-       private void convert24BitRgb(byte[] i_in, int[] i_out, NyARIntSize i_size)\r
-       {\r
-               final int th=this._threshold*3;\r
-               int bp =(i_size.w*i_size.h-1)*3;\r
-               int w;\r
-               int xy;\r
-               final int pix_count   =i_size.h*i_size.w;\r
-               final int pix_mod_part=pix_count-(pix_count%8);\r
-               for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 3;\r
-               }\r
-               //タイリング\r
-               for (;xy>=0;) {\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 3;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 3;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 3;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 3;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 3;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 3;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 3;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 3;\r
-                       xy--;\r
-               }\r
-               return;\r
+               \r
        }\r
-       private void convert32BitRgbx(byte[] i_in, int[] i_out, NyARIntSize i_size)\r
+       public void setThreshold(int i_threshold)\r
        {\r
-               final int th=this._threshold*3;\r
-               int bp =(i_size.w*i_size.h-1)*4;\r
-               int w;\r
-               int xy;\r
-               final int pix_count   =i_size.h*i_size.w;\r
-               final int pix_mod_part=pix_count-(pix_count%8);\r
-               for(xy=pix_count-1;xy>=pix_mod_part;xy--){\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 4;\r
-               }\r
-               //タイリング\r
-               for (;xy>=0;) {\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 4;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 4;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 4;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 4;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 4;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 4;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 4;\r
-                       xy--;\r
-                       w= ((i_in[bp] & 0xff) + (i_in[bp + 1] & 0xff) + (i_in[bp + 2] & 0xff));\r
-                       i_out[xy]=w<=th?0:1;\r
-                       bp -= 4;\r
-                       xy--;\r
-               }\r
-               return;\r
+               this._threshold = i_threshold;\r
        }\r
-       \r
-       private boolean checkInputType(int i_input_type) throws NyARException\r
+\r
+       public void doFilter(INyARRgbRaster i_input, NyARBinRaster i_output) throws NyARException\r
        {\r
-               switch(i_input_type){\r
-               case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
-               case INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
-               case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32:\r
-               case INyARBufferReader.BUFFERFORMAT_BYTE1D_R5G6B5_16LE:\r
-                       return true;\r
-               default:\r
-                       return false;\r
-               }\r
+               INyARBufferReader in_buffer_reader=i_input.getBufferReader();   \r
+               INyARBufferReader out_buffer_reader=i_output.getBufferReader();\r
+\r
+               assert (out_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_BIN_8));\r
+               assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
+               this._do_threshold_impl.doThFilter(in_buffer_reader,out_buffer_reader,i_output.getSize(), this._threshold);\r
+               return;\r
        }\r
+\r
 }\r
index 8bb699b..e5cfda8 100644 (file)
@@ -66,6 +66,10 @@ public interface INyARBufferReader
         * byte[]で、R8G8B8X8の32ビットで画素が格納されている。\r
         */\r
        public static final int BUFFERFORMAT_BYTE1D_B8G8R8X8_32 = BYTE1D|0x0101;\r
+       /**\r
+        * byte[]で、X8R8G8B8の32ビットで画素が格納されている。\r
+        */\r
+       public static final int BUFFERFORMAT_BYTE1D_X8R8G8B8_32 = BYTE1D|0x0102;\r
 \r
        /**\r
         * byte[]で、RGB565の16ビット(little/big endian)で画素が格納されている。\r
@@ -86,7 +90,7 @@ public interface INyARBufferReader
        /**\r
         * int[][]で0-255のグレイスケール画像\r
         */\r
-       public static final int BUFFERFORMAT_INT2D_GLAY_8 = INT2D|0x0001;\r
+       public static final int BUFFERFORMAT_INT2D_GRAY_8 = INT2D|0x0001;\r
        /**\r
         * int[][]で0/1の2値画像\r
         */\r
@@ -99,11 +103,13 @@ public interface INyARBufferReader
        /**\r
         * int[]で0-255のグレイスケール画像\r
         */\r
-       public static final int BUFFERFORMAT_INT1D_GLAY_8 = INT1D|0x0001;\r
+       public static final int BUFFERFORMAT_INT1D_GRAY_8 = INT1D|0x0001;\r
        /**\r
         * int[]で0/1の2値画像\r
         */\r
        public static final int BUFFERFORMAT_INT1D_BIN_8  = INT1D|0x0002;\r
+\r
+       \r
        /**\r
         * int[]で、XRGB32の32ビットで画素が格納されている。\r
         */     \r
index 3a520c2..d67161c 100644 (file)
@@ -58,4 +58,23 @@ public interface INyARRgbPixelReader
         * yのインデックス配列\r
         */\r
        public void getPixelSet(int[] i_x, int[] i_y, int i_num, int[] i_intrgb) throws NyARException;\r
+       \r
+       /**\r
+        * 1ピクセルを設定します。\r
+        * @param i_x\r
+        * @param i_y\r
+        * @param i_rgb\r
+        * @throws NyARException\r
+        */\r
+       public void setPixel(int i_x, int i_y, int[] i_rgb) throws NyARException;\r
+       /**\r
+        * 複数のピクセル値をint配列から設定します。\r
+        * @param i_x\r
+        * @param i_y\r
+        * @param i_num\r
+        * @param i_intrgb\r
+        * @throws NyARException\r
+        */\r
+       public void setPixels(int[] i_x, int[] i_y, int i_num, int[] i_intrgb) throws NyARException;\r
+       \r
 }\r
diff --git a/src/jp/nyatla/nyartoolkit/core/rasterreader/NyARRgbPixelReader_BYTE1D_X8R8G8B8_32.java b/src/jp/nyatla/nyartoolkit/core/rasterreader/NyARRgbPixelReader_BYTE1D_X8R8G8B8_32.java
new file mode 100644 (file)
index 0000000..1a4d67e
--- /dev/null
@@ -0,0 +1,85 @@
+/* \r
+ * PROJECT: NyARToolkit\r
+ * --------------------------------------------------------------------------------\r
+ * This work is based on the original ARToolKit developed by\r
+ *   Hirokazu Kato\r
+ *   Mark Billinghurst\r
+ *   HITLab, University of Washington, Seattle\r
+ * http://www.hitl.washington.edu/artoolkit/\r
+ *\r
+ * The NyARToolkit is Java version ARToolkit class library.\r
+ * Copyright (C)2008 R.Iizuka\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this framework; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.core.rasterreader;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+/**\r
+ * byte[]配列に、パディング無しの8bit画素値が、XRGBXRGBの順で並んでいる\r
+ * バッファに使用できるピクセルリーダー\r
+ *\r
+ */\r
+public class NyARRgbPixelReader_BYTE1D_X8R8G8B8_32 implements INyARRgbPixelReader\r
+{\r
+       protected byte[] _ref_buf;\r
+\r
+       private NyARIntSize _size;\r
+\r
+       public NyARRgbPixelReader_BYTE1D_X8R8G8B8_32(byte[] i_buf, NyARIntSize i_size)\r
+       {\r
+               this._ref_buf = i_buf;\r
+               this._size = i_size;\r
+       }\r
+\r
+       public void getPixel(int i_x, int i_y, int[] o_rgb)\r
+       {\r
+               final byte[] ref_buf = this._ref_buf;\r
+               final int bp = (i_x + i_y * this._size.w) * 4;\r
+               o_rgb[0] = (ref_buf[bp + 1] & 0xff);// R\r
+               o_rgb[1] = (ref_buf[bp + 2] & 0xff);// G\r
+               o_rgb[2] = (ref_buf[bp + 3] & 0xff);// B\r
+               return;\r
+       }\r
+\r
+       public void getPixelSet(int[] i_x, int[] i_y, int i_num, int[] o_rgb)\r
+       {\r
+               int bp;\r
+               final int width = this._size.w;\r
+               final byte[] ref_buf = this._ref_buf;\r
+               for (int i = i_num - 1; i >= 0; i--) {\r
+                       bp = (i_x[i] + i_y[i] * width) * 4;\r
+                       o_rgb[i * 3 + 0] = (ref_buf[bp + 1] & 0xff);// R\r
+                       o_rgb[i * 3 + 1] = (ref_buf[bp + 2] & 0xff);// G\r
+                       o_rgb[i * 3 + 2] = (ref_buf[bp + 3] & 0xff);// B\r
+               }\r
+               return;\r
+       }\r
+       public void setPixel(int i_x, int i_y, int[] i_rgb) throws NyARException\r
+       {\r
+               NyARException.notImplement();           \r
+       }\r
+       public void setPixels(int[] i_x, int[] i_y, int i_num, int[] i_intrgb) throws NyARException\r
+       {\r
+               NyARException.notImplement();           \r
+       }\r
+       \r
+}
\ No newline at end of file
  */\r
 package jp.nyatla.nyartoolkit.core.rasterreader;\r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
 \r
-public class NyARRgbPixelReader_INT1D_GLAY_8 implements INyARRgbPixelReader\r
+public class NyARRgbPixelReader_INT1D_GRAY_8 implements INyARRgbPixelReader\r
 {\r
        protected int[] _ref_buf;\r
 \r
        private NyARIntSize _size;\r
 \r
-       public NyARRgbPixelReader_INT1D_GLAY_8(int[] i_buf, NyARIntSize i_size)\r
+       public NyARRgbPixelReader_INT1D_GRAY_8(int[] i_buf, NyARIntSize i_size)\r
        {\r
                this._ref_buf = i_buf;\r
                this._size = i_size;\r
@@ -60,4 +61,13 @@ public class NyARRgbPixelReader_INT1D_GLAY_8 implements INyARRgbPixelReader
                }\r
                return;\r
        }\r
+       public void setPixel(int i_x, int i_y, int[] i_rgb) throws NyARException\r
+       {\r
+               NyARException.notImplement();           \r
+       }\r
+       public void setPixels(int[] i_x, int[] i_y, int i_num, int[] i_intrgb) throws NyARException\r
+       {\r
+               NyARException.notImplement();           \r
+       }\r
+       \r
 }\r
index e3e5ebb..4d9f30b 100644 (file)
@@ -31,6 +31,7 @@
  */\r
 package jp.nyatla.nyartoolkit.core.rasterreader;\r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
 \r
 public class NyARRgbPixelReader_INT1D_X8R8G8B8_32 implements INyARRgbPixelReader\r
@@ -66,4 +67,13 @@ public class NyARRgbPixelReader_INT1D_X8R8G8B8_32 implements INyARRgbPixelReader
                }\r
                return;\r
        }\r
+       public void setPixel(int i_x, int i_y, int[] i_rgb) throws NyARException\r
+       {\r
+               this._ref_buf[i_x + i_y * this._size.w]=((i_rgb[0]<<16)&0xff)|((i_rgb[1]<<8)&0xff)|((i_rgb[2])&0xff);\r
+       }\r
+       public void setPixels(int[] i_x, int[] i_y, int i_num, int[] i_intrgb) throws NyARException\r
+       {\r
+               NyARException.notImplement();           \r
+       }\r
+       \r
 }\r
index b27b55f..3f3f6b3 100644 (file)
@@ -31,6 +31,7 @@
  */\r
 package jp.nyatla.nyartoolkit.core.rasterreader;\r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.types.*;\r
 /**\r
  * byte[]配列に、パディング無しの8bit画素値が、RGBRGBの順で並んでいる\r
@@ -71,5 +72,14 @@ public class NyARRgbPixelReader_RGB24 implements INyARRgbPixelReader
                        o_rgb[i * 3 + 2] = (ref_buf[bp + 2] & 0xff);// B\r
                }\r
                return;\r
-       }       \r
+       }\r
+       public void setPixel(int i_x, int i_y, int[] i_rgb) throws NyARException\r
+       {\r
+               NyARException.notImplement();           \r
+       }\r
+       public void setPixels(int[] i_x, int[] i_y, int i_num, int[] i_intrgb) throws NyARException\r
+       {\r
+               NyARException.notImplement();           \r
+       }\r
+       \r
 }
\ No newline at end of file
diff --git a/src/jp/nyatla/nyartoolkit/core/squaredetect/ContourPickup.java b/src/jp/nyatla/nyartoolkit/core/squaredetect/ContourPickup.java
new file mode 100644 (file)
index 0000000..e25a7e3
--- /dev/null
@@ -0,0 +1,227 @@
+package jp.nyatla.nyartoolkit.core.squaredetect;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.nyartoolkit.core.labeling.artoolkit.*;\r
+\r
+public class ContourPickup\r
+{\r
+       //巡回参照できるように、テーブルを二重化\r
+       //                                           0  1  2  3  4  5  6  7   0  1  2  3  4  5  6\r
+       protected final static int[] _getContour_xdir = { 0, 1, 1, 1, 0,-1,-1,-1 , 0, 1, 1, 1, 0,-1,-1};\r
+       protected final static int[] _getContour_ydir = {-1,-1, 0, 1, 1, 1, 0,-1 ,-1,-1, 0, 1, 1, 1, 0};\r
+\r
+       /**\r
+        * ラスタのエントリポイントから辿れる輪郭線を配列に返します。\r
+        * @param i_raster\r
+        * @param i_entry_x\r
+        * @param i_entry_y\r
+        * @param i_array_size\r
+        * @param o_coord_x\r
+        * @param o_coord_y\r
+        * @return\r
+        * 輪郭線の長さを返します。\r
+        * @throws NyARException\r
+        */\r
+       public int getContour(NyARBinRaster i_raster,int i_entry_x,int i_entry_y,int i_array_size,int[] o_coord_x,int[] o_coord_y) throws NyARException\r
+       {\r
+               final int[] xdir = _getContour_xdir;// static int xdir[8] = { 0, 1, 1, 1, 0,-1,-1,-1};\r
+               final int[] ydir = _getContour_ydir;// static int ydir[8] = {-1,-1, 0, 1, 1, 1, 0,-1};\r
+\r
+               final int[] i_buf=(int[])i_raster.getBufferReader().getBuffer();\r
+               final int width=i_raster.getWidth();\r
+               final int height=i_raster.getHeight();\r
+               //クリップ領域の上端に接しているポイントを得る。\r
+               int sx=i_entry_x;\r
+               int sy=i_entry_y;\r
+\r
+               int coord_num = 1;\r
+               o_coord_x[0] = sx;\r
+               o_coord_y[0] = sy;\r
+               int dir = 5;\r
+\r
+               int c = o_coord_x[0];\r
+               int r = o_coord_y[0];\r
+               for (;;) {\r
+                       dir = (dir + 5) % 8;//dirの正規化\r
+                       //ここは頑張ればもっと最適化できると思うよ。\r
+                       //4隅以外の境界接地の場合に、境界チェックを省略するとかね。\r
+                       if(c>=1 && c<width-1 && r>=1 && r<height-1){\r
+                               for(;;){//gotoのエミュレート用のfor文\r
+                                       //境界に接していないとき\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] == 0) {\r
+                                               break;\r
+                                       }\r
+                                       //8方向全て調べたけどラベルが無いよ?\r
+                                       throw new NyARException();                      \r
+                               }\r
+                       }else{\r
+                               //境界に接しているとき\r
+                               int i;\r
+                               for (i = 0; i < 8; i++){                                \r
+                                       final int x=c + xdir[dir];\r
+                                       final int y=r + ydir[dir];\r
+                                       //境界チェック\r
+                                       if(x>=0 && x<width && y>=0 && y<height){\r
+                                               if (i_buf[(y)*width+(x)] == 0) {\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                                       dir++;//倍長テーブルを参照するので問題なし\r
+                               }\r
+                               if (i == 8) {\r
+                                       //8方向全て調べたけどラベルが無いよ?\r
+                                       throw new NyARException();// return(-1);\r
+                               }                               \r
+                       }\r
+                       \r
+                       dir=dir% 8;//dirの正規化\r
+\r
+                       // xcoordとycoordをc,rにも保存\r
+                       c = c + xdir[dir];\r
+                       r = r + ydir[dir];\r
+                       o_coord_x[coord_num] = c;\r
+                       o_coord_y[coord_num] = r;\r
+                       // 終了条件判定\r
+                       if (c == sx && r == sy){\r
+                               coord_num++;\r
+                               break;\r
+                       }\r
+                       coord_num++;\r
+                       if (coord_num == i_array_size) {\r
+                               //輪郭が末端に達した\r
+                               return coord_num;\r
+                       }\r
+               }\r
+               return coord_num;\r
+       }\r
+       public int getContour(NyARLabelingImage i_raster,int i_entry_x,int i_entry_y,int i_array_size,int[] o_coord_x,int[] o_coord_y) throws NyARException\r
+       {       \r
+               final int[] xdir = _getContour_xdir;// static int xdir[8] = { 0, 1, 1, 1, 0,-1,-1,-1};\r
+               final int[] ydir = _getContour_ydir;// static int ydir[8] = {-1,-1, 0, 1, 1, 1, 0,-1};\r
+\r
+               final int[] i_buf=(int[])i_raster.getBufferReader().getBuffer();\r
+               final int width=i_raster.getWidth();\r
+               final int height=i_raster.getHeight();\r
+               //クリップ領域の上端に接しているポイントを得る。\r
+               int sx=i_entry_x;\r
+               int sy=i_entry_y;\r
+\r
+               int coord_num = 1;\r
+               o_coord_x[0] = sx;\r
+               o_coord_y[0] = sy;\r
+               int dir = 5;\r
+\r
+               int c = o_coord_x[0];\r
+               int r = o_coord_y[0];\r
+               for (;;) {\r
+                       dir = (dir + 5) % 8;//dirの正規化\r
+                       //ここは頑張ればもっと最適化できると思うよ。\r
+                       //4隅以外の境界接地の場合に、境界チェックを省略するとかね。\r
+                       if(c>=1 && c<width-1 && r>=1 && r<height-1){\r
+                               for(;;){//gotoのエミュレート用のfor文\r
+                                       //境界に接していないとき\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {\r
+                                               break;\r
+                                       }\r
+                                       dir++;\r
+                                       if (i_buf[(r + ydir[dir])*width+(c + xdir[dir])] > 0) {\r
+                                               break;\r
+                                       }\r
+                                       //8方向全て調べたけどラベルが無いよ?\r
+                                       throw new NyARException();                      \r
+                               }\r
+                       }else{\r
+                               //境界に接しているとき\r
+                               int i;\r
+                               for (i = 0; i < 8; i++){                                \r
+                                       final int x=c + xdir[dir];\r
+                                       final int y=r + ydir[dir];\r
+                                       //境界チェック\r
+                                       if(x>=0 && x<width && y>=0 && y<height){\r
+                                               if (i_buf[(y)*width+(x)] > 0) {\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                                       dir++;//倍長テーブルを参照するので問題なし\r
+                               }\r
+                               if (i == 8) {\r
+                                       //8方向全て調べたけどラベルが無いよ?\r
+                                       throw new NyARException();// return(-1);\r
+                               }                               \r
+                       }\r
+                       \r
+                       dir=dir% 8;//dirの正規化\r
+\r
+                       // xcoordとycoordをc,rにも保存\r
+                       c = c + xdir[dir];\r
+                       r = r + ydir[dir];\r
+                       o_coord_x[coord_num] = c;\r
+                       o_coord_y[coord_num] = r;\r
+                       // 終了条件判定\r
+                       if (c == sx && r == sy){\r
+                               coord_num++;\r
+                               break;\r
+                       }\r
+                       coord_num++;\r
+                       if (coord_num == i_array_size) {\r
+                               //輪郭が末端に達した\r
+                               return coord_num;\r
+                       }\r
+               }\r
+               return coord_num;\r
+       }       \r
+\r
+}\r
diff --git a/src/jp/nyatla/nyartoolkit/core/squaredetect/LabelOverlapChecker.java b/src/jp/nyatla/nyartoolkit/core/squaredetect/LabelOverlapChecker.java
new file mode 100644 (file)
index 0000000..6cd1dcd
--- /dev/null
@@ -0,0 +1,98 @@
+/* \r
+ * PROJECT: NyARToolkit\r
+ * --------------------------------------------------------------------------------\r
+ * This work is based on the original ARToolKit developed by\r
+ *   Hirokazu Kato\r
+ *   Mark Billinghurst\r
+ *   HITLab, University of Washington, Seattle\r
+ * http://www.hitl.washington.edu/artoolkit/\r
+ *\r
+ * The NyARToolkit is Java version ARToolkit class library.\r
+ * Copyright (C)2008 R.Iizuka\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this framework; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.core.squaredetect;\r
+\r
+import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabelingLabel;\r
+\r
+/**\r
+ * ラベル同士の重なり(内包関係)を調べるクラスです。 \r
+ * ラベルリストに内包するラベルを蓄積し、それにターゲットのラベルが内包されているか を確認します。\r
+ */\r
+public class LabelOverlapChecker\r
+{\r
+       private NyARLabelingLabel[] _labels = new NyARLabelingLabel[32];\r
+       private int _length;\r
+       public LabelOverlapChecker(int i_max_label)\r
+       {\r
+               this._labels = new NyARLabelingLabel[i_max_label];\r
+       }\r
+\r
+       /**\r
+        * チェック対象のラベルを追加する。\r
+        * \r
+        * @param i_label_ref\r
+        */\r
+       public void push(NyARLabelingLabel i_label_ref)\r
+       {\r
+               this._labels[this._length] = i_label_ref;\r
+               this._length++;\r
+       }\r
+\r
+       /**\r
+        * 現在リストにあるラベルと重なっているかを返す。\r
+        * \r
+        * @param i_label\r
+        * @return 何れかのラベルの内側にあるならばfalse,独立したラベルである可能性が高ければtrueです.\r
+        */\r
+       public boolean check(NyARLabelingLabel i_label)\r
+       {\r
+               // 重なり処理かな?\r
+               final NyARLabelingLabel[] label_pt = this._labels;\r
+               final int px1 = (int) i_label.pos_x;\r
+               final int py1 = (int) i_label.pos_y;\r
+               for (int i = this._length - 1; i >= 0; i--) {\r
+                       final int px2 = (int) label_pt[i].pos_x;\r
+                       final int py2 = (int) label_pt[i].pos_y;\r
+                       final int d = (px1 - px2) * (px1 - px2) + (py1 - py2) * (py1 - py2);\r
+                       if (d < label_pt[i].area / 4) {\r
+                               // 対象外\r
+                               return false;\r
+                       }\r
+               }\r
+               // 対象\r
+               return true;\r
+       }\r
+       /**\r
+        * 最大i_max_label個のラベルを蓄積できるようにオブジェクトをリセットする\r
+        * \r
+        * @param i_max_label\r
+        */\r
+       public void setMaxlabel(int i_max_label)\r
+       {\r
+               if (i_max_label > this._labels.length) {\r
+                       this._labels = new NyARLabelingLabel[i_max_label];\r
+               }\r
+               this._length = 0;\r
+       }       \r
+       \r
+       \r
+}\r
diff --git a/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_ARToolKit.java b/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_ARToolKit.java
new file mode 100644 (file)
index 0000000..44e5dbd
--- /dev/null
@@ -0,0 +1,160 @@
+package jp.nyatla.nyartoolkit.core.squaredetect;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.INyARSquareDetector;\r
+import jp.nyatla.nyartoolkit.core.NyARSquare;\r
+import jp.nyatla.nyartoolkit.core.NyARSquareStack;\r
+import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabelingImage;\r
+import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabelingLabel;\r
+import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabelingLabelStack;\r
+import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabeling_ARToolKit;\r
+import jp.nyatla.nyartoolkit.core.param.NyARCameraDistortionFactor;\r
+import jp.nyatla.nyartoolkit.core.raster.NyARBinRaster;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
+\r
+\r
+\r
+public class NyARSquareDetector_ARToolKit implements INyARSquareDetector\r
+{\r
+       private static final int AR_AREA_MAX = 100000;// #define AR_AREA_MAX 100000\r
+       private static final int AR_AREA_MIN = 70;// #define AR_AREA_MIN 70\r
+       private final int _width;\r
+       private final int _height;\r
+\r
+       private final NyARLabeling_ARToolKit _labeling;\r
+\r
+       private final NyARLabelingImage _limage;\r
+\r
+       private final LabelOverlapChecker _overlap_checker = new LabelOverlapChecker(32);\r
+       private final SquareContourDetector _sqconvertor;\r
+       private final ContourPickup _cpickup=new ContourPickup();\r
+       \r
+       private final int _max_coord;\r
+       private final int[] _xcoord;\r
+       private final int[] _ycoord;    \r
+       /**\r
+        * 最大i_squre_max個のマーカーを検出するクラスを作成する。\r
+        * \r
+        * @param i_param\r
+        */\r
+       public NyARSquareDetector_ARToolKit(NyARCameraDistortionFactor i_dist_factor_ref,NyARIntSize i_size) throws NyARException\r
+       {\r
+               this._width = i_size.w;\r
+               this._height = i_size.h;\r
+               //歪み計算テーブルを作ると、8*width/height*2の領域を消費します。\r
+               //領域を取りたくない場合は、i_dist_factor_refの値をそのまま使ってください。\r
+               this._labeling = new NyARLabeling_ARToolKit();\r
+               this._sqconvertor=new SquareContourDetector(i_size,i_dist_factor_ref);\r
+               this._limage = new NyARLabelingImage(this._width, this._height);\r
+\r
+               // 輪郭の最大長は画面に映りうる最大の長方形サイズ。\r
+               int number_of_coord = (this._width + this._height) * 2;\r
+\r
+               // 輪郭バッファは頂点変換をするので、輪郭バッファの2倍取る。\r
+               this._max_coord = number_of_coord;\r
+               this._xcoord = new int[number_of_coord * 2];\r
+               this._ycoord = new int[number_of_coord * 2];\r
+               return;\r
+       }\r
+\r
+       /**\r
+        * arDetectMarker2を基にした関数\r
+        * この関数はNyARSquare要素のうち、directionを除くパラメータを取得して返します。\r
+        * directionの確定は行いません。\r
+        * @param i_raster\r
+        * 解析する2値ラスタイメージを指定します。\r
+        * @param o_square_stack\r
+        * 抽出した正方形候補を格納するリスト\r
+        * @throws NyARException\r
+        */\r
+       public final void detectMarker(NyARBinRaster i_raster, NyARSquareStack o_square_stack) throws NyARException\r
+       {\r
+               final NyARLabelingImage limage = this._limage;\r
+\r
+               // 初期化\r
+\r
+               // マーカーホルダをリセット\r
+               o_square_stack.clear();\r
+\r
+               // ラベリング\r
+               this._labeling.labeling(i_raster,this._limage);\r
+\r
+               // ラベル数が0ならここまで\r
+               final int label_num = limage.getLabelStack().getLength();\r
+               if (label_num < 1) {\r
+                       return;\r
+               }\r
+\r
+               final NyARLabelingLabelStack stack = limage.getLabelStack();\r
+               final NyARLabelingLabel[] labels = stack.getArray();\r
+               \r
+               \r
+               // ラベルを大きい順に整列\r
+               stack.sortByArea();\r
+\r
+               // デカいラベルを読み飛ばし\r
+               int i;\r
+               for (i = 0; i < label_num; i++) {\r
+                       // 検査対象内のラベルサイズになるまで無視\r
+                       if (labels[i].area <= AR_AREA_MAX) {\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               final int xsize = this._width;\r
+               final int ysize = this._height;\r
+               final int[] xcoord = this._xcoord;\r
+               final int[] ycoord = this._ycoord;\r
+               final int coord_max = this._max_coord;\r
+               final LabelOverlapChecker overlap = this._overlap_checker;\r
+               int coord_num;\r
+               int label_area;\r
+               NyARLabelingLabel label_pt;\r
+\r
+               //重なりチェッカの最大数を設定\r
+               overlap.setMaxlabel(label_num);\r
+\r
+               for (; i < label_num; i++) {\r
+                       label_pt = labels[i];\r
+                       label_area = label_pt.area;\r
+                       // 検査対象サイズよりも小さくなったら終了\r
+                       if (label_area < AR_AREA_MIN) {\r
+                               break;\r
+                       }\r
+                       // クリップ領域が画面の枠に接していれば除外\r
+                       if (label_pt.clip_l == 1 || label_pt.clip_r == xsize - 2) {// if(wclip[i*4+0] == 1 || wclip[i*4+1] ==xsize-2){\r
+                               continue;\r
+                       }\r
+                       if (label_pt.clip_t == 1 || label_pt.clip_b == ysize - 2) {// if( wclip[i*4+2] == 1 || wclip[i*4+3] ==ysize-2){\r
+                               continue;\r
+                       }\r
+                       // 既に検出された矩形との重なりを確認\r
+                       if (!overlap.check(label_pt)) {\r
+                               // 重なっているようだ。\r
+                               continue;\r
+                       }\r
+                       // 輪郭を取得\r
+                       coord_num = _cpickup.getContour(limage,limage.getTopClipTangentX(label_pt),label_pt.clip_t, coord_max, xcoord, ycoord);\r
+                       if (coord_num == coord_max) {\r
+                               // 輪郭が大きすぎる。\r
+                               continue;\r
+                       }\r
+                       //輪郭分析用に正規化する。\r
+                       final int vertex1 = SquareContourDetector.normalizeCoord(xcoord, ycoord, coord_num);\r
+\r
+                       //ここから先が輪郭分析\r
+                       NyARSquare square_ptr = o_square_stack.prePush();\r
+                       if(!this._sqconvertor.coordToSquare(xcoord,ycoord,vertex1,coord_num,label_area,square_ptr)){\r
+                               o_square_stack.pop();// 頂点の取得が出来なかったので破棄\r
+                               continue;                               \r
+                       }\r
+                       // 検出済の矩形の属したラベルを重なりチェックに追加する。\r
+                       overlap.push(label_pt);\r
+               }       \r
+               return;\r
+       }\r
+\r
+}\r
+\r
+\r
+\r
diff --git a/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_Rle.java b/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareDetector_Rle.java
new file mode 100644 (file)
index 0000000..fc3212d
--- /dev/null
@@ -0,0 +1,150 @@
+package jp.nyatla.nyartoolkit.core.squaredetect;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.INyARSquareDetector;\r
+import jp.nyatla.nyartoolkit.core.NyARSquare;\r
+import jp.nyatla.nyartoolkit.core.NyARSquareStack;\r
+import jp.nyatla.nyartoolkit.core.labeling.rlelabeling.*;\r
+import jp.nyatla.nyartoolkit.core.param.NyARCameraDistortionFactor;\r
+import jp.nyatla.nyartoolkit.core.raster.NyARBinRaster;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
+\r
+\r
+\r
+public class NyARSquareDetector_Rle implements INyARSquareDetector\r
+{\r
+       private static final int AR_AREA_MAX = 100000;// #define AR_AREA_MAX 100000\r
+       private static final int AR_AREA_MIN = 70;// #define AR_AREA_MIN 70\r
+       private final int _width;\r
+       private final int _height;\r
+\r
+       private final NyARLabeling_Rle _labeling;\r
+\r
+       private final LabelOverlapChecker _overlap_checker = new LabelOverlapChecker(32);\r
+       private final SquareContourDetector _sqconvertor;\r
+       private final ContourPickup _cpickup=new ContourPickup();\r
+       private final RleLabelFragmentInfoStack _stack;\r
+       \r
+       private final int _max_coord;\r
+       private final int[] _xcoord;\r
+       private final int[] _ycoord;    \r
+       /**\r
+        * 最大i_squre_max個のマーカーを検出するクラスを作成する。\r
+        * \r
+        * @param i_param\r
+        */\r
+       public NyARSquareDetector_Rle(NyARCameraDistortionFactor i_dist_factor_ref,NyARIntSize i_size) throws NyARException\r
+       {\r
+               this._width = i_size.w;\r
+               this._height = i_size.h;\r
+               //歪み計算テーブルを作ると、8*width/height*2の領域を消費します。\r
+               //領域を取りたくない場合は、i_dist_factor_refの値をそのまま使ってください。\r
+               this._labeling = new NyARLabeling_Rle(this._width);\r
+               this._sqconvertor=new SquareContourDetector(i_size,i_dist_factor_ref);\r
+               this._stack=new RleLabelFragmentInfoStack(1024);//検出可能な最大ラベル数\r
+               \r
+\r
+               // 輪郭の最大長は画面に映りうる最大の長方形サイズ。\r
+               int number_of_coord = (this._width + this._height) * 2;\r
+\r
+               // 輪郭バッファは頂点変換をするので、輪郭バッファの2倍取る。\r
+               this._max_coord = number_of_coord;\r
+               this._xcoord = new int[number_of_coord * 2];\r
+               this._ycoord = new int[number_of_coord * 2];\r
+               return;\r
+       }\r
+\r
+       /**\r
+        * arDetectMarker2を基にした関数\r
+        * この関数はNyARSquare要素のうち、directionを除くパラメータを取得して返します。\r
+        * directionの確定は行いません。\r
+        * @param i_raster\r
+        * 解析する2値ラスタイメージを指定します。\r
+        * @param o_square_stack\r
+        * 抽出した正方形候補を格納するリスト\r
+        * @throws NyARException\r
+        */\r
+       public final void detectMarker(NyARBinRaster i_raster, NyARSquareStack o_square_stack) throws NyARException\r
+       {\r
+               final RleLabelFragmentInfoStack flagment=this._stack;\r
+               // 初期化\r
+\r
+               // マーカーホルダをリセット\r
+               o_square_stack.clear();\r
+\r
+               // ラベリング\r
+               this._labeling.labeling(i_raster, 0, i_raster.getHeight(), flagment);\r
+\r
+               // ラベル数が0ならここまで\r
+               final int label_num = flagment.getLength();\r
+               if (label_num < 1) {\r
+                       return;\r
+               }\r
+               \r
+               \r
+               // ラベルを大きい順に整列\r
+               flagment.sortByArea();\r
+               RleLabelFragmentInfoStack.RleLabelFragmentInfo[] labels=flagment.getArray();\r
+\r
+               // デカいラベルを読み飛ばし\r
+               int i;\r
+               for (i = 0; i < label_num; i++) {\r
+                       // 検査対象内のラベルサイズになるまで無視\r
+                       if (labels[i].area <= AR_AREA_MAX) {\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               final int[] xcoord = this._xcoord;\r
+               final int[] ycoord = this._ycoord;\r
+               final int coord_max = this._max_coord;\r
+               int coord_num;\r
+               int label_area;\r
+\r
+               //重なりチェッカの最大数を設定\r
+//             overlap.setMaxlabel(label_num);\r
+\r
+               for (; i < label_num; i++) {\r
+                       final RleLabelFragmentInfoStack.RleLabelFragmentInfo label_pt=labels[i];\r
+                       label_area = label_pt.area;\r
+                       // 検査対象サイズよりも小さくなったら終了\r
+                       if (label_area < AR_AREA_MIN) {\r
+                               break;\r
+                       }\r
+//                     // クリップ領域が画面の枠に接していれば除外\r
+//                     if (label_pt.clip_l == 1 || label_pt.clip_r == xsize - 2) {// if(wclip[i*4+0] == 1 || wclip[i*4+1] ==xsize-2){\r
+//                             continue;\r
+//                     }\r
+//                     if (label_pt.clip_t == 1 || label_pt.clip_b == ysize - 2) {// if( wclip[i*4+2] == 1 || wclip[i*4+3] ==ysize-2){\r
+//                             continue;\r
+//                     }\r
+//                     // 既に検出された矩形との重なりを確認\r
+//                     if (!overlap.check(label_pt)) {\r
+//                             // 重なっているようだ。\r
+//                             continue;\r
+//                     }\r
+                       // 輪郭を取得\r
+                       coord_num = _cpickup.getContour(i_raster,label_pt.entry_x,label_pt.entry_y, coord_max, xcoord, ycoord);\r
+                       if (coord_num == coord_max) {\r
+                               // 輪郭が大きすぎる。\r
+                               continue;\r
+                       }\r
+                       //輪郭分析用に正規化する。\r
+                       final int vertex1 = SquareContourDetector.normalizeCoord(xcoord, ycoord, coord_num);\r
+\r
+                       //ここから先が輪郭分析\r
+                       NyARSquare square_ptr = o_square_stack.prePush();\r
+                       if(!this._sqconvertor.coordToSquare(xcoord,ycoord,vertex1,coord_num,label_area,square_ptr)){\r
+                               o_square_stack.pop();// 頂点の取得が出来なかったので破棄\r
+                               continue;                               \r
+                       }\r
+                       // 検出済の矩形の属したラベルを重なりチェックに追加する。\r
+//                     overlap.push(label_pt);\r
+               }       \r
+               return;\r
+       }\r
+\r
+}\r
+\r
+\r
+\r
diff --git a/src/jp/nyatla/nyartoolkit/core/squaredetect/SquareContourDetector.java b/src/jp/nyatla/nyartoolkit/core/squaredetect/SquareContourDetector.java
new file mode 100644 (file)
index 0000000..8e93f85
--- /dev/null
@@ -0,0 +1,214 @@
+package jp.nyatla.nyartoolkit.core.squaredetect;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.NyARSquare;\r
+import jp.nyatla.nyartoolkit.core.NyARVertexCounter;\r
+import jp.nyatla.nyartoolkit.core.param.NyARCameraDistortionFactor;\r
+import jp.nyatla.nyartoolkit.core.param.NyARObserv2IdealMap;\r
+import jp.nyatla.nyartoolkit.core.pca2d.INyARPca2d;\r
+import jp.nyatla.nyartoolkit.core.pca2d.NyARPca2d_MatrixPCA_O2;\r
+import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint2d;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntPoint2d;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
+import jp.nyatla.nyartoolkit.core.types.NyARLinear;\r
+import jp.nyatla.nyartoolkit.core.types.matrix.NyARDoubleMatrix22;\r
+\r
+public class SquareContourDetector\r
+{\r
+       private static final double VERTEX_FACTOR = 1.0;// 線検出のファクタ     \r
+       private final double[] _xpos;\r
+       private final double[] _ypos;   \r
+       private final int[] __detectMarker_mkvertex = new int[5];\r
+       private final NyARVertexCounter __getSquareVertex_wv1 = new NyARVertexCounter();\r
+       private final NyARVertexCounter __getSquareVertex_wv2 = new NyARVertexCounter();\r
+       private final INyARPca2d _pca;\r
+       private final NyARDoubleMatrix22 __getSquareLine_evec=new NyARDoubleMatrix22();\r
+       private final NyARDoublePoint2d __getSquareLine_mean=new NyARDoublePoint2d();\r
+       private final NyARDoublePoint2d __getSquareLine_ev=new NyARDoublePoint2d();     \r
+       private final NyARObserv2IdealMap _dist_factor;\r
+       public SquareContourDetector(NyARIntSize i_size,NyARCameraDistortionFactor i_distfactor_ref)\r
+       {\r
+               //歪み計算テーブルを作ると、8*width/height*2の領域を消費します。\r
+               //領域を取りたくない場合は、i_dist_factor_refの値をそのまま使ってください。\r
+               this._dist_factor = new NyARObserv2IdealMap(i_distfactor_ref,i_size);\r
+\r
+\r
+               // 輪郭バッファは頂点変換をするので、輪郭バッファの2倍取る。\r
+               this._pca=new NyARPca2d_MatrixPCA_O2();\r
+               this._xpos=new double[i_size.w+i_size.h];//最大辺長はthis._width+this._height\r
+               this._ypos=new double[i_size.w+i_size.h];//最大辺長はthis._width+this._height\r
+               return;\r
+       }\r
+\r
+       public boolean coordToSquare(int[] i_xcoord,int[] i_ycoord,int i_st_index,int i_coord_num,int i_label_area,NyARSquare o_square) throws NyARException\r
+       {\r
+\r
+               final int[] mkvertex = this.__detectMarker_mkvertex;\r
+\r
+               // 頂点情報を取得\r
+               if (!getSquareVertex(i_xcoord, i_ycoord, i_st_index, i_coord_num, i_label_area, mkvertex)) {\r
+                       // 頂点の取得が出来なかったので破棄\r
+                       return false;\r
+               }\r
+               // マーカーを検出\r
+               if (!getSquareLine(mkvertex, i_xcoord, i_ycoord, o_square)){\r
+                       // 矩形が成立しなかった。\r
+                       return false;\r
+               }\r
+               return true;\r
+       }\r
+       \r
+       private boolean getSquareLine(int[] i_mkvertex, int[] i_xcoord, int[] i_ycoord, NyARSquare o_square) throws NyARException\r
+       {\r
+               final NyARLinear[] l_line = o_square.line;\r
+               final NyARDoubleMatrix22 evec=this.__getSquareLine_evec;\r
+               final NyARDoublePoint2d mean=this.__getSquareLine_mean;\r
+               final NyARDoublePoint2d ev=this.__getSquareLine_ev;\r
+       \r
+               \r
+               for (int i = 0; i < 4; i++) {\r
+                       final double w1 = (double) (i_mkvertex[i + 1] - i_mkvertex[i] + 1) * 0.05 + 0.5;\r
+                       final int st = (int) (i_mkvertex[i] + w1);\r
+                       final int ed = (int) (i_mkvertex[i + 1] - w1);\r
+                       final int n = ed - st + 1;\r
+                       if (n < 2) {\r
+                               // nが2以下でmatrix.PCAを計算することはできないので、エラー\r
+                               return false;\r
+                       }\r
+                       //配列作成\r
+                       this._dist_factor.observ2IdealBatch(i_xcoord, i_ycoord, st, n,this._xpos,this._ypos);\r
+                       \r
+                       //主成分分析する。\r
+                       this._pca.pca(this._xpos,this._ypos,n,evec, ev,mean);\r
+                       final NyARLinear l_line_i = l_line[i];\r
+                       l_line_i.run = evec.m01;// line[i][0] = evec->m[1];\r
+                       l_line_i.rise = -evec.m00;// line[i][1] = -evec->m[0];\r
+                       l_line_i.intercept = -(l_line_i.run * mean.x + l_line_i.rise * mean.y);// line[i][2] = -(line[i][0]*mean->v[0] + line[i][1]*mean->v[1]);\r
+               }\r
+\r
+               final NyARDoublePoint2d[] l_sqvertex = o_square.sqvertex;\r
+               final NyARIntPoint2d[] l_imvertex = o_square.imvertex;\r
+               for (int i = 0; i < 4; i++) {\r
+                       final NyARLinear l_line_i = l_line[i];\r
+                       final NyARLinear l_line_2 = l_line[(i + 3) % 4];\r
+                       final double w1 = l_line_2.run * l_line_i.rise - l_line_i.run * l_line_2.rise;\r
+                       if (w1 == 0.0) {\r
+                               return false;\r
+                       }\r
+                       l_sqvertex[i].x = (l_line_2.rise * l_line_i.intercept - l_line_i.rise * l_line_2.intercept) / w1;\r
+                       l_sqvertex[i].y = (l_line_i.run * l_line_2.intercept - l_line_2.run * l_line_i.intercept) / w1;\r
+                       // 頂点インデクスから頂点座標を得て保存\r
+                       l_imvertex[i].x = i_xcoord[i_mkvertex[i]];\r
+                       l_imvertex[i].y = i_ycoord[i_mkvertex[i]];\r
+               }\r
+               return true;\r
+       }       \r
+       private boolean getSquareVertex(int[] i_x_coord, int[] i_y_coord, int i_vertex1_index, int i_coord_num, int i_area, int[] o_vertex)\r
+       {\r
+               final NyARVertexCounter wv1 = this.__getSquareVertex_wv1;\r
+               final NyARVertexCounter wv2 = this.__getSquareVertex_wv2;\r
+               final int end_of_coord = i_vertex1_index + i_coord_num - 1;\r
+               final int sx = i_x_coord[i_vertex1_index];// sx = marker_info2->x_coord[0];\r
+               final int sy = i_y_coord[i_vertex1_index];// sy = marker_info2->y_coord[0];\r
+               int dmax = 0;\r
+               int v1 = i_vertex1_index;\r
+               for (int i = 1 + i_vertex1_index; i < end_of_coord; i++) {// for(i=1;i<marker_info2->coord_num-1;i++)\r
+                       // {\r
+                       final int d = (i_x_coord[i] - sx) * (i_x_coord[i] - sx) + (i_y_coord[i] - sy) * (i_y_coord[i] - sy);\r
+                       if (d > dmax) {\r
+                               dmax = d;\r
+                               v1 = i;\r
+                       }\r
+               }\r
+               final double thresh = (i_area / 0.75) * 0.01 * VERTEX_FACTOR;\r
+\r
+               o_vertex[0] = i_vertex1_index;\r
+\r
+               if (!wv1.getVertex(i_x_coord, i_y_coord, i_vertex1_index, v1, thresh)) { // if(get_vertex(marker_info2->x_coord,marker_info2->y_coord,0,v1,thresh,wv1,&wvnum1)<\r
+                                                                                                                                                                       // 0 ) {\r
+                       return false;\r
+               }\r
+               if (!wv2.getVertex(i_x_coord, i_y_coord, v1, end_of_coord, thresh)) {// if(get_vertex(marker_info2->x_coord,marker_info2->y_coord,v1,marker_info2->coord_num-1,thresh,wv2,&wvnum2)\r
+                       // < 0) {\r
+                       return false;\r
+               }\r
+\r
+               int v2;\r
+               if (wv1.number_of_vertex == 1 && wv2.number_of_vertex == 1) {// if(wvnum1 == 1 && wvnum2== 1) {\r
+                       o_vertex[1] = wv1.vertex[0];\r
+                       o_vertex[2] = v1;\r
+                       o_vertex[3] = wv2.vertex[0];\r
+               } else if (wv1.number_of_vertex > 1 && wv2.number_of_vertex == 0) {// }else if( wvnum1 > 1 && wvnum2== 0) {\r
+                       //頂点位置を、起点から対角点の間の1/2にあると予想して、検索する。\r
+                       v2 = (v1-i_vertex1_index)/2+i_vertex1_index;\r
+                       if (!wv1.getVertex(i_x_coord, i_y_coord, i_vertex1_index, v2, thresh)) {\r
+                               return false;\r
+                       }\r
+                       if (!wv2.getVertex(i_x_coord, i_y_coord, v2, v1, thresh)) {\r
+                               return false;\r
+                       }\r
+                       if (wv1.number_of_vertex == 1 && wv2.number_of_vertex == 1) {\r
+                               o_vertex[1] = wv1.vertex[0];\r
+                               o_vertex[2] = wv2.vertex[0];\r
+                               o_vertex[3] = v1;\r
+                       } else {\r
+                               return false;\r
+                       }\r
+               } else if (wv1.number_of_vertex == 0 && wv2.number_of_vertex > 1) {\r
+                       //v2 = (v1-i_vertex1_index+ end_of_coord-i_vertex1_index) / 2+i_vertex1_index;\r
+                       v2 = (v1+ end_of_coord)/2;\r
+\r
+                       if (!wv1.getVertex(i_x_coord, i_y_coord, v1, v2, thresh)) {\r
+                               return false;\r
+                       }\r
+                       if (!wv2.getVertex(i_x_coord, i_y_coord, v2, end_of_coord, thresh)) {\r
+                               return false;\r
+                       }\r
+                       if (wv1.number_of_vertex == 1 && wv2.number_of_vertex == 1) {\r
+                               o_vertex[1] = v1;\r
+                               o_vertex[2] = wv1.vertex[0];\r
+                               o_vertex[3] = wv2.vertex[0];\r
+                       } else {\r
+                               return false;\r
+                       }\r
+               } else {\r
+                       return false;\r
+               }\r
+               o_vertex[4] = end_of_coord;\r
+               return true;\r
+       }\r
+       \r
+       /**\r
+        * 輪郭線の矩形検出開始ポイントを特定して、座標を並べ替えます。\r
+        * 輪郭線の先頭から、対角線が最長になる点を1点検索し、それより前の区間をバッファの後方に接続します。\r
+        * 戻り値は対角線が最長になった点です。関数終了後、返却値+i_coord_numの要素が有効になります。\r
+        * @param i_xcoord\r
+        * @param i_ycoord\r
+        * @param i_coord_num\r
+        * @return\r
+        */\r
+       public static int normalizeCoord(int[] i_coord_x, int[] i_coord_y,int i_coord_num)\r
+       {\r
+               //\r
+               final int sx = i_coord_x[0];\r
+               final int sy = i_coord_y[0];\r
+               int d = 0;\r
+               int w, x, y;\r
+               int ret = 0;\r
+               for (int i = 1; i < i_coord_num; i++) {\r
+                       x = i_coord_x[i] - sx;\r
+                       y = i_coord_y[i] - sy;\r
+                       w = x * x + y * y;\r
+                       if (w > d) {\r
+                               d = w;\r
+                               ret = i;\r
+                       }\r
+                       // ここでうまく終了条件入れられないかな。\r
+               }               \r
+               // vertex1を境界にして、後方に配列を連結\r
+               System.arraycopy(i_coord_x, 1, i_coord_x, i_coord_num, ret);\r
+               System.arraycopy(i_coord_y, 1, i_coord_y, i_coord_num, ret);\r
+               return ret;\r
+       }       \r
+       \r
+}
\ No newline at end of file
index a04296d..f8ee00d 100644 (file)
@@ -42,5 +42,5 @@ import jp.nyatla.nyartoolkit.core.types.*;
 public class NyARTransMatResult extends NyARDoubleMatrix34\r
 {\r
        public boolean has_value = false;\r
-       public NyARDoublePoint3d angle=new NyARDoublePoint3d();\r
+       public final NyARDoublePoint3d angle=new NyARDoublePoint3d();\r
 }\r
index bc776fb..2f41dd9 100644 (file)
@@ -36,8 +36,8 @@ import jp.nyatla.nyartoolkit.core.types.*;
 \r
 final public class NyARTransOffset\r
 {\r
-       public NyARDoublePoint3d[] vertex=NyARDoublePoint3d.createArray(4);\r
-       public NyARDoublePoint3d point=new NyARDoublePoint3d(); \r
+       public final NyARDoublePoint3d[] vertex=NyARDoublePoint3d.createArray(4);\r
+       public final NyARDoublePoint3d point=new NyARDoublePoint3d();   \r
        /**\r
         * 中心位置と辺長から、オフセット情報を作成して設定する。\r
         * @param i_width\r
index f59a04c..646b3f6 100644 (file)
@@ -35,19 +35,15 @@ package jp.nyatla.nyartoolkit.core.types.stack;
 import jp.nyatla.nyartoolkit.core.types.*;\r
 import jp.nyatla.utils.NyObjectStack;\r
 \r
-public class NyARIntPointStack extends NyObjectStack\r
+public class NyARIntPointStack extends NyObjectStack<NyARIntPoint2d>\r
 {\r
        public NyARIntPointStack(int i_length)\r
        {\r
-               super(new NyARIntPoint2d[i_length]);\r
-\r
+               super(i_length,NyARIntPoint2d.class);\r
+               return;\r
        }\r
-\r
-       protected void onReservRequest(int i_start, int i_end, Object[] i_buffer)\r
+       protected NyARIntPoint2d createElement()\r
        {\r
-               for (int i = i_start; i < i_end; i++) {\r
-                       i_buffer[i] = new NyARIntPoint2d();\r
-               }\r
-       }\r
-\r
+               return new NyARIntPoint2d();\r
+       }       \r
 }\r
index 079d21d..26a3a18 100644 (file)
@@ -35,18 +35,15 @@ package jp.nyatla.nyartoolkit.core.types.stack;
 import jp.nyatla.nyartoolkit.core.types.NyARIntRect;\r
 import jp.nyatla.utils.NyObjectStack;\r
 \r
-public class NyARIntRectStack extends NyObjectStack\r
+public class NyARIntRectStack extends NyObjectStack<NyARIntRect>\r
 {\r
        public NyARIntRectStack(int i_length)\r
        {\r
-               super(new NyARIntRect[i_length]);\r
-\r
+               super(i_length,NyARIntRect.class);\r
        }\r
-\r
-       protected void onReservRequest(int i_start, int i_end, Object[] i_buffer)\r
+       protected NyARIntRect createElement()\r
        {\r
-               for (int i = i_start; i < i_end; i++) {\r
-                       i_buffer[i] = new NyARIntRect();\r
-               }\r
+               return new NyARIntRect();\r
        }\r
+       \r
 }\r
index 4d786c3..b354029 100644 (file)
@@ -252,7 +252,7 @@ public class NyARRasterDetector_QrCodeEdge
                                        break;\r
                                case 10:\r
                                        /* コード特定→保管 */\r
-                                       item = (NyARIntRect)this._result.prePush();\r
+                                       item = this._result.prePush();\r
                                        item.x = x;\r
                                        item.y = y;\r
                                        item.w =s_pos-x;\r
index f7d2f60..d169116 100644 (file)
@@ -90,7 +90,7 @@ public class NyARRasterThresholdAnalyzer_DiffHistgram implements INyARRasterThre
        public void analyzeRaster(INyARRaster i_input) throws NyARException\r
        {\r
                final INyARBufferReader buffer_reader=i_input.getBufferReader();        \r
-               assert (buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8));\r
+               assert (buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
                int[] histgram = new int[256];\r
                this._threshold = createHistgram((int[])buffer_reader.getBuffer(),i_input.getSize(), histgram);\r
        }\r
@@ -105,8 +105,8 @@ public class NyARRasterThresholdAnalyzer_DiffHistgram implements INyARRasterThre
        {\r
                INyARBufferReader in_buffer_reader=i_input.getBufferReader();   \r
                INyARBufferReader out_buffer_reader=i_output.getBufferReader(); \r
-               assert (in_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8));\r
-               assert (out_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8));\r
+               assert (in_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
+               assert (out_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
                NyARIntSize size = i_output.getSize();\r
 \r
                int[] out_buf = (int[]) out_buffer_reader.getBuffer();\r
index 894bede..9817abd 100644 (file)
@@ -105,7 +105,7 @@ public class NyARRasterThresholdAnalyzer_PTile implements INyARRasterThresholdAn
        public void analyzeRaster(INyARRaster i_input) throws NyARException\r
        {\r
                final INyARBufferReader buffer_reader=i_input.getBufferReader();        \r
-               assert (buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8));\r
+               assert (buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
                int[] histgram = new int[256];\r
                this._threshold = createHistgram(buffer_reader,i_input.getSize(), histgram);\r
        }\r
@@ -120,8 +120,8 @@ public class NyARRasterThresholdAnalyzer_PTile implements INyARRasterThresholdAn
        {\r
                INyARBufferReader in_buffer_reader=i_input.getBufferReader();   \r
                INyARBufferReader out_buffer_reader=i_output.getBufferReader(); \r
-               assert (in_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8));\r
-               assert (out_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8));\r
+               assert (in_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
+               assert (out_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
                NyARIntSize size = i_output.getSize();\r
 \r
                int[] out_buf = (int[]) out_buffer_reader.getBuffer();\r
index 8338629..5b1ef2d 100644 (file)
@@ -50,17 +50,17 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
        /**\r
         * Glayscale(MAX256)のヒストグラム計算クラス\r
         */\r
-       final class CreateHistgramImpl_INT1D_GLAY_8 implements ICreateHistgramImpl\r
+       final class CreateHistgramImpl_INT1D_GRAY_8 implements ICreateHistgramImpl\r
        {\r
                public int _v_interval;\r
-               public CreateHistgramImpl_INT1D_GLAY_8(int i_v_interval)\r
+               public CreateHistgramImpl_INT1D_GRAY_8(int i_v_interval)\r
                {\r
                        this._v_interval=i_v_interval;\r
                        return;\r
                }\r
                public int createHistgramImpl(INyARBufferReader i_reader,NyARIntSize i_size, int[] o_histgram)\r
                {\r
-                       assert (i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8));\r
+                       assert (i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
 \r
                        int sum=0;\r
                        final int[] input=(int[]) i_reader.getBuffer();\r
@@ -131,7 +131,7 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
                }\r
        }\r
        /**\r
-        * RGBX32bitのヒストグラム計算クラス\r
+        * BYTE1D_B8G8R8X8_32のヒストグラム計算クラス\r
         *\r
         */     \r
     final class CreateHistgramImpl_BYTE1D_B8G8R8X8_32 implements ICreateHistgramImpl\r
@@ -152,7 +152,7 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
             for (int y = i_size.h - 1; y >= 0; y -= this._v_interval)\r
             {\r
                 sum += i_size.w;\r
-                int pt = y * i_size.w * 3;\r
+                int pt = y * i_size.w * 4;\r
                 int x, v;\r
                 for (x = pix_count - 1; x >= pix_mod_part; x--)\r
                 {\r
@@ -185,7 +185,63 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
             return sum;\r
         }\r
     }  \r
-       private int _persentage;\r
+       /**\r
+        * BYTE1D_B8G8R8X8_32のヒストグラム計算クラス\r
+        *\r
+        */     \r
+    final class CreateHistgramImpl_BYTE1D_X8R8G8B8_32 implements ICreateHistgramImpl\r
+    {\r
+        private int _v_interval;\r
+        public CreateHistgramImpl_BYTE1D_X8R8G8B8_32(int i_v_interval)\r
+        {\r
+            this._v_interval = i_v_interval;\r
+            return;\r
+        }\r
+        public int createHistgramImpl(INyARBufferReader i_reader, NyARIntSize i_size, int[] o_histgram)\r
+        {\r
+            assert(i_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_BYTE1D_X8R8G8B8_32));\r
+            byte[] input = (byte[])i_reader.getBuffer();\r
+            int pix_count = i_size.w;\r
+            int pix_mod_part = pix_count - (pix_count % 8);\r
+            int sum = 0;\r
+            for (int y = i_size.h - 1; y >= 0; y -= this._v_interval)\r
+            {\r
+                sum += i_size.w;\r
+                int pt = y * i_size.w * 4;\r
+                int x, v;\r
+                for (x = pix_count - 1; x >= pix_mod_part; x--)\r
+                {\r
+                    v = ((input[pt + 1] & 0xff) + (input[pt + 2] & 0xff) + (input[pt + 3] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    pt += 4;\r
+                }\r
+                //タイリング\r
+                for (; x >= 0; x -= 8)\r
+                {\r
+                    v = ((input[pt + 1] & 0xff) + (input[pt + 2] & 0xff) + (input[pt + 3] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 5] & 0xff) + (input[pt + 6] & 0xff) + (input[pt + 7] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 9] & 0xff) + (input[pt + 10] & 0xff) + (input[pt + 11] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 13] & 0xff) + (input[pt + 14] & 0xff) + (input[pt + 15] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 17] & 0xff) + (input[pt + 18] & 0xff) + (input[pt + 19] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 21] & 0xff) + (input[pt + 22] & 0xff) + (input[pt + 23] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 25] & 0xff) + (input[pt + 26] & 0xff) + (input[pt + 27] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    v = ((input[pt + 29] & 0xff) + (input[pt + 30] & 0xff) + (input[pt + 31] & 0xff)) / 3;\r
+                    o_histgram[v]++;\r
+                    pt += 4 * 8;\r
+                }\r
+            }\r
+            return sum;\r
+        }\r
+    }  \r
+\r
+    private int _persentage;\r
        private int _threshold;\r
        private ICreateHistgramImpl _histgram;\r
        \r
@@ -204,12 +260,15 @@ public class NyARRasterThresholdAnalyzer_SlidePTile implements INyARRasterThresh
             case INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
                 this._histgram = new CreateHistgramImpl_BYTE1D_RGB_24(i_vertical_interval);\r
                 break;\r
-            case INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8:\r
-                this._histgram = new CreateHistgramImpl_INT1D_GLAY_8(i_vertical_interval);\r
+            case INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8:\r
+                this._histgram = new CreateHistgramImpl_INT1D_GRAY_8(i_vertical_interval);\r
                 break;\r
             case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8X8_32:\r
                 this._histgram = new CreateHistgramImpl_BYTE1D_B8G8R8X8_32(i_vertical_interval);\r
                 break;\r
+               case INyARBufferReader.BUFFERFORMAT_BYTE1D_X8R8G8B8_32:\r
+                       this._histgram = new CreateHistgramImpl_BYTE1D_X8R8G8B8_32(i_vertical_interval);\r
+                       break;\r
             default:\r
                 throw new NyARException();\r
         }\r
index 2fe5abb..3c1f739 100644 (file)
@@ -46,8 +46,8 @@ public class NyARRasterFilter_Edge implements INyARRasterFilter
        {\r
                INyARBufferReader in_buffer_reader=i_input.getBufferReader();   \r
                INyARBufferReader out_buffer_reader=i_output.getBufferReader(); \r
-               assert (in_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8));\r
-               assert (out_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8));\r
+               assert (in_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
+               assert (out_buffer_reader.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8));\r
                assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
 \r
                int[] out_buf = (int[]) out_buffer_reader.getBuffer();\r
index cd3d848..01c10b7 100644 (file)
@@ -42,6 +42,7 @@ import jp.nyatla.nyartoolkit.core.transmat.*;
 import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
 import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;\r
 import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.*;\r
 \r
 /**\r
  * 画像からARCodeに最も一致するマーカーを1個検出し、その変換行列を計算するクラスです。\r
@@ -90,7 +91,8 @@ public class NyARCustomSingleDetectMarker
        {\r
                final NyARIntSize scr_size=i_param.getScreenSize();             \r
                // 解析オブジェクトを作る\r
-               this._square_detect = new NyARSquareDetector(i_param.getDistortionFactor(),scr_size);\r
+//             this._square_detect = new NyARSquareDetector_ARToolKit(i_param.getDistortionFactor(),scr_size);\r
+               this._square_detect = new NyARSquareDetector_Rle(i_param.getDistortionFactor(),scr_size);\r
                this._transmat = new NyARTransMat(i_param);\r
                // 比較コードを保存\r
                this._marker_width = i_marker_width;\r
@@ -129,8 +131,8 @@ public class NyARCustomSingleDetectMarker
 \r
                //ラスタを2値イメージに変換する.\r
                this._tobin_filter.doFilter(i_raster,this._bin_raster);\r
-               \r
-               \r
+\r
+       \r
                this._detected_square = null;\r
                NyARSquareStack l_square_list = this._square_list;\r
                // スクエアコードを探す\r
@@ -150,7 +152,7 @@ public class NyARCustomSingleDetectMarker
                double confidence = 0;\r
                for(int i=0;i<number_of_square;i++){\r
                        // 評価基準になるパターンをイメージから切り出す\r
-                       if (!this._patt.pickFromRaster(i_raster, (NyARSquare)l_square_list.getItem(i))){\r
+                       if (!this._patt.pickFromRaster(i_raster, l_square_list.getItem(i))){\r
                                continue;\r
                        }\r
                        //取得パターンをカラー差分データに変換して評価する。\r
@@ -170,7 +172,7 @@ public class NyARCustomSingleDetectMarker
                }\r
                \r
                // マーカー情報を保存\r
-               this._detected_square = (NyARSquare)l_square_list.getItem(square_index);\r
+               this._detected_square = l_square_list.getItem(square_index);\r
                this._detected_direction = direction;\r
                this._detected_confidence = confidence;\r
                return result;\r
index 568d315..5c3f252 100644 (file)
@@ -112,14 +112,17 @@ public class NyARDetectMarker
         * i_codeのマーカーサイズをミリメートルで指定した配列を指定します。 先頭からi_number_of_code個の要素には、有効な値を指定する必要があります。\r
         * @param i_number_of_code\r
         * i_codeに含まれる、ARCodeの数を指定します。\r
+        * @param i_input_raster_type\r
+        * 入力ラスタのピクセルタイプを指定します。この値は、INyARBufferReaderインタフェイスのgetBufferTypeの戻り値を指定します。\r
         * @throws NyARException\r
         */\r
-       public NyARDetectMarker(NyARParam i_param,NyARCode[] i_code,double[] i_marker_width, int i_number_of_code) throws NyARException\r
+       public NyARDetectMarker(NyARParam i_param,NyARCode[] i_code,double[] i_marker_width, int i_number_of_code,int i_input_raster_type) 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
+               this._tobin_filter=new NyARRasterFilter_ARToolkitThreshold(100,i_input_raster_type);\r
 \r
                //各コード用の比較器を作る。\r
                this._match_patt=new NyARMatchPatt_Color_WITHOUT_PCA[i_number_of_code];\r
@@ -146,7 +149,7 @@ public class NyARDetectMarker
 \r
        private NyARBinRaster _bin_raster;\r
 \r
-       private NyARRasterFilter_ARToolkitThreshold _tobin_filter = new NyARRasterFilter_ARToolkitThreshold(100);\r
+       private NyARRasterFilter_ARToolkitThreshold _tobin_filter;\r
        private final NyARMatchPattResult __detectMarkerLite_mr=new NyARMatchPattResult();\r
 \r
        /**\r
@@ -186,7 +189,7 @@ public class NyARDetectMarker
 \r
                // 1スクエア毎に、一致するコードを決定していく\r
                for (int i = 0; i < number_of_square; i++) {\r
-                       NyARSquare square = (NyARSquare)l_square_list.getItem(i);\r
+                       NyARSquare square = (l_square_list.getItem(i));\r
 \r
                        // 評価基準になるパターンをイメージから切り出す\r
                        if (!this._patt.pickFromRaster(i_raster, square)) {\r
index 2545bb6..e8fe17a 100644 (file)
@@ -52,11 +52,13 @@ public class NyARSingleDetectMarker extends NyARCustomSingleDetectMarker
         * 検出するARCodeを指定します。\r
         * @param i_marker_width\r
         * ARコードの物理サイズを、ミリメートルで指定します。\r
+        * @param i_input_raster_type\r
+        * 入力ラスタのピクセルタイプを指定します。この値は、INyARBufferReaderインタフェイスのgetBufferTypeの戻り値を指定します。\r
         * @throws NyARException\r
         */\r
-       public NyARSingleDetectMarker(NyARParam i_param, NyARCode i_code, double i_marker_width) throws NyARException\r
+       public NyARSingleDetectMarker(NyARParam i_param, NyARCode i_code, double i_marker_width,int i_input_raster_type) throws NyARException\r
        {\r
-               super(i_param,i_code,i_marker_width,new NyARRasterFilter_ARToolkitThreshold(100));\r
+               super(i_param,i_code,i_marker_width,new NyARRasterFilter_ARToolkitThreshold(100,i_input_raster_type));\r
        }\r
 \r
 \r
@@ -64,8 +66,8 @@ public class NyARSingleDetectMarker extends NyARCustomSingleDetectMarker
         * i_imageにマーカー検出処理を実行し、結果を記録します。\r
         * \r
         * @param i_raster\r
-        * ã\83\9eã\83¼ã\82«ã\83¼ã\82\92æ¤\9cå\87ºã\81\99ã\82\8bã\82¤ã\83¡ã\83¼ã\82¸ã\82\92æ\8c\87å®\9aã\81\97ã\81¾ã\81\99ã\80\82ã\82¤ã\83¡ã\83¼ã\82¸ã\82µã\82¤ã\82ºã\81¯ã\80\81ã\82«ã\83¡ã\83©ã\83\91ã\83©ã\83¡ã\83¼ã\82¿\r
-        * ã\81¨ä¸\80è\87´ã\81\97ã\81¦ã\81\84ã\81ªã\81\91ã\82\8cã\81°ã\81ªã\82\8aません。\r
+        * ã\83\9eã\83¼ã\82«ã\83¼ã\82\92æ¤\9cå\87ºã\81\99ã\82\8bã\82¤ã\83¡ã\83¼ã\82¸ã\82\92æ\8c\87å®\9aã\81\97ã\81¾ã\81\99ã\80\82ã\82¤ã\83¡ã\83¼ã\82¸ã\82µã\82¤ã\82ºã\81¯ã\80\81ã\82³ã\83³ã\82¹ã\83\88ã\83©ã\82¯ã\82¿ã\81§æ\8c\87å®\9ai_paramã\81®\r
+        * ã\82¹ã\82¯ã\83ªã\83¼ã\83³ã\82µã\82¤ã\82ºã\81¨ä¸\80è\87´ã\81\97ã\80\81ã\81\8bã\81¤i_input_raster_typeã\81«æ\8c\87å®\9aã\81\97ã\81\9få½¢å¼\8fã\81§ã\81ªã\81\91ã\82\8cã\81°ã\81\84ã\81\91ません。\r
         * @return マーカーが検出できたかを真偽値で返します。\r
         * @throws NyARException\r
         */\r
index 396ced4..67c4e8a 100644 (file)
@@ -42,5 +42,5 @@ public class NyIdMarkerPattern
        public int ctrl_domain;\r
        public int ctrl_mask;\r
        public int check;\r
-       public int[] data=new int[32];\r
+       public final int[] data=new int[32];\r
 }
\ No newline at end of file
index b9996e8..2dca3ce 100644 (file)
@@ -53,19 +53,12 @@ class PerspectivePixelReader
        private NyARPerspectiveParamGenerator _param_gen=new NyARPerspectiveParamGenerator_O1(1,1,100,100);\r
        private double[] _cparam=new double[8];\r
 \r
-       private INyARRgbRaster _raster;\r
-       private NyARIntSize _raster_size;\r
 \r
        public PerspectivePixelReader()\r
        {\r
                return;\r
        }\r
-       public void setSourceRaster(INyARRgbRaster i_raster)\r
-       {\r
-               this._raster=i_raster;\r
-               this._raster_size=i_raster.getSize();\r
-               return;\r
-       }\r
+\r
        public boolean setSourceSquare(NyARIntPoint2d[] i_vertex)throws NyARException\r
        {\r
                return this._param_gen.getParam(i_vertex, this._cparam);\r
@@ -84,15 +77,14 @@ class PerspectivePixelReader
         * @param o_pixel\r
         * @throws NyARException\r
         */\r
-       private boolean rectPixels(int i_lt_x,int i_lt_y,int i_step_x,int i_step_y,int i_width,int i_height,int i_out_st,int[] o_pixel)throws NyARException\r
+       private boolean rectPixels(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,int i_lt_x,int i_lt_y,int i_step_x,int i_step_y,int i_width,int i_height,int i_out_st,int[] o_pixel)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
-               final int raster_width=this._raster_size.w;\r
-               final int raster_height=this._raster_size.h;\r
+               final int raster_width=i_raster_size.w;\r
+               final int raster_height=i_raster_size.h;\r
 \r
                int out_index=i_out_st;\r
                final double cpara_6=cpara[6];\r
@@ -121,7 +113,7 @@ class PerspectivePixelReader
                                pt++;\r
                        }\r
                        //1行分のピクセルを取得(場合によっては専用アクセサを書いた方がいい)\r
-                       reader.getPixelSet(ref_x,ref_y,i_width,pixcel_temp);\r
+                       i_reader.getPixelSet(ref_x,ref_y,i_width,pixcel_temp);\r
                        //グレースケールにしながら、line→mapへの転写\r
                        for(int i2=0;i2<i_width;i2++){\r
                                int index=i2*3;\r
@@ -217,7 +209,7 @@ class PerspectivePixelReader
         * @return\r
         * @throws NyARException\r
         */\r
-       public int getRowFrequency(int i_y1,int i_th_h,int i_th_l,int[] o_edge_index)throws NyARException\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
                //3,4,5,6,7,8,9,10\r
                final int[] freq_count_table=this._freq_count_table;\r
@@ -225,7 +217,7 @@ class PerspectivePixelReader
                final int freq_table[]=this._freq_table;\r
                //初期化\r
                final double[] cpara=this._cparam;\r
-               final INyARRgbPixelReader reader=this._raster.getRgbPixelReader();\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
@@ -235,8 +227,8 @@ class PerspectivePixelReader
                for(int i=0;i<110;i++){\r
                        freq_table[i]=0;\r
                }\r
-               final int raster_width=this._raster_size.w;\r
-               final int raster_height=this._raster_size.h;\r
+               final int raster_width=i_raster_size.w;\r
+               final int raster_height=i_raster_size.h;\r
 \r
                final double cpara_0=cpara[0];\r
                final double cpara_3=cpara[3];\r
@@ -267,7 +259,7 @@ class PerspectivePixelReader
                        }\r
                        \r
                        //ピクセルを取得(入力画像を多様化するならここから先を調整すること)\r
-                       reader.getPixelSet(ref_x,ref_y,FRQ_POINTS,pixcel_temp);\r
+                       i_reader.getPixelSet(ref_x,ref_y,FRQ_POINTS,pixcel_temp);\r
 \r
                        //o_edge_indexを一時的に破壊して調査する\r
                        final int freq_t=getFreqInfo(pixcel_temp,i_th_h,i_th_l,o_edge_index);                   \r
@@ -290,10 +282,10 @@ class PerspectivePixelReader
                return getMaxFreq(freq_count_table,freq_table,o_edge_index);\r
        }\r
        \r
-       public int getColFrequency(int i_x1,int i_th_h,int i_th_l,int[] o_edge_index)throws NyARException\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 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
@@ -307,8 +299,8 @@ class PerspectivePixelReader
                for(int i=0;i<110;i++){\r
                        freq_table[i]=0;\r
                }\r
-               final int raster_width=this._raster_size.w;\r
-               final int raster_height=this._raster_size.h;\r
+               final int raster_width=i_raster_size.w;\r
+               final int raster_height=i_raster_size.h;\r
                \r
                \r
                final double cpara7=cpara[7];\r
@@ -340,7 +332,7 @@ class PerspectivePixelReader
                        }               \r
                \r
                        //ピクセルを取得(入力画像を多様化するならここを調整すること)\r
-                       reader.getPixelSet(ref_x,ref_y,FRQ_POINTS,pixcel_temp);\r
+                       i_reader.getPixelSet(ref_x,ref_y,FRQ_POINTS,pixcel_temp);\r
                        \r
                        final int freq_t=getFreqInfo(pixcel_temp,i_th_h,i_th_l,o_edge_index);\r
                        //周期は3-10であること\r
@@ -500,21 +492,21 @@ class PerspectivePixelReader
         * @return\r
         * @throws NyARException\r
         */\r
-       public void detectThresholdValue(INyARRgbPixelReader i_reader,int i_x,int i_y,TThreshold o_threshold)throws NyARException\r
+       public void detectThresholdValue(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,TThreshold o_threshold)throws NyARException\r
        {\r
                final int[] th_pixels=this._th_pixels;\r
 \r
                //左上のピックアップ領域からピクセルを得る(00-24)\r
-               rectPixels(THRESHOLD_SAMPLE_LT,THRESHOLD_SAMPLE_LT,THRESHOLD_STEP,THRESHOLD_STEP,THRESHOLD_PIXEL,THRESHOLD_PIXEL,0,th_pixels);\r
+               rectPixels(i_reader,i_raster_size,THRESHOLD_SAMPLE_LT,THRESHOLD_SAMPLE_LT,THRESHOLD_STEP,THRESHOLD_STEP,THRESHOLD_PIXEL,THRESHOLD_PIXEL,0,th_pixels);\r
                \r
                //左下のピックアップ領域からピクセルを得る(25-49)\r
-               rectPixels(THRESHOLD_SAMPLE_LT,THRESHOLD_SAMPLE_RB,THRESHOLD_STEP,THRESHOLD_STEP,THRESHOLD_PIXEL,THRESHOLD_PIXEL,THRESHOLD_SAMPLE,th_pixels);\r
+               rectPixels(i_reader,i_raster_size,THRESHOLD_SAMPLE_LT,THRESHOLD_SAMPLE_RB,THRESHOLD_STEP,THRESHOLD_STEP,THRESHOLD_PIXEL,THRESHOLD_PIXEL,THRESHOLD_SAMPLE,th_pixels);\r
                \r
                //右上のピックアップ領域からピクセルを得る(50-74)\r
-               rectPixels(THRESHOLD_SAMPLE_RB,THRESHOLD_SAMPLE_LT,THRESHOLD_STEP,THRESHOLD_STEP,THRESHOLD_PIXEL,THRESHOLD_PIXEL,THRESHOLD_SAMPLE*2,th_pixels);\r
+               rectPixels(i_reader,i_raster_size,THRESHOLD_SAMPLE_RB,THRESHOLD_SAMPLE_LT,THRESHOLD_STEP,THRESHOLD_STEP,THRESHOLD_PIXEL,THRESHOLD_PIXEL,THRESHOLD_SAMPLE*2,th_pixels);\r
 \r
                //右下のピックアップ領域からピクセルを得る(75-99)\r
-               rectPixels(THRESHOLD_SAMPLE_RB,THRESHOLD_SAMPLE_RB,THRESHOLD_STEP,THRESHOLD_STEP,THRESHOLD_PIXEL,THRESHOLD_PIXEL,THRESHOLD_SAMPLE*3,th_pixels);\r
+               rectPixels(i_reader,i_raster_size,THRESHOLD_SAMPLE_RB,THRESHOLD_SAMPLE_RB,THRESHOLD_STEP,THRESHOLD_STEP,THRESHOLD_PIXEL,THRESHOLD_PIXEL,THRESHOLD_SAMPLE*3,th_pixels);\r
 \r
                final THighAndLow hl=this.__detectThresholdValue_hl;\r
                //Ptailで求めたピクセル平均\r
@@ -601,15 +593,14 @@ class PerspectivePixelReader
        }\r
        private int[] __detectDataBitsIndex_freq_index1=new int[FRQ_POINTS];\r
        private int[] __detectDataBitsIndex_freq_index2=new int[FRQ_POINTS];\r
-       private int detectDataBitsIndex(PerspectivePixelReader.TThreshold i_th,double[] o_index_row,double[] o_index_col) throws NyARException\r
+       private int detectDataBitsIndex(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,PerspectivePixelReader.TThreshold i_th,double[] o_index_row,double[] o_index_col) throws NyARException\r
        {\r
                //周波数を測定\r
                final int[] freq_index1=this.__detectDataBitsIndex_freq_index1;\r
                final int[] freq_index2=this.__detectDataBitsIndex_freq_index2;\r
                \r
-               \r
-               int frq_t=getRowFrequency(i_th.lt_y,i_th.th_h,i_th.th_l,freq_index1);\r
-               int frq_b=getRowFrequency(i_th.rb_y,i_th.th_h,i_th.th_l,freq_index2);\r
+               int frq_t=getRowFrequency(i_reader,i_raster_size,i_th.lt_y,i_th.th_h,i_th.th_l,freq_index1);\r
+               int frq_b=getRowFrequency(i_reader,i_raster_size,i_th.rb_y,i_th.th_h,i_th.th_l,freq_index2);\r
                //周波数はまとも?\r
                if((frq_t<0 && frq_b<0) || frq_t==frq_b){\r
                        return -1;\r
@@ -630,8 +621,8 @@ class PerspectivePixelReader
                }               \r
                \r
                \r
-               final int frq_l=getColFrequency(i_th.lt_x,i_th.th_h,i_th.th_l,freq_index1);\r
-               final int frq_r=getColFrequency(i_th.rb_x,i_th.th_h,i_th.th_l,freq_index2);\r
+               final int frq_l=getColFrequency(i_reader,i_raster_size,i_th.lt_x,i_th.th_h,i_th.th_l,freq_index1);\r
+               final int frq_r=getColFrequency(i_reader,i_raster_size,i_th.rb_x,i_th.th_h,i_th.th_l,freq_index2);\r
                //周波数はまとも?\r
                if((frq_l<0 && frq_r<0) || frq_l==frq_r){\r
                        return -1;\r
@@ -665,12 +656,14 @@ class PerspectivePixelReader
        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
-       public boolean readDataBits(PerspectivePixelReader.TThreshold i_th,MarkerPattEncoder o_bitbuffer)throws NyARException\r
+       public boolean readDataBits(INyARRgbPixelReader i_reader,NyARIntSize i_raster_size,PerspectivePixelReader.TThreshold i_th,MarkerPattEncoder o_bitbuffer)throws NyARException\r
        {\r
                final double[] index_x=this.__readDataBits_index_bit_x;\r
                final double[] index_y=this.__readDataBits_index_bit_y;\r
+               \r
+\r
                //読み出し位置を取得\r
-               final int size=detectDataBitsIndex(i_th,index_x,index_y);\r
+               final int size=detectDataBitsIndex(i_reader,i_raster_size,i_th,index_x,index_y);\r
                final int resolution=size+size-1;\r
                if(size<0){\r
                        return false;\r
@@ -682,7 +675,6 @@ class PerspectivePixelReader
                final double[] cpara=this._cparam;\r
                final int[] ref_x=this._ref_x;\r
                final int[] ref_y=this._ref_y;\r
-               final INyARRgbPixelReader reader=this._raster.getRgbPixelReader();\r
                final int[] pixcel_temp=this._pixcel_temp;\r
                \r
                final double cpara_0=cpara[0];\r
@@ -741,7 +733,7 @@ class PerspectivePixelReader
                                pt++;\r
                        }\r
                        //1行分のピクセルを取得(場合によっては専用アクセサを書いた方がいい)\r
-                       reader.getPixelSet(ref_x,ref_y,resolution*4,pixcel_temp);\r
+                       i_reader.getPixelSet(ref_x,ref_y,resolution*4,pixcel_temp);\r
                        //グレースケールにしながら、line→mapへの転写\r
                        for(int i2=0;i2<resolution;i2++){\r
                                int index=i2*3*4;\r
@@ -1060,22 +1052,23 @@ public class NyIdMarkerPickup
         */\r
        public boolean pickFromRaster(INyARRgbRaster image, NyARSquare i_square,NyIdMarkerPattern o_data,NyIdMarkerParam o_param)throws NyARException\r
        {\r
-               this._perspective_reader.setSourceRaster(image);\r
                \r
                //遠近法のパラメータを計算\r
                if(!this._perspective_reader.setSourceSquare(i_square.imvertex)){\r
                        return false;\r
                };\r
                \r
-               final INyARRgbPixelReader reader=image.getRgbPixelReader();\r
+               INyARRgbPixelReader reader=image.getRgbPixelReader();\r
+               NyARIntSize raster_size=image.getSize();\r
+               \r
 \r
 \r
                final PerspectivePixelReader.TThreshold th=this.__pickFromRaster_th;\r
                final MarkerPattEncoder encoder=this.__pickFromRaster_encoder;\r
                //マーカパラメータを取得\r
-               this._perspective_reader.detectThresholdValue(reader,10,10,th);\r
+               this._perspective_reader.detectThresholdValue(reader,raster_size,th);\r
 \r
-               if(!this._perspective_reader.readDataBits(th, encoder)){\r
+               if(!this._perspective_reader.readDataBits(reader,raster_size,th, encoder)){\r
                        return false;\r
                }\r
                final int d=encoder.encode(o_data);\r
index 74ba8b1..3d1505d 100644 (file)
@@ -37,7 +37,7 @@ package jp.nyatla.nyartoolkit.nyidmarker.data;
  */\r
 public class NyIdMarkerData_RawBit implements INyIdMarkerData\r
 {\r
-       public int[] packet=new int[22];\r
+       public final int[] packet=new int[22];\r
        public int length;\r
        public boolean isEqual(INyIdMarkerData i_target)\r
        {\r
index 5228128..d39344e 100644 (file)
@@ -88,20 +88,20 @@ public abstract class SingleARMarkerProcesser
        // [AR]検出結果の保存用\r
        private NyARBinRaster _bin_raster;\r
 \r
-       private NyARRasterFilter_ARToolkitThreshold _tobin_filter = new NyARRasterFilter_ARToolkitThreshold(110);\r
+       private NyARRasterFilter_ARToolkitThreshold _tobin_filter;\r
 \r
        protected int _current_arcode_index = -1;\r
 \r
        private NyARMatchPattDeviationColorData _deviation_data;\r
 \r
 \r
-       public SingleARMarkerProcesser(NyARParam i_param) throws NyARException\r
+       public SingleARMarkerProcesser(NyARParam i_param,int i_raster_type) throws NyARException\r
        {\r
                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
-               this._deviation_data=new NyARMatchPattDeviationColorData(scr_size.w,scr_size.h);\r
+               this._tobin_filter=new NyARRasterFilter_ARToolkitThreshold(110,i_raster_type);\r
 \r
                // 2値画像バッファを作る\r
                this._bin_raster = new NyARBinRaster(scr_size.w, scr_size.h);\r
@@ -125,6 +125,7 @@ public abstract class SingleARMarkerProcesser
                }\r
                // 検出するマーカセット、情報、検出器を作り直す。\r
                this._patt = new NyARColorPatt_O3(i_code_resolution, i_code_resolution);\r
+               this._deviation_data=new NyARMatchPattDeviationColorData(i_code_resolution, i_code_resolution);\r
                this._marker_width = i_marker_width;\r
 \r
                this._match_patt = new NyARMatchPatt_Color_WITHOUT_PCA[i_ref_code_table.length];\r
@@ -148,9 +149,7 @@ public abstract class SingleARMarkerProcesser
        public void detectMarker(INyARRgbRaster i_raster) throws NyARException\r
        {\r
                // サイズチェック\r
-               if (!this._bin_raster.getSize().isEqualSize(i_raster.getSize().w / 2, i_raster.getSize().h / 2)) {\r
-                       throw new NyARException();\r
-               }\r
+               assert(this._bin_raster.getSize().isEqualSize(i_raster.getSize().w, i_raster.getSize().h));\r
 \r
                // コードテーブルが無ければここで終わり\r
                if (this._match_patt== null) {\r
@@ -223,7 +222,7 @@ public abstract class SingleARMarkerProcesser
                int square_index = 0;\r
                TResult_selectARCodeIndex detect_result = this.__detect_X_Marker_detect_result;\r
                for (int i = 0; i < number_of_square; i++) {\r
-                       if (!selectARCodeIndexFromList(i_raster, (NyARSquare) i_stack.getItem(i), detect_result)) {\r
+                       if (!selectARCodeIndexFromList(i_raster, (i_stack.getItem(i)), detect_result)) {\r
                                // 見つからない。\r
                                return;\r
                        }\r
@@ -240,7 +239,7 @@ public abstract class SingleARMarkerProcesser
                        dir = detect_result.direction;\r
                }\r
                // 認識状態を更新\r
-               updateStatus((NyARSquare) this._square_list.getItem(square_index), code_index, cf, dir);\r
+               updateStatus(this._square_list.getItem(square_index), code_index, cf, dir);\r
        }\r
 \r
        /**マーカの継続認識 現在認識中のマーカを優先して認識します。 \r
@@ -255,7 +254,7 @@ public abstract class SingleARMarkerProcesser
                int square_index = 0;\r
                TResult_selectARCodeIndex detect_result = this.__detect_X_Marker_detect_result;\r
                for (int i = 0; i < number_of_square; i++) {\r
-                       if (!selectARCodeIndexFromList(i_raster, (NyARSquare) i_stack.getItem(i), detect_result)) {\r
+                       if (!selectARCodeIndexFromList(i_raster,i_stack.getItem(i), detect_result)) {\r
                                // 見つからない。\r
                                return;\r
                        }\r
@@ -277,7 +276,7 @@ public abstract class SingleARMarkerProcesser
                        square_index = i;\r
                }\r
                // 認識状態を更新\r
-               updateStatus((NyARSquare) this._square_list.getItem(square_index), code_index, cf, dir);\r
+               updateStatus(this._square_list.getItem(square_index), code_index, cf, dir);\r
        }\r
 \r
        private NyARTransMatResult __NyARSquare_result = new NyARTransMatResult();\r
index fd13a2d..6e7da0c 100644 (file)
@@ -63,7 +63,7 @@ public abstract class SingleNyIdMarkerProcesser
        // [AR]検出結果の保存用\r
        private NyARBinRaster _bin_raster;\r
 \r
-       private NyARRasterFilter_ARToolkitThreshold _tobin_filter = new NyARRasterFilter_ARToolkitThreshold(110);\r
+       private NyARRasterFilter_ARToolkitThreshold _tobin_filter;\r
 \r
        private NyIdMarkerPickup _id_pickup = new NyIdMarkerPickup();\r
 \r
@@ -82,6 +82,7 @@ public abstract class SingleNyIdMarkerProcesser
                this._is_active=false;\r
                this._data_temp=i_encoder.createDataInstance();\r
                this._data_current=i_encoder.createDataInstance();\r
+               this._tobin_filter = new NyARRasterFilter_ARToolkitThreshold(110,i_raster_format);\r
                this._threshold_detect=new NyARRasterThresholdAnalyzer_SlidePTile(15,i_raster_format,4);\r
                return;\r
        }\r
@@ -143,7 +144,7 @@ public abstract class SingleNyIdMarkerProcesser
                INyIdMarkerData marker_id=null;\r
                for (int i = 0; i < number_of_square; i++) {\r
                        // 評価基準になるパターンをイメージから切り出す\r
-                       current_square=(NyARSquare) i_stack.getItem(i);\r
+                       current_square=i_stack.getItem(i);\r
                        if (!this._id_pickup.pickFromRaster(i_raster,current_square, patt_data, param)) {\r
                                continue;\r
                        }\r
@@ -184,7 +185,7 @@ public abstract class SingleNyIdMarkerProcesser
                INyIdMarkerData marker_id=null;\r
                for (int i = 0; i < number_of_square; i++){\r
                        //idマーカを認識\r
-                       current_square=(NyARSquare) i_stack.getItem(i);\r
+                       current_square=i_stack.getItem(i);\r
                        if (!this._id_pickup.pickFromRaster(i_raster, current_square, patt_data, param)) {\r
                                continue;\r
                        }\r
diff --git a/src/jp/nyatla/nyartoolkit/sample/NyIdTest.java b/src/jp/nyatla/nyartoolkit/sample/NyIdTest.java
new file mode 100644 (file)
index 0000000..0fe8366
--- /dev/null
@@ -0,0 +1,147 @@
+/* \r
+ * PROJECT: NyARToolkit\r
+ * --------------------------------------------------------------------------------\r
+ * This work is based on the original ARToolKit developed by\r
+ *   Hirokazu Kato\r
+ *   Mark Billinghurst\r
+ *   HITLab, University of Washington, Seattle\r
+ * http://www.hitl.washington.edu/artoolkit/\r
+ *\r
+ * The NyARToolkit is Java version ARToolkit class library.\r
+ * Copyright (C)2008 R.Iizuka\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this framework; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.sample;\r
+\r
+import java.io.*;\r
+import java.util.*;\r
+\r
+import jp.nyatla.nyartoolkit.core.*;\r
+import jp.nyatla.nyartoolkit.core.param.NyARParam;\r
+import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
+import jp.nyatla.nyartoolkit.core.transmat.*;\r
+import jp.nyatla.nyartoolkit.nyidmarker.*;\r
+import jp.nyatla.nyartoolkit.nyidmarker.data.*;\r
+import jp.nyatla.nyartoolkit.processor.*;\r
+\r
+/**\r
+ * 320x240のBGRA32で記録されたIdmarkerを撮影したRAWイメージから、\r
+ * Idマーカを認識します。\r
+ *\r
+ */\r
+public class NyIdTest\r
+{\r
+    public class MarkerProcessor extends SingleNyIdMarkerProcesser\r
+    {\r
+        private Object _sync_object = new Object();\r
+        public NyARTransMatResult transmat = null;\r
+        public int current_id = -1;\r
+\r
+        public MarkerProcessor(NyARParam i_cparam, int i_raster_format) throws Exception\r
+        {\r
+            super(i_cparam, new NyIdMarkerDataEncoder_RawBit(), i_raster_format);\r
+            //アプリケーションフレームワークの初期化\r
+            return;\r
+        }\r
+        /**\r
+         * アプリケーションフレームワークのハンドラ(マーカ出現)\r
+         */\r
+        protected void onEnterHandler(INyIdMarkerData i_code)\r
+        {\r
+            synchronized (this._sync_object)\r
+            {\r
+                NyIdMarkerData_RawBit code = (NyIdMarkerData_RawBit)i_code;\r
+                if (code.length > 4)\r
+                {\r
+                    //4バイト以上の時はint変換しない。\r
+                    this.current_id = -1;//undefined_id\r
+                }\r
+                else\r
+                {\r
+                    this.current_id = 0;\r
+                    //最大4バイト繋げて1個のint値に変換\r
+                    for (int i = 0; i < code.length; i++)\r
+                    {\r
+                        this.current_id = (this.current_id << 8) | code.packet[i];\r
+                    }\r
+                }\r
+                this.transmat = null;\r
+            }\r
+        }\r
+        /**\r
+         * アプリケーションフレームワークのハンドラ(マーカ消滅)\r
+         */\r
+        protected void onLeaveHandler()\r
+        {\r
+               synchronized (this._sync_object)\r
+            {\r
+                this.current_id = -1;\r
+                this.transmat = null;\r
+            }\r
+            return;\r
+        }\r
+        /**\r
+         * アプリケーションフレームワークのハンドラ(マーカ更新)\r
+         */\r
+        protected void onUpdateHandler(NyARSquare i_square, NyARTransMatResult result)\r
+        {\r
+               synchronized (this._sync_object)\r
+            {\r
+                this.transmat = result;\r
+            }\r
+        }\r
+    }\r
+       private final String data_file = "../Data/320x240NyId.raw";\r
+       private final String camera_file = "../Data/camera_para.dat";\r
+    public NyIdTest()\r
+    {\r
+    }\r
+    public void Test() throws Exception\r
+    {\r
+        //AR用カメラパラメタファイルをロード\r
+        NyARParam ap = new NyARParam();\r
+        ap.loadARParamFromFile(camera_file);\r
+        ap.changeScreenSize(320, 240);\r
+\r
+               // 試験イメージの読み出し(320x240 BGRAのRAWデータ)\r
+               File f = new File(data_file);\r
+               FileInputStream fs = new FileInputStream(data_file);\r
+               byte[] buf = new byte[(int) f.length()];\r
+               fs.read(buf);           \r
+\r
+        NyARRgbRaster_RGB ra = NyARRgbRaster_RGB.wrap(buf, 320, 240);\r
+\r
+        MarkerProcessor pr = new MarkerProcessor(ap, ra.getBufferReader().getBufferType());\r
+        pr.detectMarker(ra);\r
+        return;\r
+    }\r
+       public static void main(String[] args)\r
+       {\r
+\r
+               try {\r
+                       NyIdTest t = new NyIdTest();\r
+                       // t.Test_arGetVersion();\r
+                       t.Test();\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+       }    \r
+}\r
index 55720ec..530c57c 100644 (file)
@@ -79,7 +79,7 @@ public class RawFileTest
                // Blank_Raster ra=new Blank_Raster(320, 240);\r
 \r
                // 1パターンのみを追跡するクラスを作成\r
-               NyARSingleDetectMarker ar = new NyARSingleDetectMarker(ap, code, 80.0);\r
+               NyARSingleDetectMarker ar = new NyARSingleDetectMarker(ap, code, 80.0,ra.getBufferReader().getBufferType());\r
                NyARTransMatResult result_mat = new NyARTransMatResult();\r
                ar.setContinueMode(false);\r
                ar.detectMarkerLite(ra, 100);\r
@@ -87,7 +87,7 @@ public class RawFileTest
 \r
                // マーカーを検出\r
                Date d2 = new Date();\r
-               for (int i = 0; i < 1000; i++) {\r
+               for (int i = 0; i < 100; i++) {\r
                        // 変換行列を取得\r
                        ar.detectMarkerLite(ra, 100);\r
                        ar.getTransmationMatrix(result_mat);\r
index 64a6af2..7ca6c3d 100644 (file)
  * \r
  */\r
 package jp.nyatla.utils;\r
-\r
+import java.lang.reflect.*;\r
 import jp.nyatla.nyartoolkit.NyARException;\r
 \r
+\r
+\r
+\r
 /**\r
  * オンデマンド割り当てをするオブジェクト配列。\r
  * 配列には実体を格納します。\r
  */\r
-public abstract class NyObjectStack\r
+public abstract class NyObjectStack<T>\r
 {\r
        private final static int ARRAY_APPEND_STEP = 64;\r
 \r
-       protected final Object[] _items;\r
+       protected final T[] _items;\r
 \r
        private int _allocated_size;\r
 \r
@@ -45,21 +48,25 @@ public abstract class NyObjectStack
         * 最大ARRAY_MAX個の動的割り当てバッファを準備する。\r
         * \r
         * @param i_array\r
+        * @param i_element_type\r
+        * JavaのGenedicsの制限突破\r
         */\r
-       protected NyObjectStack(Object[] i_array)\r
+       @SuppressWarnings("unchecked")\r
+       protected NyObjectStack(int i_length,Class<T> i_element_type)\r
        {\r
                // ポインタだけははじめに確保しておく\r
-               this._items = i_array;\r
+               this._items = (T[])Array.newInstance(i_element_type, i_length);\r
                // アロケート済サイズと、使用中個数をリセット\r
                this._allocated_size = 0;\r
                this._length = 0;\r
+               return;\r
        }\r
-\r
+       protected abstract T createElement();\r
        /**\r
         * ポインタを1進めて、その要素を予約し、その要素へのポインタを返します。\r
         * 特定型に依存させるときには、継承したクラスでこの関数をオーバーライドしてください。\r
         */\r
-       public final Object prePush() throws NyARException\r
+       public final T prePush() throws NyARException\r
        {\r
                // 必要に応じてアロケート\r
                if (this._length >= this._allocated_size) {\r
@@ -77,15 +84,15 @@ public abstract class NyObjectStack
                        this._allocated_size = range;\r
                }\r
                // 使用領域を+1して、予約した領域を返す。\r
-               Object ret = this._items[this._length];\r
+               T ret = this._items[this._length];\r
                this._length++;\r
                return ret;\r
        }\r
-       /**\r
+       /** \r
         * 見かけ上の要素数を1減らして、最後尾のアイテムを返します。\r
         * @return\r
         */\r
-       public final Object pop() throws NyARException\r
+       public final T pop() throws NyARException\r
        {\r
                if(this._length<1){\r
                        throw new NyARException();\r
@@ -119,28 +126,36 @@ public abstract class NyObjectStack
                this._length=i_number_of_item;\r
                return;\r
        }\r
-\r
-\r
-\r
        /**\r
-        * この関数を継承先クラスで実装して下さい。\r
+        * 必要に応じて、この関数を継承先クラスで実装して下さい。\r
         * i_bufferの配列の、i_start番目からi_end-1番目までの要素に、オブジェクトを割り当てて下さい。\r
-        * \r
         * @param i_start\r
         * @param i_end\r
         * @param i_buffer\r
-        */\r
-       protected abstract void onReservRequest(int i_start, int i_end, Object[] i_buffer);\r
+        */     \r
+       final protected void onReservRequest(int i_start, int i_end, Object[] i_buffer)\r
+       {\r
+               try {  \r
+                       for (int i = i_start; i < i_end; i++){\r
+                               i_buffer[i] =createElement();\r
+                       }\r
+               } catch(Exception e) {  \r
+                       e.printStackTrace();  \r
+               }\r
+               return;\r
+       }\r
+\r
+\r
        /**\r
         * 配列を返します。\r
         * \r
         * @return\r
         */\r
-       public final Object[] getArray()\r
+       public final T[] getArray()\r
        {\r
                return this._items;\r
        }\r
-       public final Object getItem(int i_index)\r
+       public final T getItem(int i_index)\r
        {\r
                return this._items[i_index];\r
        }\r
index b28064b..e13adf8 100644 (file)
@@ -1,8 +1,10 @@
 package jp.nyatla.utils.j2se;\r
 \r
+import java.awt.Color;\r
 import java.awt.image.*;\r
 import jp.nyatla.nyartoolkit.*;\r
 import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
 import jp.nyatla.nyartoolkit.core.rasterreader.*;\r
 \r
 public class BufferedImageSink extends BufferedImage\r
@@ -11,7 +13,12 @@ public class BufferedImageSink extends BufferedImage
        {\r
                super(i_width,i_height,TYPE_INT_RGB);\r
        }\r
-       public void sinkFromRaster(INyARRgbRaster i_in) throws NyARException\r
+       /**\r
+        * i_inの内容を、このイメージにコピーします。\r
+        * @param i_in\r
+        * @throws NyARException\r
+        */\r
+       public void copyFromRaster(INyARRgbRaster i_in) throws NyARException\r
        {\r
                assert i_in.getSize().isEqualSize(this.getWidth(), this.getHeight());\r
                \r
@@ -27,4 +34,49 @@ public class BufferedImageSink extends BufferedImage
                }\r
                return;\r
        }\r
+       /**\r
+        * BIN_8用\r
+        * @param i_in\r
+        * @throws NyARException\r
+        */\r
+       public void copyFromRaster(INyARRaster i_in) throws NyARException\r
+       {\r
+               assert i_in.getSize().isEqualSize(this.getWidth(), this.getHeight());\r
+               if(i_in.getBufferReader().isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_BIN_8))\r
+               {\r
+                       final int[] buf=(int[])i_in.getBufferReader().getBuffer();\r
+                       final int w=this.getWidth();\r
+                       final int h=this.getHeight();\r
+                       for(int y=h-1;y>=0;y--){\r
+                               for(int x=w-1;x>=0;x--){\r
+                                       this.setRGB(x, y,buf[x+y*w]==0?0:0xffffff);\r
+                               }\r
+                       }\r
+               }\r
+               return;\r
+       }       \r
+       /**\r
+        * i_outへこのイメージを出力します。\r
+        * \r
+        * @param i_out\r
+        * @throws NyARException\r
+        */\r
+       public void copyToRaster(INyARRgbRaster i_out) throws NyARException\r
+       {\r
+               assert i_out.getSize().isEqualSize(this.getWidth(), this.getHeight());\r
+               \r
+               //thisへ転写\r
+               INyARRgbPixelReader reader=i_out.getRgbPixelReader();\r
+               int[] rgb=new int[3];\r
+               for(int y=this.getHeight()-1;y>=0;y--){\r
+                       for(int x=this.getWidth()-1;x>=0;x--){\r
+                               int pix=this.getRGB(x, y);\r
+                               rgb[0]=(pix>>16)&0xff;\r
+                               rgb[1]=(pix>>8)&0xff;\r
+                               rgb[2]=(pix)&0xff;\r
+                               reader.setPixel(x,y,rgb);\r
+                       }\r
+               }\r
+               return;\r
+       }\r
 }\r
index 15b7f76..6979462 100644 (file)
@@ -43,6 +43,8 @@ import jp.nyatla.nyartoolkit.core.rasterreader.*;
 import jp.nyatla.nyartoolkit.core.raster.*;\r
 import jp.nyatla.nyartoolkit.core.types.stack.*;\r
 import jp.nyatla.nyartoolkit.core.labeling.*;\r
+import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabelingImage;\r
+import jp.nyatla.nyartoolkit.core.labeling.artoolkit.NyARLabelingLabel;\r
 \r
 /**\r
  * bitmapとして利用可能なラベリングイメージです。\r
@@ -122,7 +124,7 @@ public class LabelingBufferdImage extends BufferedImage
 \r
        public void drawImage(NyARGrayscaleRaster i_raster) throws NyARException\r
        {\r
-               assert (i_raster.getBufferReader().getBufferType() == INyARBufferReader.BUFFERFORMAT_INT1D_GLAY_8);\r
+               assert (i_raster.getBufferReader().getBufferType() == INyARBufferReader.BUFFERFORMAT_INT1D_GRAY_8);\r
 \r
                int w = this.getWidth();\r
                int h = this.getHeight();\r
@@ -222,7 +224,7 @@ public class LabelingBufferdImage extends BufferedImage
        public void overlayData(NyARIntPointStack i_stack)\r
        {\r
                int count = i_stack.getLength();\r
-               NyARIntPoint2d[] items = (NyARIntPoint2d[])i_stack.getArray();\r
+               NyARIntPoint2d[] items = i_stack.getArray();\r
                Graphics g = this.getGraphics();\r
                for (int i = 0; i < count; i++) {\r
                        int x = items[i].x;\r
@@ -237,7 +239,7 @@ public class LabelingBufferdImage extends BufferedImage
        {\r
                Color[] c=new Color[]{Color.cyan,Color.red,Color.green};\r
                int count = i_stack.getLength();\r
-               NyARIntRect[] items = (NyARIntRect[])i_stack.getArray();\r
+               NyARIntRect[] items = i_stack.getArray();\r
                Graphics g = this.getGraphics();\r
                for (int i = 0; i < count; i++) {\r
                        int x = items[i].x;\r