OSDN Git Service

[backup]NyARToolkit for Java
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Thu, 26 Nov 2009 11:57:48 +0000 (11:57 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Thu, 26 Nov 2009 11:57:48 +0000 (11:57 +0000)
HSVフィルタ追加
ライセンス文追加

src/jp/nyatla/nyartoolkit/core/raster/NyARHsvRaster.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/rasterfilter/INyARRasterFilter.java
src/jp/nyatla/nyartoolkit/core/rasterfilter/NyARRasterFilter_EqualizeHist.java
src/jp/nyatla/nyartoolkit/core/rasterfilter/NyARRasterFilter_GaussianSmooth.java
src/jp/nyatla/nyartoolkit/core/rasterfilter/NyARRasterFilter_Rgb2Hsv.java [new file with mode: 0644]
src/jp/nyatla/nyartoolkit/core/rasterfilter/NyARRasterFilter_Roberts.java
test/jp/nyatla/nyartoolkit/dev/LabelingCamera.java
test/jp/nyatla/nyartoolkit/dev/LabelingTest.java
test/jp/nyatla/nyartoolkit/dev/NyARSquareDetector_Vector.java [new file with mode: 0644]
test/jp/nyatla/nyartoolkit/dev/OptimizeCompareTest.java [moved from test/jp/nyatla/nyartoolkit/dev/OptimizeView.java with 89% similarity]
test/jp/nyatla/nyartoolkit/dev/PattPickupTest.java

diff --git a/src/jp/nyatla/nyartoolkit/core/raster/NyARHsvRaster.java b/src/jp/nyatla/nyartoolkit/core/raster/NyARHsvRaster.java
new file mode 100644 (file)
index 0000000..632b2f8
--- /dev/null
@@ -0,0 +1,53 @@
+/* \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 edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (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 program.  If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.core.raster;\r
+\r
+import jp.nyatla.nyartoolkit.core.rasterreader.INyARBufferReader;\r
+import jp.nyatla.nyartoolkit.core.rasterreader.NyARBufferReader;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+\r
+public final class NyARHsvRaster extends NyARRaster_BasicClass\r
+{\r
+\r
+       protected int[] _ref_buf;\r
+       private INyARBufferReader _buffer_reader;\r
+       \r
+       public NyARHsvRaster(int i_width, int i_height)\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_X7H9S8V8_32);\r
+       }\r
+       public INyARBufferReader getBufferReader()\r
+       {\r
+               return this._buffer_reader;\r
+       }\r
+}\r
index 9d6060f..c2d7900 100644 (file)
@@ -1,12 +1,6 @@
 /* \r
- * PROJECT: NyARToolkit\r
+ * PROJECT: NyARToolkit(Extension)\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 edition ARToolKit class library.\r
  * Copyright (C)2008-2009 Ryo Iizuka\r
  *\r
index bf5e43c..8835041 100644 (file)
@@ -1,3 +1,27 @@
+/* \r
+ * PROJECT: NyARToolkit(Extension)\r
+ * --------------------------------------------------------------------------------\r
+ * The NyARToolkit is Java edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (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 program.  If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
 package jp.nyatla.nyartoolkit.core.rasterfilter;\r
 \r
 import jp.nyatla.nyartoolkit.NyARException;\r
index c3c46c5..c354d79 100644 (file)
@@ -1,3 +1,27 @@
+/* \r
+ * PROJECT: NyARToolkit(Extension)\r
+ * --------------------------------------------------------------------------------\r
+ * The NyARToolkit is Java edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (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 program.  If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
 package jp.nyatla.nyartoolkit.core.rasterfilter;\r
 \r
 import jp.nyatla.nyartoolkit.NyARException;\r
diff --git a/src/jp/nyatla/nyartoolkit/core/rasterfilter/NyARRasterFilter_Rgb2Hsv.java b/src/jp/nyatla/nyartoolkit/core/rasterfilter/NyARRasterFilter_Rgb2Hsv.java
new file mode 100644 (file)
index 0000000..ce3f1c8
--- /dev/null
@@ -0,0 +1,96 @@
+package jp.nyatla.nyartoolkit.core.rasterfilter;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.raster.INyARRaster;\r
+import jp.nyatla.nyartoolkit.core.rasterreader.INyARBufferReader;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntSize;\r
+\r
+/**\r
+ * RGB画像をHSV画像に変換します。\r
+ *\r
+ */\r
+public class NyARRasterFilter_Rgb2Hsv implements INyARRasterFilter\r
+{\r
+       private IdoFilterImpl _dofilterimpl;\r
+       public NyARRasterFilter_Rgb2Hsv(int i_raster_type) throws NyARException\r
+       {\r
+               switch (i_raster_type) {\r
+               case INyARBufferReader.BUFFERFORMAT_BYTE1D_B8G8R8_24:\r
+                       this._dofilterimpl=new IdoFilterImpl_BYTE1D_B8G8R8_24();\r
+                       break;\r
+               case INyARBufferReader.BUFFERFORMAT_BYTE1D_R8G8B8_24:\r
+               default:\r
+                       throw new NyARException();\r
+               }\r
+       }\r
+       public void doFilter(INyARRaster i_input, INyARRaster i_output) throws NyARException\r
+       {\r
+               assert (i_input.getSize().isEqualSize(i_output.getSize()) == true);\r
+               this._dofilterimpl.doFilter(i_input.getBufferReader(),i_output.getBufferReader(),i_input.getSize());\r
+       }\r
+       \r
+       abstract class IdoFilterImpl\r
+       {\r
+               public abstract void doFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size) throws NyARException;\r
+               \r
+       }\r
+       class IdoFilterImpl_BYTE1D_B8G8R8_24 extends IdoFilterImpl\r
+       {\r
+               public void doFilter(INyARBufferReader i_input, INyARBufferReader i_output,NyARIntSize i_size) throws NyARException\r
+               {\r
+                       assert(         i_input.isEqualBufferType(INyARBufferReader.BUFFERFORMAT_INT1D_X7H9S8V8_32));\r
+                       \r
+                       int[] out_buf = (int[]) i_output.getBuffer();\r
+                       byte[] in_buf = (byte[]) i_input.getBuffer();\r
+                       int s;\r
+                       for(int i=i_size.h*i_size.w-1;i>=0;i--)\r
+                       {\r
+                               int r=(in_buf[i*3+2] & 0xff);\r
+                               int g=(in_buf[i*3+1] & 0xff);\r
+                               int b=(in_buf[i*3+0] & 0xff);\r
+                               int cmax,cmin;\r
+                               //最大値と最小値を計算\r
+                               if(r>g){\r
+                                       cmax=r;\r
+                                       cmin=g;\r
+                               }else{\r
+                                       cmax=g;\r
+                                       cmin=r;\r
+                               }\r
+                               if(b>cmax){\r
+                                       cmax=b;\r
+                               }\r
+                               if(b<cmin){\r
+                                       cmin=b;\r
+                               }\r
+                               int h;\r
+                               if(cmax==0) {\r
+                                       s=0;\r
+                                       h=0;\r
+                               }else {\r
+                                       s=(cmax-cmin)*255/cmax;\r
+                                       int cdes=cmax-cmin;\r
+                                       //H成分を計算\r
+                                       if(cdes!=0){\r
+                                               if(cmax==r){\r
+                                                       h=(g-b)*60/cdes;\r
+                                               }else if(cmax==g){\r
+                                                       h=(b-r)*60/cdes+2*60;\r
+                                               }else{\r
+                                                       h=(r-g)*60/cdes+4*60;\r
+                                               }\r
+                                       }else{\r
+                                               h=0;\r
+                                       }\r
+                               }\r
+                               if(h<0)\r
+                               {\r
+                                       h+=360;\r
+                               }\r
+                               //hsv変換(h9s8v8)\r
+                               out_buf[i]=(0x1ff0000&(h<<16))|(0x00ff00&(s<<8))|(cmax&0xff);\r
+                       }\r
+                       return;\r
+               }\r
+       }       \r
+}
\ No newline at end of file
index ba4af81..7db0ea1 100644 (file)
@@ -1,3 +1,27 @@
+/* \r
+ * PROJECT: NyARToolkit(Extension)\r
+ * --------------------------------------------------------------------------------\r
+ * The NyARToolkit is Java edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (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 program.  If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
 package jp.nyatla.nyartoolkit.core.rasterfilter;\r
 \r
 import jp.nyatla.nyartoolkit.NyARException;\r
index 8396b96..3f305aa 100644 (file)
@@ -35,6 +35,7 @@ import jp.nyatla.nyartoolkit.core2.rasterfilter.gs2bin.*;
 import jp.nyatla.nyartoolkit.core2.rasterfilter.rgb2gs.NyARRasterFilter_RgbAve;
 import jp.nyatla.utils.NyObjectStack;
 import jp.nyatla.utils.j2se.LabelingBufferdImage;
+import jp.nyatla.nyartoolkit.core.rasterfilter.bin.INyARRasterFilter_RgbToGs;
 import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;
 import jp.nyatla.nyartoolkit.core.squaredetect.INyARSquareDetector;
 import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;
index b91dca2..a945957 100644 (file)
@@ -4,7 +4,6 @@
  */\r
 package jp.nyatla.nyartoolkit.dev;\r
 \r
