OSDN Git Service

[更新]NyARToolkit/nyatlaブランチ
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Sun, 14 Sep 2008 03:47:42 +0000 (03:47 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Sun, 14 Sep 2008 03:47:42 +0000 (03:47 +0000)
src/jp/nyatla/nyartoolkit/core/transmat/optimize/INyARRotTransOptimize.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core2/temp/NyARLabeling_ARToolKit_X2.java [new file with mode: 0644]

diff --git a/src/jp/nyatla/nyartoolkit/core/transmat/optimize/INyARRotTransOptimize.java b/src/jp/nyatla/nyartoolkit/core/transmat/optimize/INyARRotTransOptimize.java
new file mode 100644 (file)
index 0000000..879b9a7
--- /dev/null
@@ -0,0 +1,43 @@
+/* \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.transmat.optimize;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.transmat.fitveccalc.NyARFitVecCalculator;\r
+import jp.nyatla.nyartoolkit.core.transmat.rotmatrix.NyARRotMatrix;\r
+import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint3d;\r
+\r
+public interface INyARRotTransOptimize\r
+{\r
+       public double optimize(NyARRotMatrix io_rotmat,NyARDoublePoint3d io_transvec,NyARFitVecCalculator i_calculator) throws NyARException;\r
+\r
+}\r
diff --git a/src/jp/nyatla/nyartoolkit/core2/temp/NyARLabeling_ARToolKit_X2.java b/src/jp/nyatla/nyartoolkit/core2/temp/NyARLabeling_ARToolKit_X2.java
new file mode 100644 (file)
index 0000000..775a43d
--- /dev/null
@@ -0,0 +1,380 @@
+/* \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.core2.temp;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.labeling.*;\r
+\r
+/**\r
+ * NyARLabeling_ARToolKitと同じ処理をするけど、エリア計算にintを使う。 \r
+ * 画面サイズが1600x1600を超えると挙動が怪しくなる。\r
+ * \r
+ */\r
+public class NyARLabeling_ARToolKit_X2 implements INyARLabeling\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
+               for (int i = 0; i < size.w; i++) {\r
+                       img[0][i] = 0;\r
+                       img[size.h - 1][i] = 0;\r
+               }\r
+               for (int i = 0; i < size.h; i++) {\r
+                       img[i][0] = 0;\r
+                       img[i][size.w - 1] = 0;\r
+               }\r
+\r
+               // サイズ(参照値)を保存\r
+               this._dest_size = size;\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
+        * ラスタimageをラベリングして、結果を保存します。 Optimize:STEP[1514->1493]\r
+        * \r
+        * @param i_raster\r
+        * @throws NyARException\r
+        */\r
+       public void labeling(NyARBinRaster i_raster) throws NyARException\r
+       {\r
+               int m, n; /* work */\r
+               int i, j, k;\r
+               INyARLabelingImage out_image = this._out_image;\r
+\r
+               // サイズチェック\r
+               NyARIntSize in_size = i_raster.getSize();\r
+               this._dest_size.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
+               int[][] label_img = (int[][]) out_image.getBufferReader().getBuffer();\r
+\r
+               // 枠作成はインスタンスを作った直後にやってしまう。\r
+\r
+               // ラベリング情報のリセット(ラベリングインデックスを使用)\r
+               out_image.reset(true);\r
+\r
+               int[] label_idxtbl = out_image.getIndexArray();\r
+\r
+               int[] work2_pt;\r
+               int wk_max = 0;\r
+\r
+               int label_pixel;\r
+               int[][] raster_buf = (int[][]) i_raster.getBufferReader().getBuffer();\r
+               int[] line_ptr;\r
+               int[][] work2 = this.work_holder.work2;\r
+               int[] label_img_pt0, label_img_pt1;\r
+               for (j = 1; j < lysize - 1; j++) {// for (int j = 1; j < lysize - 1;j++, pnt += poff*2, pnt2 += 2) {\r
+                       line_ptr = raster_buf[j];\r
+                       label_img_pt0 = label_img[j];\r
+                       label_img_pt1 = label_img[j - 1];\r
+                       for (i = 1; i < lxsize - 1; i++) {// for(int i = 1; i < lxsize-1;i++, pnt+=poff, pnt2++) {\r
+                               // RGBの合計値が閾値より小さいかな?\r
+                               if (line_ptr[i] == 0) {\r
+                                       // pnt1 = ShortPointer.wrap(pnt2, -lxsize);//pnt1 =&(pnt2[-lxsize]);\r
+                                       if (label_img_pt1[i] > 0) {// if( *pnt1 > 0 ) {\r
+                                               label_pixel = label_img_pt1[i];// *pnt2 = *pnt1;\r
+\r
+                                               work2_pt = work2[label_pixel - 1];\r
+                                               work2_pt[0]++;// work2[((*pnt2)-1)*7+0] ++;\r
+                                               work2_pt[1] += i;// work2[((*pnt2)-1)*7+1] += i;\r
+                                               work2_pt[2] += j;// work2[((*pnt2)-1)*7+2] += j;\r
+                                               work2_pt[6] = j;// work2[((*pnt2)-1)*7+6] = j;\r
+                                       } else if (label_img_pt1[i + 1] > 0) {// }else if(*(pnt1+1) > 0 ) {\r
+                                               if (label_img_pt1[i - 1] > 0) {// if( *(pnt1-1) > 0 ) {\r
+                                                       m = label_idxtbl[label_img_pt1[i + 1] - 1];// m =work[*(pnt1+1)-1];\r
+                                                       n = label_idxtbl[label_img_pt1[i - 1] - 1];// n =work[*(pnt1-1)-1];\r
+                                                       if (m > n) {\r
+                                                               label_pixel = n;// *pnt2 = n;\r
+                                                               // wk=IntPointer.wrap(work, 0);//wk =\r
+                                                               // &(work[0]);\r
+                                                               for (k = 0; k < wk_max; k++) {\r
+                                                                       if (label_idxtbl[k] == m) {// if( *wk == m )\r
+                                                                               label_idxtbl[k] = n;// *wk = n;\r
+                                                                       }\r
+                                                               }\r
+                                                       } else if (m < n) {\r
+                                                               label_pixel = m;// *pnt2 = m;\r
+                                                               // wk=IntPointer.wrap(work,0);//wk = &(work[0]);\r
+                                                               for (k = 0; k < wk_max; k++) {\r
+                                                                       if (label_idxtbl[k] == n) {// if( *wk == n ){\r
+                                                                               label_idxtbl[k] = m;// *wk = m;\r
+                                                                       }\r
+                                                               }\r
+                                                       } else {\r
+                                                               label_pixel = m;// *pnt2 = m;\r
+                                                       }\r
+                                                       work2_pt = work2[label_pixel - 1];\r
+                                                       work2_pt[0]++;\r
+                                                       work2_pt[1] += i;\r
+                                                       work2_pt[2] += j;\r
+                                                       work2_pt[6] = j;\r
+                                               } else if ((label_img_pt0[i - 1]) > 0) {// }else if(*(pnt2-1) > 0) {\r
+                                                       m = label_idxtbl[(label_img_pt1[i + 1]) - 1];// m =work[*(pnt1+1)-1];\r
+                                                       n = label_idxtbl[label_img_pt0[i - 1] - 1];// n =work[*(pnt2-1)-1];\r
+                                                       if (m > n) {\r
+\r
+                                                               label_pixel = n;// *pnt2 = n;\r
+                                                               for (k = 0; k < wk_max; k++) {\r
+                                                                       if (label_idxtbl[k] == m) {// if( *wk == m ){\r
+                                                                               label_idxtbl[k] = n;// *wk = n;\r
+                                                                       }\r
+                                                               }\r
+                                                       } else if (m < n) {\r
+                                                               label_pixel = m;// *pnt2 = m;\r
+                                                               for (k = 0; k < wk_max; k++) {\r
+                                                                       if (label_idxtbl[k] == n) {// if( *wk == n ){\r
+                                                                               label_idxtbl[k] = m;// *wk = m;\r
+                                                                       }\r
+                                                               }\r
+                                                       } else {\r
+                                                               label_pixel = m;// *pnt2 = m;\r
+                                                       }\r
+                                                       work2_pt = work2[label_pixel - 1];\r
+                                                       work2_pt[0]++;// work2[((*pnt2)-1)*7+0] ++;\r
+                                                       work2_pt[1] += i;// work2[((*pnt2)-1)*7+1] += i;\r
+                                                       work2_pt[2] += j;// work2[((*pnt2)-1)*7+2] += j;\r
+                                               } else {\r
+\r
+                                                       label_pixel = label_img_pt1[i + 1];// *pnt2 =\r
+                                                       // *(pnt1+1);\r
+\r
+                                                       work2_pt = work2[label_pixel - 1];\r
+                                                       work2_pt[0]++;// work2[((*pnt2)-1)*7+0] ++;\r
+                                                       work2_pt[1] += i;// work2[((*pnt2)-1)*7+1] += i;\r
+                                                       work2_pt[2] += j;// work2[((*pnt2)-1)*7+2] += j;\r
+                                                       if (work2_pt[3] > i) {// if(\r
+                                                               // work2[((*pnt2)-1)*7+3] >\r
+                                                               // i ){\r
+                                                               work2_pt[3] = i;// work2[((*pnt2)-1)*7+3] = i;\r
+                                                       }\r
+                                                       work2_pt[6] = j;// work2[((*pnt2)-1)*7+6] = j;\r
+                                               }\r
+                                       } else if ((label_img_pt1[i - 1]) > 0) {// }else if(\r
+                                               // *(pnt1-1) > 0 ) {\r
+                                               label_pixel = label_img_pt1[i - 1];// *pnt2 =\r
+                                               // *(pnt1-1);\r
+\r
+                                               work2_pt = work2[label_pixel - 1];\r
+                                               work2_pt[0]++;// work2[((*pnt2)-1)*7+0] ++;\r
+                                               work2_pt[1] += i;// work2[((*pnt2)-1)*7+1] += i;\r
+                                               work2_pt[2] += j;// work2[((*pnt2)-1)*7+2] += j;\r
+                                               if (work2_pt[4] < i) {// if( work2[((*pnt2)-1)*7+4] <i ){\r
+                                                       work2_pt[4] = i;// work2[((*pnt2)-1)*7+4] = i;\r
+                                               }\r
+                                               work2_pt[6] = j;// work2[((*pnt2)-1)*7+6] = j;\r
+                                       } else if (label_img_pt0[i - 1] > 0) {// }else if(*(pnt2-1) > 0) {\r
+                                               label_pixel = label_img_pt0[i - 1];// *pnt2 =*(pnt2-1);\r
+\r
+                                               work2_pt = work2[label_pixel - 1];\r
+                                               work2_pt[0]++;// work2[((*pnt2)-1)*7+0] ++;\r
+                                               work2_pt[1] += i;// work2[((*pnt2)-1)*7+1] += i;\r
+                                               work2_pt[2] += j;// work2[((*pnt2)-1)*7+2] += j;\r
+                                               if (work2_pt[4] < i) {// if( work2[((*pnt2)-1)*7+4] <i ){\r
+                                                       work2_pt[4] = i;// work2[((*pnt2)-1)*7+4] = i;\r
+                                               }\r
+                                       } else {\r
+                                               // 現在地までの領域を予約\r
+                                               this.work_holder.reserv(wk_max);\r
+                                               wk_max++;\r
+                                               label_idxtbl[wk_max - 1] = wk_max;\r
+                                               label_pixel = wk_max;// work[wk_max-1] = *pnt2 = wk_max;\r
+                                               work2_pt = work2[wk_max - 1];\r
+                                               work2_pt[0] = 1;\r
+                                               work2_pt[1] = i;\r
+                                               work2_pt[2] = j;\r
+                                               work2_pt[3] = i;\r
+                                               work2_pt[4] = i;\r
+                                               work2_pt[5] = j;\r
+                                               work2_pt[6] = j;\r
+                                       }\r
+                                       label_img_pt0[i] = label_pixel;\r
+                               } else {\r
+                                       label_img_pt0[i] = 0;// *pnt2 = 0;\r
+                               }\r
+                       }\r
+               }\r
+               // インデックステーブルとラベル数の計算\r
+               int wlabel_num = 1;// *label_num = *wlabel_num = j - 1;\r
+\r
+               for (i = 0; i < wk_max; i++) {// for(int i = 1; i <= wk_max; i++,wk++) {\r
+                       label_idxtbl[i] = (label_idxtbl[i] == i + 1) ? wlabel_num++ : label_idxtbl[label_idxtbl[i] - 1];// *wk=(*wk==i)?j++:work[(*wk)-1];\r
+               }\r
+               wlabel_num -= 1;// *label_num = *wlabel_num = j - 1;\r
+               if (wlabel_num == 0) {// if( *label_num == 0 ) {\r
+                       // 発見数0\r
+                       out_image.getLabelStack().clear();\r
+                       return;\r
+               }\r
+               // ラベルの整理\r
+               updateLabelStackLarge(out_image.getLabelStack(), label_idxtbl, in_size, work2, wk_max, wlabel_num);\r
+\r
+               return;\r
+       }\r
+       private int[][] __updateLabelStackLarge_temp=new int[64][7];/*area,x,y,l,r,t,b*/\r
+\r
+       /* 構造が変わるから、ハイスピード版実装するときに使う。 */\r
+       private void updateLabelStackLarge(NyARLabelingLabelStack i_stack, int[] i_lindex, NyARIntSize i_size, int[][] i_work, int i_work_max, int i_number_of_label) throws NyARException\r
+       {\r
+               //計算用のワークを確保\r
+               int[][] temp=this.__updateLabelStackLarge_temp;\r
+               if(temp.length<i_number_of_label){\r
+                       temp=new int[i_number_of_label+64][7];\r
+                       this.__updateLabelStackLarge_temp=temp;\r
+               }\r
+               \r
+               // ラベルバッファを予約\r
+               i_stack.reserv(i_number_of_label);\r
+               // エリアと重心、クリップ領域を計算\r
+               final NyARLabelingLabel[] labels = i_stack.getArray();\r
+               for (int i = 0; i < i_number_of_label; i++) {\r
+                       final int[] temp_ptr = temp[i];\r
+                       temp_ptr[0]=0;//area\r
+                       temp_ptr[1]=0;//x\r
+                       temp_ptr[2]=0;//y\r
+                       temp_ptr[3]=i_size.w;//l\r
+                       temp_ptr[4]=0;//r\r
+                       temp_ptr[5]=i_size.h;//t\r
+                       temp_ptr[6]=0;//b\r
+               }\r
+               //計算!\r
+\r
+               for (int i = 0; i < i_work_max; i++) {\r
+                       final int temp_ptr[] = temp[i_lindex[i] - 1];\r
+                       final int[] work2_pt = i_work[i];\r
+                       temp_ptr[0] += work2_pt[0];\r
+                       temp_ptr[1] += work2_pt[1];\r
+                       temp_ptr[2] += work2_pt[2];\r
+                       if (temp_ptr[3] > work2_pt[3]) {\r
+                               temp_ptr[3] = work2_pt[3];\r
+                       }\r
+                       if (temp_ptr[4] < work2_pt[4]) {\r
+                               temp_ptr[4] = work2_pt[4];\r
+                       }\r
+                       if (temp_ptr[5] > work2_pt[5]) {\r
+                               temp_ptr[5] = work2_pt[5];\r
+                       }\r
+                       if (temp_ptr[6] < work2_pt[6]) {\r
+                               temp_ptr[6] = work2_pt[6];\r
+                       }\r
+               }\r
+               //ストア\r
+               for (int i = 0; i < i_number_of_label; i++) {// for(int i = 0; i < *label_num; i++ ) {\r
+                       final NyARLabelingLabel label_pt = labels[i];\r
+                       final int temp_ptr[] = temp[i];\r
+                       label_pt.area=temp_ptr[0];                      \r
+                       label_pt.pos_x= (double)temp_ptr[1]/label_pt.area;\r
+                       label_pt.pos_y= (double)temp_ptr[2]/label_pt.area;\r
+                       label_pt.clip_l= temp_ptr[3];\r
+                       label_pt.clip_r= temp_ptr[4];\r
+                       label_pt.clip_t= temp_ptr[5];\r
+                       label_pt.clip_b= temp_ptr[6];\r
+               }\r
+               return;\r
+       }\r
+}\r
+\r
+/**\r
+ * NyARLabeling_O2のworkとwork2を可変長にするためのクラス\r
+ * \r
+ * \r
+ */\r
+final class NyARWorkHolder\r
+{\r
+       private final static int ARRAY_APPEND_STEP = 256;\r
+\r
+       public final int[] work;\r
+\r
+       public final int[][] work2;\r
+\r
+       private int allocate_size;\r
+\r
+       /**\r
+        * 最大i_holder_size個の動的割り当てバッファを準備する。\r
+        * \r
+        * @param i_holder_size\r
+        */\r
+       public NyARWorkHolder(int i_holder_size)\r
+       {\r
+               // ポインタだけははじめに確保しておく\r
+               this.work = new int[i_holder_size];\r
+               this.work2 = new int[i_holder_size][];\r
+               this.allocate_size = 0;\r
+       }\r
+\r
+       /**\r
+        * i_indexで指定した番号までのバッファを準備する。\r
+        * \r
+        * @param i_index\r
+        */\r
+       public final void reserv(int i_index) throws NyARException\r
+       {\r
+               // アロケート済みなら即リターン\r
+               if (this.allocate_size > i_index) {\r
+                       return;\r
+               }\r
+               // 要求されたインデクスは範囲外\r
+               if (i_index >= this.work.length) {\r
+                       throw new NyARException();\r
+               }\r
+               // 追加アロケート範囲を計算\r
+               int range = i_index + ARRAY_APPEND_STEP;\r
+               if (range >= this.work.length) {\r
+                       range = this.work.length;\r
+               }\r
+               // アロケート\r
+               for (int i = this.allocate_size; i < range; i++) {\r
+                       this.work2[i] = new int[8];\r
+               }\r
+               this.allocate_size = range;\r
+       }\r
+}\r