+++ /dev/null
-/* \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
*/\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
+++ /dev/null
-/* \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
--- /dev/null
+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
{\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
* <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
*\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
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
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
//あれ?見つからないよ?\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
* <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
* 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
* @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
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
--- /dev/null
+/* このソースは実験用のソースです。\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
--- /dev/null
+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
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
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
{\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
*/\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
}\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
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
*/\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
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
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
*/\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
* 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
/**\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
/**\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
* 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
--- /dev/null
+/* \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
}\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
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
}\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
*/\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
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
--- /dev/null
+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
--- /dev/null
+/* \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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
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
\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
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
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
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
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
{\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
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
{\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
/**\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
}\r
}\r
/**\r
- * RGBX32bitのヒストグラム計算クラス\r
+ * BYTE1D_B8G8R8X8_32のヒストグラム計算クラス\r
*\r
*/ \r
final class CreateHistgramImpl_BYTE1D_B8G8R8X8_32 implements ICreateHistgramImpl\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 * 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
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
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
{\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
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
{\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
\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
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
}\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
* 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
\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
\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
* 検出する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
* 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
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
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
* @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
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
* @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
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
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
}\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
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
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
} \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
* @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
}\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
} \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
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
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
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
*/\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
*/\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
// [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
}\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
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
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
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
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
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
// [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
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
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
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
--- /dev/null
+/* \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
// 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
\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
* \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
* 最大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
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
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
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
{\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
}\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
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
\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
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
{\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