-import java.awt.Frame;\r
 import java.awt.*;\r
 import java.awt.event.WindowAdapter;\r
 import java.awt.event.WindowEvent;\r
@@ -14,7 +13,8 @@ import java.io.FileInputStream;
 import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.raster.*;\r
 import jp.nyatla.nyartoolkit.core.raster.rgb.NyARRgbRaster_BGRA;\r
-import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.gs2bin.*;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.NyARRasterFilterBuilder_RgbToBin;\r
 \r
 \r
 import jp.nyatla.utils.j2se.*;\r
@@ -33,7 +33,7 @@ public class LabelingTest extends Frame
                fs.read(buf);\r
                NyARRgbRaster_BGRA ra = NyARRgbRaster_BGRA.wrap(buf, W, H);\r
                // 二値化\r
-               NyARRasterFilter_ARToolkitThreshold filter = new NyARRasterFilter_ARToolkitThreshold(110, ra.getBufferReader().getBufferType());\r
+               NyARRasterFilterBuilder_RgbToBin filter = new NyARRasterFilterBuilder_RgbToBin(110, ra.getBufferReader().getBufferType());\r
                NyARBinRaster bin = new NyARBinRaster(W,240);\r
                filter.doFilter(ra, bin);\r
                int[] t = (int[]) bin.getBufferReader().getBuffer();\r
