OSDN Git Service

[backup]
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Mon, 28 Dec 2009 18:58:46 +0000 (18:58 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Mon, 28 Dec 2009 18:58:46 +0000 (18:58 +0000)
+NyObjectStackの仕様変更。メモリを完全事前確保に変更。
+細かいAPI追加
+devにトラッキングの実機エンコードを追加。(予測なし追跡の動作まで確認)

git-svn-id: http://svn.sourceforge.jp/svnroot/nyartoolkit/NyARToolkit@368 7cac0a50-4618-4814-88d0-24b83990f816

30 files changed:
trunk/sample/java3d/.classpath
trunk/sample/jmf/.classpath
trunk/sample/jogl/.classpath
trunk/sample/sandbox/.classpath
trunk/src.utils/jmf/.classpath
trunk/src.utils/jogl/.classpath
trunk/src/jp/nyatla/nyartoolkit/core/labeling/NyARLabelInfoStack.java
trunk/src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabelingImage.java
trunk/src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabelingLabelStack.java
trunk/src/jp/nyatla/nyartoolkit/core/labeling/artoolkit/NyARLabeling_ARToolKit.java
trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/NyARLabeling_Rle.java
trunk/src/jp/nyatla/nyartoolkit/core/labeling/rlelabeling/RleLabelFragmentInfoStack.java
trunk/src/jp/nyatla/nyartoolkit/core/param/NyARPerspectiveProjectionMatrix.java
trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquare.java
trunk/src/jp/nyatla/nyartoolkit/core/squaredetect/NyARSquareStack.java
trunk/src/jp/nyatla/nyartoolkit/core/types/NyARDoublePoint2d.java
trunk/src/jp/nyatla/nyartoolkit/core/types/NyARDoublePoint3d.java
trunk/src/jp/nyatla/nyartoolkit/core/types/stack/NyARIntPointStack.java
trunk/src/jp/nyatla/nyartoolkit/core/types/stack/NyARIntRectStack.java
trunk/src/jp/nyatla/nyartoolkit/core/types/stack/NyObjectStack.java
trunk/src/jp/nyatla/nyartoolkit/core/utils/NyARMath.java [new file with mode: 0644]
trunk/src/jp/nyatla/nyartoolkit/detector/NyARDetectMarker.java
trunk/test/jp/nyatla/nyartoolkit/dev/tracking/IntRectStack.java [new file with mode: 0644]
trunk/test/jp/nyatla/nyartoolkit/dev/tracking/MarkerPositionTable.java [new file with mode: 0644]
trunk/test/jp/nyatla/nyartoolkit/dev/tracking/MarkerTableOperator.java [new file with mode: 0644]
trunk/test/jp/nyatla/nyartoolkit/dev/tracking/MarkerTracking_3dTrans.java [new file with mode: 0644]
trunk/test/jp/nyatla/nyartoolkit/dev/tracking/NextFrameMarkerStack.java [new file with mode: 0644]
trunk/test/jp/nyatla/nyartoolkit/dev/tracking/NyARDataTable.java [new file with mode: 0644]
trunk/test/jp/nyatla/nyartoolkit/dev/tracking/TrTest.java [new file with mode: 0644]
trunk/test/jp/nyatla/nyartoolkit/dev/tracking/TransMat2MarkerRect.java [new file with mode: 0644]

index 0a27af9..14ab415 100644 (file)
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <classpath>\r
-       <classpathentry path="" kind="src"/>\r
-       <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
-       <classpathentry sourcepath="/jmfapp" path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
-       <classpathentry path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/j3dcore.jar" kind="lib"/>\r
-       <classpathentry path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/j3dutils.jar" kind="lib"/>\r
-       <classpathentry path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/vecmath.jar" kind="lib"/>\r
-       <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="/NyARToolkit.utils.jmf" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="/NyARToolkit.utils.java3d" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="" kind="output"/>\r
+       <classpathentry kind="src" path=""/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+       <classpathentry kind="lib" path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/j3dcore.jar"/>\r
+       <classpathentry kind="lib" path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/j3dutils.jar"/>\r
+       <classpathentry kind="lib" path="C:/Program Files/Java/Java3D/1.5.1/lib/ext/vecmath.jar"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jmf"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.java3d"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+       <classpathentry kind="output" path=""/>\r
 </classpath>\r
index 6ba8b00..d869052 100644 (file)
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <classpath>\r
-       <classpathentry path="" kind="src"/>\r
-       <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
-       <classpathentry path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
-       <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="/NyARToolkit.utils.jmf" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="" kind="output"/>\r
+       <classpathentry kind="src" path=""/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jmf"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+       <classpathentry kind="output" path=""/>\r
 </classpath>\r
index 966ee53..d8a287d 100644 (file)
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <classpath>\r
-       <classpathentry path="" kind="src"/>\r
-       <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
-       <classpathentry path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
-       <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="/NyARToolkit.utils.jmf" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="/NyARToolkit.utils.jogl" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="C:/Program Files/Java/jre1.6.0_03/lib/gluegen-rt.jar" kind="lib"/>\r
-       <classpathentry path="C:/Program Files/Java/jre1.6.0_03/lib/jogl.jar" kind="lib"/>\r
-       <classpathentry path="" kind="output"/>\r
+       <classpathentry kind="src" path=""/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jmf"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jogl"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/Java/jre6/lib/ext/gluegen-rt.jar"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/Java/jre6/lib/ext/jogl.jar"/>\r
+       <classpathentry kind="output" path=""/>\r
 </classpath>\r
index 0817e89..f58da4c 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <classpath>\r
-       <classpathentry path="" kind="src"/>\r
-       <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
-       <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="/NyARToolkit.utils.jmf" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="/NyARToolkit.utils.jogl" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
-       <classpathentry path="C:/Program Files/Java/jre1.6.0_03/lib/jogl.jar" kind="lib"/>\r
-       <classpathentry path="bin" kind="output"/>\r
+       <classpathentry kind="src" path=""/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jmf"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jogl"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/Java/jre6/lib/ext/jogl.jar"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+       <classpathentry kind="output" path="bin"/>\r
 </classpath>\r
index 68860c8..01e0575 100644 (file)
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <classpath>\r
-       <classpathentry path="" kind="src"/>\r
-       <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
-       <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
-       <classpathentry path="" kind="output"/>\r
+       <classpathentry kind="src" path=""/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+       <classpathentry kind="output" path=""/>\r
 </classpath>\r
index 2b24071..5345587 100644 (file)
@@ -1,11 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <classpath>\r
-       <classpathentry path="" kind="src"/>\r
-       <classpathentry path="org.eclipse.jdt.launching.JRE_CONTAINER" kind="con"/>\r
-       <classpathentry path="/NyARToolKit" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="/NyARToolkit.utils.jmf" combineaccessrules="false" kind="src"/>\r
-       <classpathentry path="C:/Program Files/JMF2.1.1e/lib/jmf.jar" kind="lib"/>\r
-       <classpathentry path="C:/Program Files/Java/jre1.6.0_03/lib/gluegen-rt.jar" kind="lib"/>\r
-       <classpathentry path="C:/Program Files/Java/jre1.6.0_03/lib/jogl.jar" kind="lib"/>\r
-       <classpathentry path="" kind="output"/>\r
+       <classpathentry kind="src" path=""/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolKit"/>\r
+       <classpathentry combineaccessrules="false" kind="src" path="/NyARToolkit.utils.jmf"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/Java/jre6/lib/ext/gluegen-rt.jar"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/Java/jre6/lib/ext/jogl.jar"/>\r
+       <classpathentry kind="lib" path="C:/Program Files (x86)/JMF2.1.1e/lib/jmf.jar"/>\r
+       <classpathentry kind="output" path=""/>\r
 </classpath>\r
index 347b51e..23833b4 100644 (file)
@@ -31,6 +31,7 @@
 package jp.nyatla.nyartoolkit.core.labeling;\r
 \r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.types.stack.NyObjectStack;\r
 \r
 /**\r
@@ -39,7 +40,7 @@ import jp.nyatla.nyartoolkit.core.types.stack.NyObjectStack;
  */\r
 public abstract class NyARLabelInfoStack<T extends NyARLabelInfo> extends NyObjectStack<T>\r
 {\r
-       public NyARLabelInfoStack(int i_length,Class<T> i_element_type)\r
+       public NyARLabelInfoStack(int i_length,Class<T> i_element_type) throws NyARException\r
        {\r
                super(i_length,i_element_type);\r
        }\r
index 726f79b..7eb2ae3 100644 (file)
@@ -47,7 +47,7 @@ public class NyARLabelingImage extends NyARRaster_BasicClass
        protected NyARLabelingLabelStack _label_list;\r
        protected int[] _index_table;\r
        protected boolean _is_index_table_enable;\r
-       public NyARLabelingImage(int i_width, int i_height)\r
+       public NyARLabelingImage(int i_width, int i_height) throws NyARException\r
        {\r
                super(new NyARIntSize(i_width,i_height));\r
                this._ref_buf =new int[i_height*i_width];\r
index 8405b6a..986669a 100644 (file)
@@ -32,6 +32,7 @@ package jp.nyatla.nyartoolkit.core.labeling.artoolkit;
 \r
 \r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.labeling.*;\r
 \r
 /**\r
@@ -40,7 +41,7 @@ import jp.nyatla.nyartoolkit.core.labeling.*;
  */\r
 public class NyARLabelingLabelStack extends NyARLabelInfoStack<NyARLabelingLabel>\r
 {\r
-       public NyARLabelingLabelStack(int i_max_array_size)\r
+       public NyARLabelingLabelStack(int i_max_array_size) throws NyARException\r
        {\r
                super(i_max_array_size,NyARLabelingLabel.class);\r
        }\r
index c11aa9e..f19d8f6 100644 (file)
@@ -218,7 +218,7 @@ final public class NyARLabeling_ARToolKit
                NyARLabelingLabelStack label_list = o_destination.getLabelStack();\r
 \r
                // ラベルバッファを予約\r
-               label_list.reserv(wlabel_num);\r
+               label_list.init(wlabel_num);\r
 \r
                // エリアと重心、クリップ領域を計算\r
                NyARLabelingLabel label_pt;\r
index da52d43..1a8eb7f 100644 (file)
@@ -42,7 +42,7 @@ class RleInfoStack extends NyObjectStack<RleInfoStack.RleInfo>
                public long pos_x;\r
                public long pos_y;              \r
        }       \r
-       public RleInfoStack(int i_length)\r
+       public RleInfoStack(int i_length) throws NyARException\r
        {\r
                super(i_length, RleInfoStack.RleInfo.class);\r
                return;\r
@@ -86,7 +86,7 @@ public class NyARLabeling_Rle
        private int _max_area;\r
        private int _min_area;\r
 \r
-       public NyARLabeling_Rle(int i_width,int i_height)\r
+       public NyARLabeling_Rle(int i_width,int i_height) throws NyARException\r
        {\r
                this._rlestack=new RleInfoStack(i_width*i_height*2048/(320*240)+32);\r
                this._rle1 = RleElement.createArray(i_width/2+1);\r
@@ -374,7 +374,7 @@ public class NyARLabeling_Rle
                        rle_current = tmp;\r
                }\r
                //対象のラベルだけ転写\r
-               o_stack.reserv(label_count);\r
+               o_stack.init(label_count);\r
                RleLabelFragmentInfoStack.RleLabelFragmentInfo[] o_dest_array=o_stack.getArray();\r
                final int max=this._max_area;\r
                final int min=this._min_area;\r
index c11fbad..46aad1e 100644 (file)
@@ -25,6 +25,7 @@
 package jp.nyatla.nyartoolkit.core.labeling.rlelabeling;\r
 \r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.labeling.NyARLabelInfo;\r
 import jp.nyatla.nyartoolkit.core.labeling.NyARLabelInfoStack;\r
 \r
@@ -37,7 +38,7 @@ public class RleLabelFragmentInfoStack  extends NyARLabelInfoStack<RleLabelFragm
                //int area; // フラグメントラベルの領域数\r
                public int entry_x; // フラグメントラベルの位置\r
        }       \r
-       public RleLabelFragmentInfoStack(int i_length)\r
+       public RleLabelFragmentInfoStack(int i_length) throws NyARException\r
        {\r
                super(i_length, RleLabelFragmentInfoStack.RleLabelFragmentInfo.class);\r
                return;\r
index 90e84f5..9bd8e4b 100644 (file)
@@ -181,11 +181,18 @@ final public class NyARPerspectiveProjectionMatrix extends NyARDoubleMatrix34
         */\r
        public void projectionConvert(NyARDoublePoint3d i_3dvertex,NyARDoublePoint2d o_2d)\r
        {\r
-               o_2d.x=(i_3dvertex.x*this.m00+i_3dvertex.y*this.m01+i_3dvertex.z*this.m02)/i_3dvertex.z;\r
-               o_2d.y=(i_3dvertex.y*this.m11+i_3dvertex.z*this.m12)/i_3dvertex.z;\r
+               double w=i_3dvertex.z*this.m22;\r
+               o_2d.x=(i_3dvertex.x*this.m00+i_3dvertex.y*this.m01+i_3dvertex.z*this.m02)/w;\r
+               o_2d.y=(i_3dvertex.y*this.m11+i_3dvertex.z*this.m12)/w;\r
                return;\r
        }\r
-       \r
+       public void projectionConvert(double i_x,double i_y,double i_z,NyARDoublePoint2d o_2d)\r
+       {\r
+               double w=i_z*this.m22;\r
+               o_2d.x=(i_x*this.m00+i_y*this.m01+i_z*this.m02)/w;\r
+               o_2d.y=(i_y*this.m11+i_z*this.m12)/w;\r
+               return;\r
+       }       \r
        \r
        \r
 }\r
index 4ac2a8a..24da00f 100644 (file)
@@ -42,13 +42,11 @@ public class NyARSquare
 {\r
     public NyARLinear[] line = NyARLinear.createArray(4);\r
     public NyARDoublePoint2d[] sqvertex = NyARDoublePoint2d.createArray(4);\r
-//    public NyARIntPoint2d[] imvertex = NyARIntPoint2d.createArray(4);\r
-    public NyARSquare()\r
+    public void getCenter2d(NyARDoublePoint2d o_out)\r
     {\r
-        for (int i = 0; i < 4; i++)\r
-        {\r
-            this.line[i] = new NyARLinear();\r
-        }\r
+       o_out.x=(this.sqvertex[0].x+this.sqvertex[1].x+this.sqvertex[2].x+this.sqvertex[3].x)/4;\r
+       o_out.y=(this.sqvertex[0].y+this.sqvertex[1].y+this.sqvertex[2].y+this.sqvertex[3].y)/4;\r
+       return;\r
     }\r
 \r
 }
\ No newline at end of file
index c46f527..c831630 100644 (file)
 package jp.nyatla.nyartoolkit.core.squaredetect;\r
 \r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.types.stack.NyObjectStack;\r
 \r
 public class NyARSquareStack extends NyObjectStack<NyARSquare>\r
 {\r
-       public NyARSquareStack(int i_length)\r
+       public NyARSquareStack(int i_length) throws NyARException\r
        {\r
                super(i_length,NyARSquare.class);\r
 \r
index fe7a22d..128e624 100644 (file)
@@ -101,8 +101,12 @@ public class NyARDoublePoint2d
         * 格納値をベクトルとして、距離を返します。\r
         * @return\r
         */\r
-       public double dist()\r
+       public final double dist()\r
        {\r
                return Math.sqrt(this.x*this.x+this.y+this.y);\r
        }\r
+       public final double sqNorm()\r
+       {\r
+               return this.x*this.x+this.y+this.y;\r
+       }\r
 }\r
index 33d4579..950b063 100644 (file)
@@ -56,4 +56,16 @@ public class NyARDoublePoint3d
                this.z=i_in.z;\r
                return;\r
        }\r
+       /**\r
+        * i_pointとのベクトルから距離を計算します。\r
+        * @return\r
+        */\r
+       public double dist(NyARDoublePoint3d i_point)\r
+       {\r
+               double x,y;\r
+               x=this.x-i_point.x;\r
+               y=this.y-i_point.y;\r
+               z=this.z-i_point.z;\r
+               return Math.sqrt(x*x+y*y+z*z);\r
+       }\r
 }\r
index a1f1305..421aeaf 100644 (file)
 package jp.nyatla.nyartoolkit.core.types.stack;\r
 \r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.types.*;\r
 \r
 public class NyARIntPointStack extends NyObjectStack<NyARIntPoint2d>\r
 {\r
-       public NyARIntPointStack(int i_length)\r
+       public NyARIntPointStack(int i_length) throws NyARException\r
        {\r
                super(i_length,NyARIntPoint2d.class);\r
                return;\r
index 4494d0c..db20da2 100644 (file)
 package jp.nyatla.nyartoolkit.core.types.stack;\r
 \r
 \r
+import jp.nyatla.nyartoolkit.NyARException;\r
 import jp.nyatla.nyartoolkit.core.types.NyARIntRect;\r
 \r
 public class NyARIntRectStack extends NyObjectStack<NyARIntRect>\r
 {\r
-       public NyARIntRectStack(int i_length)\r
+       public NyARIntRectStack(int i_length) throws NyARException\r
        {\r
                super(i_length,NyARIntRect.class);\r
        }\r
index c3d8cd8..c42625d 100644 (file)
@@ -30,17 +30,12 @@ import jp.nyatla.nyartoolkit.NyARException;
 \r
 \r
 /**\r
- * ã\82ªã\83³ã\83\87ã\83\9eã\83³ã\83\89å\89²ã\82\8aå½\93ã\81¦ã\82\92ã\81\99ã\82\8bã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88配列。\r
+ * ã\82¹ã\82¿ã\83\83ã\82¯å\9e\8bã\81®å\8f¯å¤\89é\95·配列。\r
  * 配列には実体を格納します。\r
  */\r
 public abstract class NyObjectStack<T>\r
 {\r
-       private final static int ARRAY_APPEND_STEP = 64;\r
-\r
        protected final T[] _items;\r
-\r
-       private int _allocated_size;\r
-\r
        protected int _length;\r
 \r
        /**\r
@@ -51,44 +46,54 @@ public abstract class NyObjectStack<T>
         * JavaのGenedicsの制限突破\r
         */\r
        @SuppressWarnings("unchecked")\r
-       protected NyObjectStack(int i_length,Class<T> i_element_type)\r
+       protected NyObjectStack(int i_length,Class<T> i_element_type) throws NyARException\r
        {\r
-               // ポインタだけははじめに確保しておく\r
+               //領域確保\r
                this._items = (T[])Array.newInstance(i_element_type, i_length);\r
-               // アロケート済サイズと、使用中個数をリセット\r
-               this._allocated_size = 0;\r
+               for (int i =0; i < i_length; i++){\r
+                       this._items[i] =createElement();\r
+               }\r
+               //使用中個数をリセット\r
                this._length = 0;\r
                return;\r
        }\r
        protected abstract T createElement();\r
+       \r
        /**\r
-        * ポインタを1進めて、その要素を予約し、その要素へのポインタを返します。\r
-        * 特定型に依存させるときには、継承したクラスでこの関数をオーバーライドしてください。\r
+        * 新しい領域を予約します。\r
+        * @return\r
+        * 失敗するとnull\r
+        * @throws NyARException\r
         */\r
-       public final T prePush() throws NyARException\r
+       public final T prePush()\r
        {\r
                // 必要に応じてアロケート\r
-               if (this._length >= this._allocated_size) {\r
-                       // 要求されたインデクスは範囲外\r
-                       if (this._length >= this._items.length) {\r
-                               throw new NyARException();\r
-                       }\r
-                       // 追加アロケート範囲を計算\r
-                       int range = this._length + ARRAY_APPEND_STEP;\r
-                       if (range >= this._items.length) {\r
-                               range = this._items.length;\r
-                       }\r
-                       // アロケート\r
-                       this.onReservRequest(this._allocated_size, range, this._items);\r
-                       this._allocated_size = range;\r
+               if (this._length >= this._items.length){\r
+                       return null;\r
                }\r
                // 使用領域を+1して、予約した領域を返す。\r
                T ret = this._items[this._length];\r
                this._length++;\r
                return ret;\r
        }\r
+       /**\r
+        * スタックを初期化します。\r
+        * @param i_reserv_length\r
+        * 使用済みにするサイズ\r
+        * @return\r
+        */\r
+       public final void init(int i_reserv_length) throws NyARException\r
+       {\r
+               // 必要に応じてアロケート\r
+               if (i_reserv_length >= this._items.length){\r
+                       throw new NyARException();\r
+               }\r
+               this._length=i_reserv_length;\r
+       }       \r
+       \r
        /** \r
-        * 見かけ上の要素数を1減らして、最後尾のアイテムを返します。\r
+        * 見かけ上の要素数を1減らして、そのオブジェクトを返します。\r
+        * 返却したオブジェクトの内容は、次回のpushまで有効です。\r
         * @return\r
         */\r
        public final T pop()\r
@@ -101,7 +106,6 @@ public abstract class NyObjectStack<T>
         * 見かけ上の要素数をi_count個減らします。\r
         * @param i_count\r
         * @return\r
-        * NULLを返します。\r
         */\r
        public final void pops(int i_count)\r
        {\r
@@ -109,53 +113,6 @@ public abstract class NyObjectStack<T>
                this._length-=i_count;\r
                return;\r
        }       \r
-       \r
-       /**\r
-        * 0~i_number_of_item-1までの領域を予約します。\r
-        * 予約済の領域よりも小さい場合には、現在の長さを調整します。\r
-        * @param i_number_of_reserv\r
-        */\r
-       final public void reserv(int i_number_of_item) throws NyARException\r
-       {\r
-               // 必要に応じてアロケート\r
-               if (i_number_of_item >= this._allocated_size) {\r
-                       // 要求されたインデクスは範囲外\r
-                       if (i_number_of_item >= this._items.length) {\r
-                               throw new NyARException();\r
-                       }\r
-                       // 追加アロケート範囲を計算\r
-                       int range = i_number_of_item+ARRAY_APPEND_STEP;\r
-                       if (range >= this._items.length) {\r
-                               range = this._items.length;\r
-                       }\r
-                       // アロケート\r
-                       this.onReservRequest(this._allocated_size, range, this._items);\r
-                       this._allocated_size = range;\r
-               }\r
-               //見かけ上の配列サイズを指定\r
-               this._length=i_number_of_item;\r
-               return;\r
-       }\r
-       /**\r
-        * 必要に応じて、この関数を継承先クラスで実装して下さい。\r
-        * i_bufferの配列の、i_start番目からi_end-1番目までの要素に、オブジェクトを割り当てて下さい。\r
-        * @param i_start\r
-        * @param i_end\r
-        * @param 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
diff --git a/trunk/src/jp/nyatla/nyartoolkit/core/utils/NyARMath.java b/trunk/src/jp/nyatla/nyartoolkit/core/utils/NyARMath.java
new file mode 100644 (file)
index 0000000..4a260dd
--- /dev/null
@@ -0,0 +1,42 @@
+package jp.nyatla.nyartoolkit.core.utils;\r
+\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+public class NyARMath\r
+{\r
+       /**\r
+        * p2-p1ベクトルのsquare normを計算する。\r
+        * @param i_p1\r
+        * @param i_p2\r
+        * @return\r
+        */\r
+       public static final double sqNorm(NyARDoublePoint2d i_p1,NyARDoublePoint2d i_p2)\r
+       {\r
+               double x,y;\r
+               x=i_p2.x-i_p1.x;\r
+               y=i_p2.y-i_p1.y;\r
+               return x*x+y*y;\r
+       }\r
+       public static final double sqNorm(double i_p1x,double i_p1y,double i_p2x,double i_p2y)\r
+       {\r
+               double x,y;\r
+               x=i_p2x-i_p1x;\r
+               y=i_p2y-i_p1y;\r
+               return x*x+y*y;\r
+       }\r
+       /**\r
+        * p2-p1ベクトルのsquare normを計算する。\r
+        * @param i_p1\r
+        * @param i_p2\r
+        * @return\r
+        */     \r
+       public static final double sqNorm(NyARDoublePoint3d i_p1,NyARDoublePoint3d i_p2)\r
+       {\r
+               double x,y,z;\r
+               x=i_p2.x-i_p1.x;\r
+               y=i_p2.y-i_p1.y;\r
+               z=i_p2.z-i_p1.z;\r
+               return x*x+y*y+z*z;\r
+       }\r
+\r
+\r
+}\r
index 5acab3d..4aeab43 100644 (file)
@@ -57,7 +57,7 @@ class NyARDetectMarkerResult
 \r
 class NyARDetectMarkerResultStack extends NyObjectStack<NyARDetectMarkerResult>\r
 {\r
-       public NyARDetectMarkerResultStack(int i_length)\r
+       public NyARDetectMarkerResultStack(int i_length) throws NyARException\r
        {\r
                super(i_length,NyARDetectMarkerResult.class);\r
                return;\r
diff --git a/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/IntRectStack.java b/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/IntRectStack.java
new file mode 100644 (file)
index 0000000..216a04d
--- /dev/null
@@ -0,0 +1,19 @@
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.types.stack.NyObjectStack;\r
+\r
+public class IntRectStack extends NyObjectStack<NyARIntRect>\r
+{\r
+       protected NyARIntRect createElement()\r
+       {\r
+               return new NyARIntRect();\r
+       }       \r
+       public IntRectStack(int i_length) throws NyARException\r
+       {\r
+               super(i_length,NyARIntRect.class);\r
+               return;\r
+       }\r
+       \r
+}
\ No newline at end of file
diff --git a/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/MarkerPositionTable.java b/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/MarkerPositionTable.java
new file mode 100644 (file)
index 0000000..5533916
--- /dev/null
@@ -0,0 +1,62 @@
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.transmat.*;\r
+\r
+\r
+\r
+public class MarkerPositionTable extends NyARDataTable<MarkerPositionTable.Item>\r
+{\r
+       public static class Item\r
+       {\r
+               public boolean is_empty=true;\r
+               public NyARDoublePoint3d angle=new NyARDoublePoint3d();\r
+               public NyARDoublePoint3d trans=new NyARDoublePoint3d();\r
+               public NyARRectOffset offset=new NyARRectOffset();\r
+               public int life=0;\r
+               public NyARDoublePoint3d velocity=new NyARDoublePoint3d();\r
+               public NyARDoublePoint3d acceleration=new NyARDoublePoint3d();\r
+               public int sirial;\r
+\r
+       }\r
+       public MarkerPositionTable(int i_size)\r
+       {\r
+               this.initTable(i_size,Item.class);\r
+               this.clear();\r
+               return;\r
+       }\r
+       /**\r
+        * 空のアイテムを1個選択します。\r
+        * @return\r
+        */\r
+       public Item selectEmptyItem()\r
+       {\r
+               for(int i=this._items.length-1;i>=0;i--)\r
+               {\r
+                       if(this._items[i].is_empty){\r
+                               return this._items[i];\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+       protected Item createElement()\r
+       {\r
+               return new Item();\r
+       }\r
+       \r
+       public void clear()\r
+       {\r
+               for(int i=this._items.length-1;i>=0;i--)\r
+               {\r
+                       if(!this._items[i].is_empty){\r
+                               this._items[i].is_empty=true;\r
+                       }else{\r
+                               //nothing.\r
+                       }\r
+               }\r
+       }\r
+       \r
+}\r
+\r
+\r
diff --git a/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/MarkerTableOperator.java b/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/MarkerTableOperator.java
new file mode 100644 (file)
index 0000000..4cc2b0b
--- /dev/null
@@ -0,0 +1,205 @@
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;\r
+import jp.nyatla.nyartoolkit.core.transmat.*;\r
+import jp.nyatla.nyartoolkit.core.param.*;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.utils.NyARMath;\r
+\r
+/**\r
+ * マーカ位置の更新オペレータ。\r
+ * \r
+ *\r
+ */\r
+public class MarkerTableOperator\r
+{\r
+       NyARTransMatResult _tmp_trans_result;\r
+       INyARTransMat _transmat;\r
+       private int _sirial;\r
+       \r
+       public MarkerTableOperator(NyARParam i_ref_param) throws NyARException\r
+       {\r
+               this._transmat=new NyARTransMat(i_ref_param);\r
+               this._tmp_trans_result=new NyARTransMatResult();\r
+               this._sirial=0;\r
+               return;\r
+       }\r
+       /**\r
+        *      o_itemのアイテムを更新します。\r
+        * @param i_pkindex\r
+        * @param i_marker\r
+        */\r
+       public void updateMarker(MarkerPositionTable.Item io_item,NyARSquare i_square) throws NyARException\r
+       {\r
+               NyARTransMatResult trans_result=this._tmp_trans_result;\r
+               this._transmat.transMat(i_square,io_item.offset, trans_result);\r
+               trans_result.getZXYAngle(io_item.angle);\r
+               //位置を計算(ここでEstimate?)\r
+               double x,y,z;\r
+               x=trans_result.m03;\r
+               y=trans_result.m13;\r
+               z=trans_result.m23;\r
+               //速度を計算\r
+/*             double vx,vy,vz;\r
+               vx=x-io_item.trans.x;\r
+               vy=y-io_item.trans.y;\r
+               vz=z-io_item.trans.z;\r
+               //現在の加速度を計算して保存\r
+               io_item.acceleration.x=vx-io_item.velocity.x;\r
+               io_item.acceleration.y=vy-io_item.velocity.y;\r
+               io_item.acceleration.z=vz-io_item.velocity.z;\r
+               //現在の速度を計算して保存\r
+               io_item.velocity.x=vx;\r
+               io_item.velocity.y=vy;\r
+               io_item.velocity.z=vz;          */\r
+               //現在の位置を計算して保存\r
+               io_item.trans.x=x;\r
+               io_item.trans.y=y;\r
+               io_item.trans.z=z;\r
+               io_item.life=0;\r
+//             System.out.println("---");\r
+//             System.out.println(io_item.acceleration.x+","+io_item.acceleration.y+","+io_item.acceleration.z);\r
+//             System.out.println(io_item.velocity.x+","+io_item.velocity.y+","+io_item.velocity.z);\r
+//             System.out.println(io_item.trans.x+","+io_item.trans.y+","+io_item.trans.z);\r
+               return;\r
+       }\r
+       /**\r
+        * 新しいマーカをテーブルに加えます。\r
+        * @param i_table\r
+        * @param i_square\r
+        * @param i_width\r
+        * @return\r
+        * @throws NyARException\r
+        */\r
+       public boolean insertMarker(MarkerPositionTable i_table,NyARSquare i_square,double i_width) throws NyARException\r
+       {\r
+               MarkerPositionTable.Item item=i_table.selectEmptyItem();\r
+               if(item==null){\r
+                       return false;\r
+               }\r
+               NyARTransMatResult trans_result=this._tmp_trans_result;\r
+               item.offset.setSquare(i_width);\r
+               this._transmat.transMat(i_square,item.offset, trans_result);\r
+               trans_result.getZXYAngle(item.angle);\r
+               item.is_empty=false;\r
+               //現在の行列を保存\r
+               item.trans.x=trans_result.m03;\r
+               item.trans.y=trans_result.m13;\r
+               item.trans.z=trans_result.m23;\r
+               item.offset.setSquare(i_width);\r
+               item.life=0;\r
+               item.sirial=this._sirial;\r
+               this._sirial++;\r
+               return true;\r
+       }\r
+       /**\r
+        * 3次元空間の指定点の一番近くにあるアイテムを探します。\r
+        * @param i_table\r
+        * @param i_pos\r
+        * 探索点\r
+        * @param i_limit_max\r
+        * 探索範囲の最大値\r
+        * @return\r
+        */\r
+       public MarkerPositionTable.Item selectNearItem3d(MarkerPositionTable i_table,NyARDoublePoint3d i_pos,double i_limit_max)\r
+       {\r
+               MarkerPositionTable.Item[] items=i_table.selectAllItems();\r
+               double d=Double.MAX_VALUE;\r
+               int index=-1;\r
+               final double limit=3*(i_limit_max*i_limit_max);\r
+               \r
+               for(int i=items.length-1;i>=0;i--)\r
+               {\r
+                       if(items[i].is_empty){\r
+                               continue;\r
+                       }\r
+                       \r
+                       NyARDoublePoint3d trans=items[i].trans;\r
+                       //distの計算\r
+                       double nd=NyARMath.sqNorm(i_pos, trans);\r
+                       if(nd>limit){\r
+                               continue;\r
+                       }\r
+                       if(d>nd){\r
+                               d=nd;\r
+                               index=i;\r
+                       }\r
+               }\r
+               return index==-1?null:items[index];\r
+       }\r
+//     private NyARDoublePoint3d _area_temp=new NyARDoublePoint3d();\r
+       /**\r
+        * 2次元空間の指定点の一番近くにあるアイテムを探します。\r
+        * @param i_table\r
+        * @param i_pos\r
+        * 探索点\r
+        * @param i_limit_max\r
+        * 探索範囲の最大値\r
+        * @return\r
+        *//*\r
+       public MarkerPositionTable.Item selectNearItem2d(MarkerPositionTable i_table,NyARDoublePoint2d i_pos,double i_limit_max,int i_limit_min_life)\r
+       {\r
+               MarkerPositionTable.Item[] items=i_table.selectAllItems();\r
+               \r
+               double d=Double.MAX_VALUE;\r
+               NyARPerspectiveProjectionMatrix prjmat=this._prjmat;\r
+               NyARDoublePoint2d pos2d=this._pos2d_tmp;\r
+               //エリア\r
+               NyARDoublePoint3d area=this._area_temp;\r
+               area.x=area.y=i_limit_max;\r
+               int index=-1;\r
+               for(int i=items.length-1;i>=0;i--)\r
+               {\r
+                       if(items[i].is_empty || items[i].life<i_limit_min_life){\r
+                               continue;\r
+                       }\r
+                       NyARDoublePoint3d trans=items[i].trans;\r
+                       //pos2dに中心座標を計算\r
+                       prjmat.projectionConvert(trans,pos2d);\r
+                       //2点間の距離^2を計算\r
+                       double x,y;\r
+                       x=pos2d.x-i_pos.x;\r
+                       y=pos2d.y-i_pos.y;\r
+                       double nd=(x*x)+(y*y);\r
+                       \r
+                       //有効距離を計算\r
+                       area.z=trans.z;\r
+                       prjmat.projectionConvert(area,pos2d);\r
+                       x=pos2d.x-this._prjmat.m02;\r
+                       y=pos2d.y-this._prjmat.m12;\r
+                       double limit_d=x*x+y*y;\r
+                       \r
+                       //有効範囲内?\r
+                       if(nd>limit_d){\r
+                               continue;\r
+                       }\r
+                       if(d>nd){\r
+                               d=nd;\r
+                               index=i;\r
+                       }\r
+               }\r
+               return index==-1?null:items[index];\r
+       }*/\r
+       \r
+       /**\r
+        * テーブルの全行を1ティック進めます。\r
+        * @param i_table\r
+        */\r
+       public void updateTick(MarkerPositionTable i_table)\r
+       {\r
+               MarkerPositionTable.Item[] items=i_table.selectAllItems();\r
+               for(int i=items.length-1;i>=0;i--)\r
+               {\r
+                       final MarkerPositionTable.Item item=items[i];\r
+                       if(item.is_empty){\r
+                               continue;\r
+                       }\r
+                       if(item.life<10){\r
+                               item.life++;\r
+                               continue;\r
+                       }\r
+                       item.is_empty=true;\r
+               }\r
+       }\r
+}\r
diff --git a/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/MarkerTracking_3dTrans.java b/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/MarkerTracking_3dTrans.java
new file mode 100644 (file)
index 0000000..bf199a0
--- /dev/null
@@ -0,0 +1,329 @@
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.NyARCode;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.Coord2Linear;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.INyARSquareContourDetector;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquare;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.types.matrix.NyARDoubleMatrix33;\r
+import jp.nyatla.nyartoolkit.core.transmat.*;\r
+import jp.nyatla.nyartoolkit.core.utils.NyARMath;\r
+import jp.nyatla.nyartoolkit.core.match.NyARMatchPattDeviationColorData;\r
+import jp.nyatla.nyartoolkit.core.match.NyARMatchPattResult;\r
+import jp.nyatla.nyartoolkit.core.match.NyARMatchPatt_Color_WITHOUT_PCA;\r
+import jp.nyatla.nyartoolkit.core.param.INyARCameraDistortionFactor;\r
+import jp.nyatla.nyartoolkit.core.param.NyARParam;\r
+import jp.nyatla.nyartoolkit.core.param.NyARPerspectiveProjectionMatrix;\r
+import jp.nyatla.nyartoolkit.core.pickup.INyARColorPatt;\r
+import jp.nyatla.nyartoolkit.core.raster.NyARBinRaster;\r
+import jp.nyatla.nyartoolkit.core.raster.rgb.*;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.INyARRasterFilter_RgbToBin;\r
+\r
+\r
+\r
+public class MarkerTracking_3dTrans\r
+{\r
+       /**\r
+        * detectMarkerのコールバック関数\r
+        */\r
+       private class DetectSquareCB implements INyARSquareContourDetector.DetectMarkerCallback\r
+       {\r
+               //公開プロパティ\r
+               public NyARSquare square=new NyARSquare();\r
+               public final MarkerPositionTable table;\r
+               public final MarkerTableOperator table_operator;\r
+               public NextFrameMarkerStack _nextframe;\r
+               private double _marker_width;\r
+               \r
+               //参照インスタンス\r
+               private INyARRgbRaster _ref_raster;\r
+               //所有インスタンス\r
+               private INyARColorPatt _inst_patt;\r
+               private NyARMatchPattDeviationColorData _deviation_data;\r
+               private NyARMatchPatt_Color_WITHOUT_PCA _match_patt;\r
+               private final NyARMatchPattResult __detectMarkerLite_mr=new NyARMatchPattResult();\r
+               private Coord2Linear _coordline;\r
+               \r
+               private NyARPerspectiveProjectionMatrix _prjmat;\r
+               private INyARCameraDistortionFactor _dist;\r
+               public DetectSquareCB(INyARColorPatt i_inst_patt,NyARCode i_ref_code,NyARParam i_param,double i_marker_width) throws NyARException\r
+               {\r
+                       this.table_operator=new MarkerTableOperator(i_param);\r
+                       this.table=new MarkerPositionTable(10);\r
+                       this._nextframe=new NextFrameMarkerStack(10);\r
+                       this._marker_width=i_marker_width;\r
+\r
+                       \r
+                       this._prjmat=i_param.getPerspectiveProjectionMatrix();\r
+                       this._dist=i_param.getDistortionFactor();\r
+                       \r
+                       //\r
+                       this._inst_patt=i_inst_patt;\r
+                       this._deviation_data=new NyARMatchPattDeviationColorData(i_ref_code.getWidth(),i_ref_code.getHeight());\r
+                       this._coordline=new Coord2Linear(i_param.getScreenSize(),i_param.getDistortionFactor());\r
+                       this._match_patt=new NyARMatchPatt_Color_WITHOUT_PCA(i_ref_code);\r
+                       return;\r
+               }\r
+               private NyARIntPoint2d[] __tmp_vertex=NyARIntPoint2d.createArray(4);\r
+               private NyARDoublePoint2d __tmp_point=new NyARDoublePoint2d();\r
+               /**\r
+                * 矩形が見付かるたびに呼び出されます。\r
+                * 発見した矩形のパターンを検査して、方位を考慮した頂点データを確保します。\r
+                */\r
+               public void onSquareDetect(INyARSquareContourDetector i_sender,int[] i_coordx,int[] i_coordy,int i_coor_num,int[] i_vertex_index) throws NyARException\r
+               {\r
+                       //輪郭座標から頂点リストに変換\r
+                       NyARIntPoint2d[] vertex=this.__tmp_vertex;\r
+                       vertex[0].x=i_coordx[i_vertex_index[0]];\r
+                       vertex[0].y=i_coordy[i_vertex_index[0]];\r
+                       vertex[1].x=i_coordx[i_vertex_index[1]];\r
+                       vertex[1].y=i_coordy[i_vertex_index[1]];\r
+                       vertex[2].x=i_coordx[i_vertex_index[2]];\r
+                       vertex[2].y=i_coordy[i_vertex_index[2]];\r
+                       vertex[3].x=i_coordx[i_vertex_index[3]];\r
+                       vertex[3].y=i_coordy[i_vertex_index[3]];\r
+                       \r
+                       //マーカ中心を計算\r
+                       NyARDoublePoint2d new_center=this.__tmp_point;\r
+                       new_center.x=(vertex[0].x+vertex[1].x+vertex[2].x+vertex[3].x)/4;\r
+                       new_center.y=(vertex[0].y+vertex[1].y+vertex[2].y+vertex[3].y)/4;\r
+                       //近所のマーカを探す。[Optimize:重複計算あり]\r
+                       NextFrameMarkerStack.Item near_item=this.getNearItem(new_center);//[Optimize]見つけた矩形はリストから削除すべきだよね。\r
+                       if(near_item==null){\r
+                               //このマーカは未登録\r
+                               NyARMatchPattResult mr=this.__detectMarkerLite_mr;\r
+                               \r
+                               //画像を取得\r
+                               if (!this._inst_patt.pickFromRaster(this._ref_raster,vertex)){\r
+                                       return;\r
+                               }\r
+                               //取得パターンをカラー差分データに変換して評価する。\r
+                               this._deviation_data.setRaster(this._inst_patt);\r
+                               if(!this._match_patt.evaluate(this._deviation_data,mr)){\r
+                                       return;\r
+                               }\r
+                               //現在の一致率より低ければ終了\r
+                               if (0.5 > mr.confidence){\r
+                                       return;\r
+                               }\r
+                               //一致率の高い矩形があれば、方位を考慮して頂点情報を作成\r
+                               NyARSquare sq=this.square;\r
+                               //directionを考慮して、squareを更新する。\r
+                               for(int i=0;i<4;i++){\r
+                                       int idx=(i+4 - mr.direction) % 4;\r
+                                       this._coordline.coord2Line(i_vertex_index[idx],i_vertex_index[(idx+1)%4],i_coordx,i_coordy,i_coor_num,sq.line[i]);\r
+                               }\r
+                               for (int i = 0; i < 4; i++) {\r
+                                       //直線同士の交点計算\r
+                                       if(!NyARLinear.crossPos(sq.line[i],sq.line[(i + 3) % 4],sq.sqvertex[i])){\r
+                                               throw new NyARException();//ここのエラー復帰するならダブルバッファにすればOK\r
+                                       }\r
+                               }\r
+                               System.out.println("D:"+mr.direction);\r
+                               //テーブルにマーカ情報を追加する。\r
+                               this.table_operator.insertMarker(this.table,sq,this._marker_width);                                                     \r
+\r
+                       }else{\r
+                               //このマーカは登録済。\r
+                               MarkerPositionTable.Item item=this.table.selectItem(near_item.oid);\r
+                               //予想基準頂点に一番近い観測頂点インデクスを得る。\r
+                               int dir=getNearVertexIndex(near_item.vertex0,near_item.center,vertex,new_center);\r
+\r
+                               //一致率の高い矩形があれば、方位を考慮して頂点情報を作成\r
+                               NyARSquare sq=this.square;\r
+                               //directionを考慮して、squareを更新する。\r
+                               for(int i=0;i<4;i++){\r
+                                       int idx=(i+dir) % 4;\r
+                                       this._coordline.coord2Line(i_vertex_index[idx],i_vertex_index[(idx+1)%4],i_coordx,i_coordy,i_coor_num,sq.line[i]);\r
+                               }\r
+                               for (int i = 0; i < 4; i++) {\r
+                                       //直線同士の交点計算\r
+                                       if(!NyARLinear.crossPos(sq.line[i],sq.line[(i + 3) % 4],sq.sqvertex[i])){\r
+                                               throw new NyARException();//ここのエラー復帰するならダブルバッファにすればOK\r
+                                       }\r
+                               }\r
+                               this.table_operator.updateMarker(item,sq);\r
+                       }\r
+               }\r
+               private int getNearVertexIndex(NyARDoublePoint2d i_base_vertex,NyARDoublePoint2d i_base_center,NyARIntPoint2d[] i_sq,NyARDoublePoint2d i_sqcenter)\r
+               {\r
+                       double bx,by;\r
+                       //観察座標の中央位置からのベクトル\r
+                       bx=i_base_vertex.x-i_sqcenter.x;\r
+                       by=i_base_vertex.y-i_sqcenter.y;\r
+\r
+                       //一番近い頂点を探す.\r
+                       double d=NyARMath.sqNorm(bx,by,i_sq[3].x-i_sqcenter.x,i_sq[3].y-i_sqcenter.y);\r
+                       int ret=3;\r
+                       for(int i=2;i>=0;i--)\r
+                       {\r
+                               //予測座標の中央位置からのベクトルの長さを計算\r
+                               double d2=NyARMath.sqNorm(bx,by,i_sq[i].x-i_sqcenter.x,i_sq[i].y-i_sqcenter.y);\r
+                               if(d2<d){\r
+                                       d=d2;\r
+                                       ret=i;\r
+                               }\r
+                       }\r
+                       return ret;\r
+               }\r
+               NyARDoubleMatrix33 _rot_temp=new NyARDoubleMatrix33();\r
+               private NyARDoublePoint3d _pos3d_tmp=new NyARDoublePoint3d();\r
+               private NyARDoublePoint3d _area_temp=new NyARDoublePoint3d();\r
+               private NyARDoublePoint2d _pos2d_tmp=new NyARDoublePoint2d();\r
+               \r
+               public final void init(INyARRgbRaster i_raster)\r
+               {                       \r
+                       this._ref_raster=i_raster;\r
+                       //マーカの予測位置を計算しておく\r
+                       NextFrameMarkerStack stack=this._nextframe;\r
+                       NyARDoublePoint2d pos2d=this._pos2d_tmp;\r
+                       NyARDoublePoint3d pos3d=this._pos3d_tmp;\r
+                       \r
+                       NyARPerspectiveProjectionMatrix prjmat=this._prjmat;\r
+                       INyARCameraDistortionFactor dist=this._dist;\r
+                       MarkerPositionTable.Item[] items=this.table.selectAllItems();\r
+\r
+                       NyARDoubleMatrix33 rot=this._rot_temp;\r
+                       \r
+                       NyARDoublePoint3d area=this._area_temp;\r
+                       area.x=area.y=this._marker_width;\r
+                       stack.clear();\r
+                       for(int i=items.length-1;i>=0;i--)\r
+                       {\r
+                               if(items[i].is_empty){\r
+                                       continue;\r
+                               }\r
+                               final NyARDoublePoint3d trans=items[i].trans;\r
+                               //pos2dに中心座標を計算\r
+                               NextFrameMarkerStack.Item item=stack.prePush();\r
+                               item.oid=i;\r
+                               prjmat.projectionConvert(trans,item.center);//[Optimaize!]\r
+                               dist.ideal2Observ(item.center, item.center);\r
+                               //方位決定のためにvertex0の計算[optimize! ここの計算関数すれば早くなる。]\r
+                               final NyARDoublePoint3d offset=items[i].offset.vertex[0];\r
+                               rot.setZXYAngle(items[i].angle);\r
+                               rot.transformVertex(offset,pos3d);\r
+                               prjmat.projectionConvert(trans.x+pos3d.x,trans.y+pos3d.y,trans.z+pos3d.z,item.vertex0);//[Optimaize!]\r
+                               dist.ideal2Observ(item.vertex0, item.vertex0);\r
+                               //探索範囲の計算\r
+                               area.z=trans.z;\r
+                               prjmat.projectionConvert(area,pos2d);//[Optimaize!]\r
+                               dist.ideal2Observ(pos2d,pos2d);\r
+                               item.dist=NyARMath.sqNorm(pos2d.x,pos2d.y,this._prjmat.m02,this._prjmat.m12)/2;\r
+                       }\r
+                       return;\r
+               }\r
+               \r
+               \r
+               \r
+               /**\r
+                * 2次元空間の指定点の一番近くにあるアイテムを探します。\r
+                * @param i_table\r
+                * @param i_pos\r
+                * 探索点\r
+                * @param i_limit_max\r
+                * 探索範囲の最大値\r
+                * @return\r
+                */\r
+               public NextFrameMarkerStack.Item getNearItem(NyARDoublePoint2d i_pos)\r
+               {\r
+                       NextFrameMarkerStack.Item[] items=this._nextframe.getArray();\r
+                       \r
+                       double d=Double.MAX_VALUE;\r
+                       //エリア\r
+                       int index=-1;\r
+                       for(int i=this._nextframe.getLength()-1;i>=0;i--)\r
+                       {\r
+                               NyARDoublePoint2d center=items[i].center;\r
+                               double nd=NyARMath.sqNorm(i_pos, center);\r
+                               //有効範囲内?\r
+                               if(nd>items[i].dist){\r
+                                       continue;\r
+                               }\r
+                               if(d>nd){\r
+                                       d=nd;\r
+                                       index=i;\r
+                               }\r
+                       }\r
+                       return index==-1?null:items[index];\r
+               }               \r
+       }\r
+       private INyARSquareContourDetector _square_detect;\r
+       protected INyARTransMat _transmat;\r
+       //画処理用\r
+       private NyARBinRaster _bin_raster;\r
+       protected INyARRasterFilter_RgbToBin _tobin_filter;\r
+       private DetectSquareCB _detect_cb;\r
+       \r
+       public IntRectStack _next_marker;\r
+       public TransMat2MarkerRect _estimator;\r
+\r
+\r
+       protected MarkerTracking_3dTrans()\r
+       {\r
+               return;\r
+       }\r
+       protected void initInstance(\r
+               INyARColorPatt i_patt_inst,\r
+               INyARSquareContourDetector i_sqdetect_inst,\r
+               INyARTransMat i_transmat_inst,\r
+               INyARRasterFilter_RgbToBin i_filter,\r
+               NyARParam       i_ref_param,\r
+               NyARCode        i_ref_code,\r
+               double          i_marker_width) throws NyARException\r
+       {\r
+               final NyARIntSize scr_size=i_ref_param.getScreenSize();         \r
+               // 解析オブジェクトを作る\r
+               this._square_detect = i_sqdetect_inst;\r
+               this._transmat = i_transmat_inst;\r
+               this._tobin_filter=i_filter;\r
+               // 比較コードを保存\r
+               //2値画像バッファを作る\r
+               this._bin_raster=new NyARBinRaster(scr_size.w,scr_size.h);\r
+               //_detect_cb\r
+               this._detect_cb=new DetectSquareCB(i_patt_inst,i_ref_code,i_ref_param,i_marker_width);\r
+               this._next_marker=new IntRectStack(10);\r
+               this._estimator=new TransMat2MarkerRect(i_ref_param);\r
+               return;\r
+       }\r
+       /**\r
+        * i_imageにマーカー検出処理を実行し、結果を記録します。\r
+        * \r
+        * @param i_raster\r
+        * マーカーを検出するイメージを指定します。イメージサイズは、カメラパラメータ\r
+        * と一致していなければなりません。\r
+        * @return マーカーが検出できたかを真偽値で返します。\r
+        * @throws NyARException\r
+        */\r
+       public int detectMarkerLite(INyARRgbRaster i_raster) throws NyARException\r
+       {\r
+               //サイズチェック\r
+               if(!this._bin_raster.getSize().isEqualSize(i_raster.getSize())){\r
+                       throw new NyARException();\r
+               }\r
+\r
+               //ラスタを2値イメージに変換する.\r
+               this._tobin_filter.doFilter(i_raster,this._bin_raster);\r
+\r
+               //コールバックハンドラの準備\r
+               this._detect_cb.init(i_raster);\r
+               //矩形を探す(戻り値はコールバック関数で受け取る。)\r
+               this._square_detect.detectMarkerCB(this._bin_raster,_detect_cb);\r
+               //時間を進める。\r
+               this._detect_cb.table_operator.updateTick(this._detect_cb.table);\r
+               \r
+               //矩形位置の予想\r
+               this._next_marker.clear();\r
+               this._estimator.convert(this._detect_cb.table.selectAllItems(), this._next_marker);\r
+               return -1;\r
+       }\r
+       public Object[] _probe()\r
+       {\r
+               Object[] ret=new Object[10];\r
+               ret[0]=this._detect_cb.table;\r
+               ret[1]=this._next_marker;\r
+               ret[2]=this._detect_cb._nextframe;\r
+               return ret;\r
+       }\r
+}
\ No newline at end of file
diff --git a/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/NextFrameMarkerStack.java b/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/NextFrameMarkerStack.java
new file mode 100644 (file)
index 0000000..1f19b81
--- /dev/null
@@ -0,0 +1,31 @@
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+import jp.nyatla.nyartoolkit.core.types.stack.NyObjectStack;\r
+\r
+public class NextFrameMarkerStack extends NyObjectStack<NextFrameMarkerStack.Item>\r
+{\r
+       public class Item\r
+       {\r
+               public int oid;\r
+               public NyARDoublePoint2d center=new NyARDoublePoint2d();\r
+               public NyARDoublePoint2d vertex0=new NyARDoublePoint2d();\r
+               /**\r
+                * 探索距離\r
+                */\r
+               public double dist;\r
+               \r
+               \r
+       }\r
+       protected NextFrameMarkerStack.Item createElement()\r
+       {\r
+               return new NextFrameMarkerStack.Item();\r
+       }       \r
+       public NextFrameMarkerStack(int i_length) throws NyARException\r
+       {\r
+               super(i_length,NextFrameMarkerStack.Item.class);\r
+               return;\r
+       }\r
+       \r
+}
\ No newline at end of file
diff --git a/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/NyARDataTable.java b/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/NyARDataTable.java
new file mode 100644 (file)
index 0000000..5e68c24
--- /dev/null
@@ -0,0 +1,30 @@
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import java.lang.reflect.Array;\r
+\r
+public abstract class NyARDataTable<TItem extends Object>\r
+{\r
+       protected TItem[] _items;\r
+       /**\r
+        * アイテムすべてを選択します。\r
+        * @return\r
+        */\r
+       public final TItem[] selectAllItems()\r
+       {\r
+               return this._items;\r
+       }\r
+       public final TItem selectItem(int i_oid)\r
+       {\r
+               return this._items[i_oid];\r
+       }\r
+       @SuppressWarnings("unchecked")\r
+       protected void initTable(int i_size,Class<TItem> i_elemtype)\r
+       {\r
+               this._items=(TItem[])Array.newInstance(i_elemtype, i_size);\r
+               for(int i=0;i<i_size;i++){\r
+                       this._items[i]=createElement();\r
+               }\r
+               return;\r
+       }\r
+       protected abstract TItem createElement();       \r
+}
\ No newline at end of file
diff --git a/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/TrTest.java b/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/TrTest.java
new file mode 100644 (file)
index 0000000..2d54cee
--- /dev/null
@@ -0,0 +1,223 @@
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import java.awt.*;\r
+import java.awt.color.*;\r
+import java.awt.event.*;\r
+import java.awt.image.*;\r
+import java.io.*;\r
+import javax.media.Buffer;\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.NyARCode;\r
+import jp.nyatla.nyartoolkit.core.param.NyARParam;\r
+import jp.nyatla.nyartoolkit.core.pickup.INyARColorPatt;\r
+import jp.nyatla.nyartoolkit.core.pickup.NyARColorPatt_Perspective_O2;\r
+import jp.nyatla.nyartoolkit.core.raster.NyARBinRaster;\r
+import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.INyARSquareContourDetector;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareContourDetector_Rle;\r
+import jp.nyatla.nyartoolkit.core.squaredetect.NyARSquareStack;\r
+import jp.nyatla.nyartoolkit.core.transmat.INyARTransMat;\r
+import jp.nyatla.nyartoolkit.core.transmat.NyARTransMat;\r
+import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureDevice;\r
+import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureDeviceList;\r
+import jp.nyatla.nyartoolkit.jmf.utils.JmfCaptureListener;\r
+import jp.nyatla.nyartoolkit.jogl.utils.GLNyARRaster_RGB;\r
+import jp.nyatla.nyartoolkit.utils.j2se.NyARRasterImageIO;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+\r
+/**\r
+ * @todo\r
+ * 矩形の追跡は動いてるから、位置予測機能と組み合わせて試すこと。\r
+ *\r
+ */\r
+class Tracking extends MarkerTracking_3dTrans\r
+{\r
+       Tracking(NyARParam i_param,NyARCode i_code,double i_marker_width,int i_input_raster_type) throws NyARException\r
+       {\r
+               super();\r
+               initInstance(\r
+                               new NyARColorPatt_Perspective_O2(i_code.getWidth(), i_code.getHeight(),4,25),\r
+                               new NyARSquareContourDetector_Rle(i_param.getDistortionFactor(),i_param.getScreenSize()),\r
+                               new NyARTransMat(i_param),\r
+                               new NyARRasterFilter_ARToolkitThreshold(120,i_input_raster_type),\r
+                               i_param,\r
+                               i_code,\r
+                               i_marker_width);\r
+       }\r
+}\r
+\r
+public class TrTest extends Frame implements JmfCaptureListener,MouseMotionListener\r
+{\r
+\r
+\r
+       private final String PARAM_FILE = "../Data/camera_para.dat";\r
+\r
+       private final static String CARCODE_FILE = "../Data/patt.hiro";\r
+\r
+       private static final long serialVersionUID = -2110888320986446576L;\r
+\r
+       private JmfCaptureDevice _capture;\r
+\r
+       private GLNyARRaster_RGB _capraster;\r
+\r
+       private int W = 320;\r
+\r
+       private int H = 240;\r
+\r
+       private Tracking _tr;\r
+       TransMat2MarkerRect _trm;\r
+\r
+       public TrTest() throws NyARException\r
+       {\r
+               setTitle("JmfCaptureTest");\r
+               Insets ins = this.getInsets();\r
+               this.setSize(1024 + ins.left + ins.right, 768 + ins.top + ins.bottom);\r
+               JmfCaptureDeviceList dl = new JmfCaptureDeviceList();\r
+               this._capture = dl.getDevice(0);\r
+               if (!this._capture.setCaptureFormat(JmfCaptureDevice.PIXEL_FORMAT_RGB, W, H, 30.0f)) {\r
+                       if (!this._capture.setCaptureFormat(JmfCaptureDevice.PIXEL_FORMAT_YUV, W, H, 30.0f)) {\r
+                               throw new NyARException("キャプチャフォーマットが見つかりません。");\r
+                       }\r
+               }\r
+               NyARParam ar_param = new NyARParam();\r
+               ar_param.loadARParamFromFile(PARAM_FILE);\r
+               ar_param.changeScreenSize(W, H);\r
+\r
+               NyARCode code = new NyARCode(16, 16);\r
+               code.loadARPattFromFile(CARCODE_FILE);\r
+               this._capraster = new GLNyARRaster_RGB(ar_param, this._capture.getCaptureFormat());\r
+               this._capture.setOnCapture(this);\r
+\r
+               addMouseMotionListener(this);\r
+               this._tr=new Tracking(ar_param,code,80,this._capraster.getBufferReader().getBufferType());\r
+               this._trm=new TransMat2MarkerRect(ar_param);\r
+               return;\r
+       }\r
+       int mouse_x;\r
+       int mouse_y;\r
+    public void mouseMoved(MouseEvent A00)\r
+    {\r
+        mouse_x = A00.getX();\r
+        mouse_y = A00.getY();\r
+    }\r
+\r
+    public void mouseDragged(MouseEvent A00) {}\r
+\r
+\r
+\r
+       private final String data_file = "../Data/320x240ABGR.raw";\r
+\r
+       \r
+\r
+       public void draw(GLNyARRaster_RGB i_raster)\r
+       {\r
+               try {\r
+                       Insets ins = this.getInsets();\r
+                       Graphics g = getGraphics();\r
+                       this._tr.detectMarkerLite(i_raster);\r
+                       Object[] probe=this._tr._probe();\r
+                       MarkerPositionTable mpt=(MarkerPositionTable)probe[0];\r
+                       NextFrameMarkerStack fs=(NextFrameMarkerStack)probe[2];\r
+                       \r
+                       {// ピックアップ画像の表示\r
+                               // 矩形抽出\r
+//                             INyARRasterFilter_RgbToBin to_binfilter = NyARRasterFilterBuilder_ARToolkitThreshold.createFilter(110, i_raster.getBufferReader().getBufferType());\r
+//                             to_binfilter.doFilter(i_raster, this._bin_raster);\r
+//                             if (this.detect.detectMarkerLite(i_raster, 100)) {\r
+//\r
+//                                     NyARTransMatResult res = new NyARTransMatResult();\r
+//                                     this.detect.getTransmationMatrix(res);\r
+//                             }\r
+                               {// 撮影画像\r
+                                       \r
+//                                     INyARRasterFilter_RgbToBin filter=new NyARRasterFilter_ARToolkitThreshold(110,i_raster.getBufferReader().getBufferType());\r
+//                                     NyARSquareStack stack=new NyARSquareStack(10);\r
+                                       \r
+                                       BufferedImage sink = new BufferedImage(i_raster.getWidth(), i_raster.getHeight(), ColorSpace.TYPE_RGB);\r
+\r
+                                       {//元画像\r
+                                               NyARRasterImageIO.copy(i_raster, sink);\r
+                                               Graphics g2=sink.getGraphics();\r
+                                               g2.setColor(Color.RED);\r
+                                               MarkerPositionTable.Item[] item=mpt.selectAllItems();\r
+                                               for(int i=0;i<item.length;i++){\r
+                                                       if(item[i].is_empty){\r
+                                                               continue;\r
+                                                       }\r
+                                                       NyARIntRect re=new NyARIntRect();\r
+                                                       this._trm.convert(item[i], re);\r
+                                                       g2.drawRect(re.x,re.y,re.w,re.h);\r
+                                                       g2.drawString(Integer.toString(item[i].sirial),re.x,re.y);\r
+                                               }\r
+                                               g2.setColor(Color.CYAN);\r
+                                               for(int i=0;i<fs.getLength();i++){\r
+                                                       g2.drawRect((int)(fs.getItem(i).vertex0.x-1),(int)(fs.getItem(i).vertex0.y-1),2,2);\r
+                                               }\r
+                                               g.drawImage(sink, ins.left, ins.top, this);\r
+                                       }\r
+                               }\r
+\r
+                               {// 信号取得テスト\r
+\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+       }\r
+\r
+       public void onUpdateBuffer(Buffer i_buffer)\r
+       {\r
+               try {\r
+\r
+                       {// ピックアップ画像の表示\r
+                               // 矩形抽出\r
+                               synchronized(this._capraster){\r
+                                       this._capraster.setBuffer(i_buffer);\r
+                                       draw(this._capraster);\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+       }\r
+\r
+       public void startCapture()\r
+       {\r
+               try {\r
+                       this._capture.start();\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+       }\r
+\r
+       public void startImage()\r
+       {\r
+               try {\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() * 4];\r
+                       fs.read(buf);\r
+//                     INyARRgbRaster ra = NyARRgbRaster_BGRA.wrap(buf, W, H);\r
+//                     draw(ra);\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+\r
+       }\r
+\r
+       public static void main(String[] args)\r
+       {\r
+\r
+               try {\r
+                       TrTest mainwin = new TrTest();\r
+                       mainwin.setVisible(true);\r
+                       mainwin.startCapture();\r
+                       // mainwin.startImage();\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/TransMat2MarkerRect.java b/trunk/test/jp/nyatla/nyartoolkit/dev/tracking/TransMat2MarkerRect.java
new file mode 100644 (file)
index 0000000..67f8977
--- /dev/null
@@ -0,0 +1,141 @@
+package jp.nyatla.nyartoolkit.dev.tracking;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.core.param.*;\r
+import jp.nyatla.nyartoolkit.core.param.NyARPerspectiveProjectionMatrix;\r
+import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint2d;\r
+import jp.nyatla.nyartoolkit.core.types.NyARDoublePoint3d;\r
+import jp.nyatla.nyartoolkit.core.types.NyARIntRect;\r
+import jp.nyatla.nyartoolkit.core.types.matrix.NyARDoubleMatrix33;\r
+\r
+/**\r
+ * tableの内容から、矩形集合を計算する。\r
+ *\r
+ */\r
+public class TransMat2MarkerRect\r
+{\r
+       private INyARCameraDistortionFactor _dist;\r
+       private NyARPerspectiveProjectionMatrix _prjmat;\r
+       private NyARDoubleMatrix33 _rot_temp=new NyARDoubleMatrix33();\r
+       private NyARDoublePoint3d _pos_temp=new NyARDoublePoint3d();\r
+       private NyARDoublePoint2d _pos2d_tmp=new NyARDoublePoint2d();\r
+       public TransMat2MarkerRect(NyARParam i_param)\r
+       {\r
+               this._dist=i_param.getDistortionFactor();\r
+               this._prjmat=i_param.getPerspectiveProjectionMatrix();\r
+       }\r
+       public int convert(MarkerPositionTable.Item[] i_positions,IntRectStack o_out) throws NyARException\r
+       {\r
+               NyARDoubleMatrix33 rot=this._rot_temp;\r
+               NyARDoublePoint3d pos=this._pos_temp;\r
+               NyARPerspectiveProjectionMatrix prjmat=this._prjmat;\r
+               NyARDoublePoint2d pos2d=this._pos2d_tmp;\r
+               INyARCameraDistortionFactor dist=_dist;\r
+               for(int i=i_positions.length-1;i>=0;i--)\r
+               {\r
+                       MarkerPositionTable.Item item=i_positions[i];\r
+                       //空の項目をパス\r
+                       if(item.is_empty){\r
+                               continue;\r
+                       }\r
+                       //変換行列を計算\r
+                       rot.setZXYAngle(item.angle);\r
+                       \r
+                       //4vertexの2次元座標を計算して、それらを内包する矩形を計算する。\r
+                       //[optimize]矩形予測と計算かぶってるよ。\r
+                       int n;\r
+                       int l,t,r,b;\r
+                       int i2=4-1;\r
+                       //[3]の座標変換と射影変換、歪み逆補正\r
+                       rot.transformVertex(item.offset.vertex[i2], pos);\r
+                       pos.x+=item.trans.x;\r
+                       pos.y+=item.trans.y;\r
+                       pos.z+=item.trans.z;\r
+                       prjmat.projectionConvert(pos,pos2d);\r
+                       dist.ideal2Observ(pos2d, pos2d);\r
+                       l=r=(int)pos2d.x;\r
+                       t=b=(int)pos2d.y;\r
+                       i2--;\r
+                       for(;i2>=0;i2--){\r
+                               //[i2]の座標変換と射影変換、歪み逆補正\r
+                               rot.transformVertex(item.offset.vertex[i2], pos);\r
+                               pos.x+=item.trans.x;\r
+                               pos.y+=item.trans.y;\r
+                               pos.z+=item.trans.z;\r
+                               prjmat.projectionConvert(pos,pos2d);\r
+                               dist.ideal2Observ(pos2d, pos2d);\r
+                               n=(int)pos2d.x;\r
+                               if(l>n){\r
+                                       l=n;\r
+                               }else if(r<n){\r
+                                       r=n;\r
+                               }\r
+                               n=(int)pos2d.y;\r
+                               if(t>n){\r
+                                       t=n;\r
+                               }else if(b<n){\r
+                                       b=n;\r
+                               }\r
+                       }                       \r
+                       //RECT保存\r
+                       NyARIntRect rect=o_out.prePush();\r
+                       rect.x=l;\r
+                       rect.y=t;\r
+                       rect.w=r-l;\r
+                       rect.h=b-t;\r
+               }\r
+               return 0;\r
+       }\r
+       public void convert(MarkerPositionTable.Item i_positions,NyARIntRect o_rect) throws NyARException\r
+       {\r
+               NyARDoubleMatrix33 rot=this._rot_temp;\r
+               NyARDoublePoint3d pos=this._pos_temp;\r
+               NyARPerspectiveProjectionMatrix prjmat=this._prjmat;\r
+               NyARDoublePoint2d pos2d=this._pos2d_tmp;\r
+               INyARCameraDistortionFactor dist=_dist;\r
+\r
+               //変換行列を計算\r
+               rot.setZXYAngle(i_positions.angle);\r
+               \r
+               //4vertexの2次元座標を計算して、それらを内包する矩形を計算する。\r
+               int n;\r
+               int l,t,r,b;\r
+               int i2=4-1;\r
+               //[3]の座標変換と射影変換、歪み逆補正\r
+               rot.transformVertex(i_positions.offset.vertex[i2], pos);\r
+               pos.x+=i_positions.trans.x;\r
+               pos.y+=i_positions.trans.y;\r
+               pos.z+=i_positions.trans.z;\r
+               prjmat.projectionConvert(pos,pos2d);\r
+               dist.ideal2Observ(pos2d, pos2d);\r
+               l=r=(int)pos2d.x;\r
+               t=b=(int)pos2d.y;\r
+               i2--;\r
+               for(;i2>=0;i2--){\r
+                       //[i2]の座標変換と射影変換、歪み逆補正\r
+                       rot.transformVertex(i_positions.offset.vertex[i2], pos);\r
+                       pos.x+=i_positions.trans.x;\r
+                       pos.y+=i_positions.trans.y;\r
+                       pos.z+=i_positions.trans.z;\r
+                       prjmat.projectionConvert(pos,pos2d);\r
+                       dist.ideal2Observ(pos2d, pos2d);\r
+                       n=(int)pos2d.x;\r
+                       if(l>n){\r
+                               l=n;\r
+                       }else if(r<n){\r
+                               r=n;\r
+                       }\r
+                       n=(int)pos2d.y;\r
+                       if(t>n){\r
+                               t=n;\r
+                       }else if(b<n){\r
+                               b=n;\r
+                       }\r
+               }                       \r
+               //RECT保存\r
+               o_rect.x=l;\r
+               o_rect.y=t;\r
+               o_rect.w=r-l;\r
+               o_rect.h=b-t;\r
+       }       \r
+}
\ No newline at end of file