diff --git a/test/jp/nyatla/nyartoolkit/dev/NyARSquareDetector_Vector.java b/test/jp/nyatla/nyartoolkit/dev/NyARSquareDetector_Vector.java
new file mode 100644 (file)
index 0000000..8c6da74
--- /dev/null
@@ -0,0 +1,358 @@
+/* \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 edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (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 program.  If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.dev;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.labeling.LabelOverlapChecker;\r
+import jp.nyatla.nyartoolkit.core.labeling.rlelabeling.*;\r
+import jp.nyatla.nyartoolkit.core.param.NyARCameraDistortionFactor;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.Coord2SquareVertexIndexes;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;\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.raster.*;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.*;\r
+import jp.nyatla.nyartoolkit.core.param.*;\r
+\r
+\r
+\r
+/**\r
+ * \r
+ *\r
+ */\r
+public class NyARSquareDetector_Vector\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
+       private final int[] _xcoord;\r
+       private final int[] _ycoord;\r
+\r
+       private final NyARLabeling_Rle _labeling;\r
+\r
+       private final LabelOverlapChecker<RleLabelFragmentInfoStack.RleLabelFragmentInfo> _overlap_checker = new LabelOverlapChecker<RleLabelFragmentInfoStack.RleLabelFragmentInfo>(32,RleLabelFragmentInfoStack.RleLabelFragmentInfo.class);\r
+       private final SquareContourDetector_Vector _sqconvertor;\r
+       private final ContourPickup _cpickup=new ContourPickup();\r
+       private final RleLabelFragmentInfoStack _stack;\r
+       \r
+       private final int _max_coord;\r
+       /**\r
+        * 最大i_squre_max個のマーカーを検出するクラスを作成する。\r
+        * \r
+        * @param i_param\r
+        */\r
+       public NyARSquareDetector_Vector(NyARCameraDistortionFactor i_dist_factor_ref,NyARIntSize i_size) throws NyARException\r
+       {\r
+               this._width = i_size.w;\r
+               this._height = i_size.h;\r
+               //ラベリングのサイズを指定したいときはsetAreaRangeを使ってね。\r
+               this._labeling = new NyARLabeling_Rle(this._width,this._height);\r
+               this._labeling.setAreaRange(AR_AREA_MAX, AR_AREA_MIN);\r
+               this._sqconvertor=new SquareContourDetector_Vector(i_size,i_dist_factor_ref);\r
+               this._stack=new RleLabelFragmentInfoStack(i_size.w*i_size.h*2048/(320*240)+32);//検出可能な最大ラベル数\r
+               \r
+\r
+               // 輪郭の最大長は画面に映りうる最大の長方形サイズ。\r
+               int number_of_coord = (this._width + this._height) * 2;\r
+\r
+               // 輪郭バッファ\r
+               this._max_coord = number_of_coord;\r
+               this._xcoord = new int[number_of_coord];\r
+               this._ycoord = new int[number_of_coord];\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(NyARGrayscaleRaster i_gs,int i_th,NyARSquareStack o_square_stack) throws NyARException\r
+       {\r
+               final RleLabelFragmentInfoStack flagment=this._stack;\r
+               final LabelOverlapChecker<RleLabelFragmentInfoStack.RleLabelFragmentInfo> overlap = this._overlap_checker;\r
+\r
+               // マーカーホルダをリセット\r
+               o_square_stack.clear();\r
+\r
+               // ラベル数が0ならここまで\r
+               final int label_num=this._labeling.labeling(i_gs,i_th, 0, i_gs.getHeight(), flagment);\r
+               if (label_num < 1) {\r
+                       return;\r
+               }\r
+               //ラベルをソートしておく\r
+               flagment.sortByArea();\r
+               //ラベルリストを取得\r
+               RleLabelFragmentInfoStack.RleLabelFragmentInfo[] labels=flagment.getArray();\r
+\r
+               final int xsize = this._width;\r
+               final int ysize = this._height;\r
+               final int coord_max = this._max_coord;\r
+               int[] xcoord = this._xcoord;\r
+               int[] ycoord = this._ycoord;\r
+\r
+\r
+               //重なりチェッカの最大数を設定\r
+               overlap.setMaxLabels(label_num);\r
+\r
+               for (int i=0; i < label_num; i++) {\r
+                       final RleLabelFragmentInfoStack.RleLabelFragmentInfo label_pt=labels[i];\r
+                       final int label_area = label_pt.area;\r
+               \r
+                       // クリップ領域が画面の枠に接していれば除外\r
+                       if (label_pt.clip_l == 0 || label_pt.clip_r == xsize-1){\r
+                               continue;\r
+                       }\r
+                       if (label_pt.clip_t == 0 || label_pt.clip_b == ysize-1){\r
+                               continue;\r
+                       }\r
+                       // 既に検出された矩形との重なりを確認\r
+                       if (!overlap.check(label_pt)) {\r
+                               // 重なっているようだ。\r
+                               continue;\r
+                       }\r
+                       \r
+                       // 輪郭を取得\r
+                       final int coord_num = _cpickup.getContour(i_gs,i_th,label_pt.entry_x,label_pt.clip_t, coord_max, xcoord, ycoord);\r
+                       if (coord_num == coord_max) {\r
+                               // 輪郭が大きすぎる。\r
+                               continue;\r
+                       }\r
+\r
+                       //ここから先が輪郭分析\r
+                       NyARSquare square_ptr = o_square_stack.prePush();\r
+                       if(!this._sqconvertor.coordToSquare(i_gs,xcoord,ycoord,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
+        * デバック用API\r
+        * @return\r
+        */\r
+       public RleLabelFragmentInfoStack _getFragmentStack()\r
+       {\r
+               return this._stack;\r
+       }\r
+       /********************************************************************************\r
+        * \r
+        * 追加クラス \r
+        * \r
+        ********************************************************************************/\r
+       private class SquareContourDetector_Vector\r
+       {\r
+               private final NyARObserv2IdealMap2 _distmap;\r
+               private final int[] __detectMarker_mkvertex = new int[4];\r
+               private final Coord2SquareVertexIndexes _coord2vertex=new Coord2SquareVertexIndexes();\r
+               public SquareContourDetector_Vector(NyARIntSize i_size,NyARCameraDistortionFactor i_distfactor_ref)\r
+               {\r
+                       this._distmap=new NyARObserv2IdealMap2(i_distfactor_ref,i_size);\r
+                       return;\r
+               }\r
+\r
+               public boolean coordToSquare(NyARGrayscaleRaster i_raster,int[] i_xcoord,int[] i_ycoord,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 (!this._coord2vertex.getVertexIndexes(i_xcoord, i_ycoord,i_coord_num, i_label_area, mkvertex)) {\r
+                               // 頂点の取得が出来なかったので破棄\r
+                               return false;\r
+                       }               \r
+                       // マーカーを検出\r
+                       if (!getSquareLine(i_raster,mkvertex, i_xcoord, i_ycoord,i_coord_num, o_square)){\r
+                               // 矩形が成立しなかった。\r
+                               return false;\r
+                       }\r
+                       return true;\r
+               }\r
+               /**\r
+                * 指定した範囲の輪郭点ベクトル・座標を、加算する。\r
+                * @param i_raster\r
+                * @param i_xcoord\r
+                * @param i_ycoord\r
+                * @param i_st\r
+                * @param i_ed\r
+                * @param o_vecsum\r
+                * @param o_possum\r
+                * @return\r
+                */\r
+               private boolean addCoordVecPos(NyARGrayscaleRaster i_raster,int[] i_xcoord, int[] i_ycoord,int i_st,int i_ed,NyARIntPoint2d io_vecsum)\r
+               {\r
+                       int dxi,dyi;\r
+                       //ベクトル分析\r
+                       dxi=io_vecsum.x;\r
+                       dyi=io_vecsum.y;\r
+                       for(int i=i_st;i<i_ed;i++){\r
+                               //境界に設置していたら失敗する。\r
+                               if(i_xcoord[i]<1 || i_ycoord[i]<1 || i_xcoord[i]>=319 || i_ycoord[i]>=239){\r
+                                       return false;\r
+                               }\r
+                               //o_vecsumをワークに流用\r
+                               i_raster.getPixelVector8(i_xcoord[i],i_ycoord[i],io_vecsum);\r
+                               dxi+=io_vecsum.x;\r
+                               dyi-=io_vecsum.y;\r
+                       }\r
+                       io_vecsum.x=dxi;\r
+                       io_vecsum.y=dyi;\r
+                       return true;            \r
+               }\r
+               \r
+               \r
+               private NyARDoublePoint2d __work_pos=new NyARDoublePoint2d();\r
+               \r
+               private boolean getSquareLine(NyARGrayscaleRaster i_raster,int[] i_mkvertex, int[] i_xcoord, int[] i_ycoord,int i_cood_num, NyARSquare o_square) throws NyARException\r
+               {\r
+                       final NyARLinear[] l_line = o_square.line;\r
+                       final NyARDoublePoint2d[] l_sqvertex = o_square.sqvertex;\r
+                       final NyARIntPoint2d[] l_imvertex = o_square.imvertex;\r
+                       final NyARDoublePoint2d idealcenter=this.__work_pos;\r
+               \r
+                       NyARIntPoint2d vecsum=new NyARIntPoint2d();\r
+                       for (int i = 0; i < 4; i++){\r
+                               //頂点を取得\r
+                               int ver1=i_mkvertex[i];\r
+                               int ver2=i_mkvertex[(i+1)%4];\r
+\r
+                               int n,st,ed;\r
+                               double w1;\r
+                               //探索区間の決定\r
+                               if(ver2>=i_mkvertex[i]){\r
+                                       //頂点[i]から頂点[i+1]までの輪郭が、1区間にあるとき\r
+                                       w1 = (double) (ver2 - ver1 + 1) * 0.05 + 0.5;\r
+                                       //探索区間の決定\r
+                                       st = (int) (ver1+w1);\r
+                                       ed = (int) (ver2 - w1);\r
+                               }else{\r
+                                       //頂点[i]から頂点[i+1]までの輪郭が、2区間に分かれているとき\r
+                                       w1 = (double) (ver2+i_cood_num-ver1+1)%i_cood_num * 0.05 + 0.5;\r
+                                       //探索区間の決定\r
+                                       st = (int) (ver1+w1)%i_cood_num;\r
+                                       ed = (int) (ver2+i_cood_num-w1)%i_cood_num;\r
+                               }\r
+                               vecsum.x=vecsum.y=0;\r
+                               //ベクトル分析\r
+                               if(st<=ed){\r
+                                       //1区間\r
+                                       n = ed - st+1;\r
+                                       addCoordVecPos(i_raster,i_xcoord,i_ycoord,st,ed+1,vecsum);\r
+                                       this._distmap.getIdealCoodCenter(i_xcoord, i_ycoord,st,n,idealcenter);\r
+                               }else{\r
+                                       //探索区間は2区間\r
+                                       double cx,cy;\r
+                                       n=ed+i_cood_num-st+1;\r
+                                       addCoordVecPos(i_raster,i_xcoord,i_ycoord,st,i_cood_num,vecsum);\r
+                                       addCoordVecPos(i_raster,i_xcoord,i_ycoord,0,ed,vecsum);\r
+                                       //輪郭の中心位置を計算\r
+                                       this._distmap.getIdealCoodCenter(i_xcoord, i_ycoord,st,i_cood_num-st,idealcenter);\r
+                                       cx=idealcenter.x;\r
+                                       cy=idealcenter.y;\r
+                                       this._distmap.getIdealCoodCenter(i_xcoord, i_ycoord,0,ed+1,idealcenter);\r
+                                       idealcenter.x=(idealcenter.x+cx)/2;\r
+                                       idealcenter.y=(idealcenter.y+cy)/2;\r
+                               }\r
+                               //中央値を歪修正(ほんとはピクセル単位にゆがみ矯正するべきだと思う)\r
+                               \r
+                               double l=Math.sqrt((double)(vecsum.x*vecsum.x+vecsum.y*vecsum.y));\r
+                               final NyARLinear l_line_i = l_line[i];\r
+                               //直交するベクトルを計算\r
+                               l_line_i.dy =  vecsum.x/l;\r
+                               l_line_i.dx =  -vecsum.y/l;\r
+                               //cを計算\r
+                               l_line_i.c  = -(l_line_i.dy * (idealcenter.x) + l_line_i.dx * (idealcenter.y));\r
+                               \r
+                               // 頂点インデクスから頂点座標を得て保存\r
+                               l_imvertex[i].x = i_xcoord[ver1];\r
+                               l_imvertex[i].y = i_ycoord[ver1];\r
+                       }\r
+                       //線分式から頂点を計算\r
+                       for(int i=0;i<4;i++)\r
+                       {\r
+                               if(!NyARLinear.crossPos(l_line[i],l_line[(i + 3) % 4],l_sqvertex[i])){\r
+                                       return false;\r
+                               }\r
+                       }               \r
+                       return true;\r
+               }\r
+       }\r
+\r
+       /**\r
+        * 輪郭線の中心位置を計算する関数を追加したマップクラス\r
+        */\r
+       private class NyARObserv2IdealMap2 extends NyARObserv2IdealMap\r
+       {\r
+               public NyARObserv2IdealMap2(NyARCameraDistortionFactor i_distfactor,NyARIntSize i_screen_size)\r
+               {\r
+                       super(i_distfactor,i_screen_size);\r
+               }\r
+               /**\r
+                * 歪み矯正した座標における、各座標の合計値を\r
+                * @param i_x_coord\r
+                * @param i_y_coord\r
+                * @param i_start\r
+                * @param i_num\r
+                * @param o_center\r
+                */\r
+               public void getIdealCoodCenter(int[] i_x_coord, int[] i_y_coord,int i_start, int i_num,NyARDoublePoint2d o_center)\r
+               {\r
+                       int idx;\r
+                       double x,y;\r
+                       x=y=0;\r
+                       final double[] mapx=this._mapx;\r
+                       final double[] mapy=this._mapy;\r
+                       final int stride=this._stride;\r
+                       for (int j = 0; j < i_num; j++){\r
+                               idx=i_x_coord[i_start + j]+i_y_coord[i_start + j]*stride;\r
+                               x+=mapx[idx];\r
+                               y+=mapy[idx];\r
+                       }\r
+                       o_center.x=x/(double)i_num;\r
+                       o_center.y=y/(double)i_num;\r
+                       return;\r
+               }\r
+       }       \r
+}\r
+\r
+\r
+\r
@@ -38,15 +38,20 @@ import jp.nyatla.nyartoolkit.core.transmat.*;
 import jp.nyatla.nyartoolkit.detector.*;\r
 import jp.nyatla.nyartoolkit.jmf.utils.*;\r
 import jp.nyatla.nyartoolkit.jogl.utils.*;\r
+/**\r
+ * 2種類の最適化アルゴリズムを比較するテストプログラム\r
+ *\r
+ */\r
+\r
 class Program implements JmfCaptureListener\r
 {\r
-       private OptimizeView _view1;\r
-       private OptimizeView _view2;\r
+       private OptimizeCompareTest _view1;\r
+       private OptimizeCompareTest _view2;\r
        public Object _sync_object=new Object();        \r
        public NyARParam _ar_param;\r
        public NyARCode _ar_code;\r
-       private final static int SCREEN_X = 640;\r
-       private final static int SCREEN_Y = 480;\r
+       private final static int SCREEN_X = 320;\r
+       private final static int SCREEN_Y = 240;\r
        private JmfCaptureDevice _capture;\r
        public GLNyARRaster_RGB _cap_image;\r
        public Program(NyARParam i_param, NyARCode i_ar_code) throws NyARException\r
@@ -62,8 +67,8 @@ class Program implements JmfCaptureListener
                this._capture.setOnCapture(this);\r
                // GL対応のRGBラスタオブジェクト\r
                this._cap_image = new GLNyARRaster_RGB(i_param, this._capture.getCaptureFormat());      \r
-               this._view1=new OptimizeView(this,NyARSingleDetectMarker.PF_NYARTOOLKIT);\r
-               this._view2=new OptimizeView(this,NyARSingleDetectMarker.PF_NYARTOOLKIT_ARTOOLKIT_FITTING);\r
+               this._view1=new OptimizeCompareTest(this,NyARSingleDetectMarker.PF_NYARTOOLKIT);\r
+               this._view2=new OptimizeCompareTest(this,NyARSingleDetectMarker.PF_NYARTOOLKIT_ARTOOLKIT_FITTING);\r
                this._capture.start();\r
                return;\r
        }\r
@@ -125,11 +130,11 @@ class Program implements JmfCaptureListener
  * simpleLiteと同じようなテストプログラム 出来る限りARToolKitのサンプルと似せて作ってあります。 最も一致する"Hiro"マーカーを一つ選択して、その上に立方体を表示します。\r
  * \r
  */\r
-public class OptimizeView implements GLEventListener\r
+public class OptimizeCompareTest implements GLEventListener\r
 {\r
-       private final static int SCREEN_X = 640;\r
+       private final static int SCREEN_X = 320;\r
 \r
-       private final static int SCREEN_Y = 480;\r
+       private final static int SCREEN_Y = 240;\r
 \r
        private Animator _animator;\r
        \r
@@ -148,7 +153,7 @@ public class OptimizeView implements GLEventListener
        private double[] _camera_projection = new double[16];\r
 \r
 \r
-       public OptimizeView(Program i_program,int i_pf) throws NyARException\r
+       public OptimizeCompareTest(Program i_program,int i_pf) throws NyARException\r
        {\r
                this._parent=i_program;\r
                this._ar_param = i_program._ar_param;\r
@@ -157,7 +162,7 @@ public class OptimizeView implements GLEventListener
 \r
                // NyARToolkitの準備\r
                this._nya = new NyARSingleDetectMarker(this._ar_param, i_program._ar_code, 80.0,i_program._cap_image.getBufferReader().getBufferType(),i_pf);\r
-               this._nya.setContinueMode(false);// ここをtrueにすると、transMatContinueモード(History計算)になります。\r
+               this._nya.setContinueMode(true);// ここをtrueにすると、transMatContinueモード(History計算)になります。\r
                \r
                // 3Dを描画するコンポーネント\r
                GLCanvas canvas = new GLCanvas();\r
index 100f07b..7fcd460 100644 (file)
@@ -27,7 +27,8 @@ import jp.nyatla.nyartoolkit.core.pickup.*;
 import jp.nyatla.nyartoolkit.core.raster.*;\r
 import jp.nyatla.nyartoolkit.core.types.*;\r
 import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
-import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.gs2bin.*;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.NyARRasterFilterBuilder_RgbToBin;\r
 import jp.nyatla.utils.j2se.*;\r
 import jp.nyatla.nyartoolkit.nyidmarker.*;\r
 import jp.nyatla.nyartoolkit.core.squaredetect.*;\r
@@ -111,7 +112,7 @@ public class PattPickupTest extends Frame implements JmfCaptureListener
 \r
                        {// ピックアップ画像の表示\r
                                // 矩形抽出\r
-                               INyARRasterFilter_RgbToBin to_binfilter = new NyARRasterFilter_ARToolkitThreshold(110, i_raster.getBufferReader().getBufferType());\r
+                               INyARRasterFilter_Bin to_binfilter = new NyARRasterFilterBuilder_RgbToBin(110, i_raster.getBufferReader().getBufferType());\r
                                to_binfilter.doFilter(i_raster, this._bin_raster);\r
                                if (this.detect.detectMarkerLite(i_raster, 100)) {\r
 \r