OSDN Git Service

[backup]NyARToolkit for Java
authornyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Thu, 12 Nov 2009 03:56:57 +0000 (03:56 +0000)
committernyatla <nyatla@7cac0a50-4618-4814-88d0-24b83990f816>
Thu, 12 Nov 2009 03:56:57 +0000 (03:56 +0000)
NyARTransMatのtransmatContinue機能の調整。
ジッタが出にくくなった(はず)

src/jp/nyatla/nyartoolkit/core/transmat/NyARTransMat.java
src/jp/nyatla/nyartoolkit/core/transmat/NyARTransMatResult.java
src/jp/nyatla/nyartoolkit/core/transmat/NyARTransMat_ARToolKit.java
src/jp/nyatla/nyartoolkit/core/transmat/rotmatrix/NyARRotVector.java

index ed7aa13..a094d15 100644 (file)
@@ -47,7 +47,9 @@ import jp.nyatla.nyartoolkit.core.types.matrix.*;
 public class NyARTransMat implements INyARTransMat\r
 {\r
        private final static double FIT_DIFF_THRESHOLD = 1.0;\r
-       private final static double FIT_DIFF_THRESHOLD_CONT = 1.0;\r
+       private final static double FIT_DIFF_THRESHOLD_CONT = 0.1;\r
+       private final static double FIT_DIFF_THRESHOLD_OPT = 0.01;\r
+       \r
 \r
        private final NyARDoublePoint2d _center=new NyARDoublePoint2d(0,0);\r
        private final NyARTransOffset _offset=new NyARTransOffset();\r
@@ -154,7 +156,7 @@ public class NyARTransMat implements INyARTransMat
                this._transsolver.solveTransportVector(vertex_3d,trans);\r
                \r
                //計算結果の最適化(平行移動量と回転行列の最適化)\r
-               this.optimize(this._rotmatrix, trans, this._transsolver,this._offset.vertex, vertex_2d);\r
+               o_result_conv.error=this.optimize(this._rotmatrix, trans, this._transsolver,this._offset.vertex, vertex_2d);\r
                \r
                // マトリクスの保存\r
                this.updateMatrixValue(this._rotmatrix, this._offset.point, trans,o_result_conv);\r
@@ -200,8 +202,8 @@ public class NyARTransMat implements INyARTransMat
                //現在のエラーレートを計算しておく\r
                double min_err=errRate(this._rotmatrix,trans, this._offset.vertex, vertex_2d,4,vertex_3d);\r
                NyARDoubleMatrix33 rot=this.__rot;\r
-               //エラーレートが閾値超えてたらアゲイン\r
-               if(min_err<FIT_DIFF_THRESHOLD_CONT){\r
+               //エラーレートが前回のエラー値より閾値分大きかったらアゲイン\r
+               if(min_err<o_result_conv.error+FIT_DIFF_THRESHOLD_CONT){\r
                        rot.setValue(this._rotmatrix);\r
                        //最適化してみる。\r
                        for (int i = 0;i<5; i++) {\r
@@ -227,9 +229,10 @@ public class NyARTransMat implements INyARTransMat
                        this._transsolver.solveTransportVector(vertex_3d,trans);\r
                        \r
                        //計算結果の最適化(平行移動量と回転行列の最適化)\r
-                       this.optimize(this._rotmatrix, trans, this._transsolver,this._offset.vertex, vertex_2d);\r
+                       min_err=this.optimize(this._rotmatrix, trans, this._transsolver,this._offset.vertex, vertex_2d);\r
                        this.updateMatrixValue(this._rotmatrix, this._offset.point, trans,o_result_conv);\r
                }\r
+               o_result_conv.error=min_err;\r
                return;\r
        }\r
        private NyARDoubleMatrix33 __rot=new NyARDoubleMatrix33();\r
@@ -246,7 +249,7 @@ public class NyARTransMat implements INyARTransMat
                        this._mat_optimize.modifyMatrix(rot, io_transvec, i_offset_3d, i_2d_vertex, 4);\r
                        double err=errRate(rot,io_transvec, i_offset_3d, i_2d_vertex,4,vertex_3d);\r
                        //System.out.println("E:"+err);\r
-                       if(min_err-err<FIT_DIFF_THRESHOLD){\r
+                       if(min_err-err<FIT_DIFF_THRESHOLD_OPT){\r
                                //System.out.println("BREAK");\r
                                break;\r
                        }\r
index 25b6ef7..4181d95 100644 (file)
@@ -40,6 +40,10 @@ import jp.nyatla.nyartoolkit.core.types.matrix.*;
  */\r
 public class NyARTransMatResult extends NyARDoubleMatrix34\r
 {\r
+       /**\r
+        * エラーレート。この値はINyARTransMatの派生クラスが使います。\r
+        */\r
+       public double error;    \r
        public boolean has_value = false;\r
        /**\r
         * この関数は、0-PIの間で値を返します。\r
index 2f47ea1..d14d8b0 100644 (file)
@@ -153,7 +153,7 @@ public class NyARTransMat_ARToolKit implements INyARTransMat
                this._transsolver.solveTransportVector(vertex_3d,trans);\r
                \r
                //計算結果の最適化(平行移動量と回転行列の最適化)\r
-               this.optimize(this._rotmatrix, trans, this._transsolver,this._offset.vertex, vertex_2d);\r
+               o_result_conv.error=this.optimize(this._rotmatrix, trans, this._transsolver,this._offset.vertex, vertex_2d);\r
                \r
                // マトリクスの保存\r
                this.updateMatrixValue(this._rotmatrix, this._offset.point, trans,o_result_conv);\r
@@ -216,7 +216,10 @@ public class NyARTransMat_ARToolKit implements INyARTransMat
                                // 良い値が取れたら、差換え\r
                                this.updateMatrixValue(this._rotmatrix, this._offset.point, trans,o_result_conv);\r
                        }\r
+                       err=err2;\r
                }\r
+               //エラー値保存\r
+               o_result_conv.error=err;\r
                return;\r
        }\r
        private double optimize(NyARRotMatrix_ARToolKit io_rotmat,NyARDoublePoint3d io_transvec,INyARTransportVectorSolver i_solver,NyARDoublePoint3d[] i_offset_3d,NyARDoublePoint2d[] i_2d_vertex) throws NyARException\r
index 2274485..b4310eb 100644 (file)
@@ -82,9 +82,9 @@ public class NyARRotVector
        {\r
                //1行目\r
                final NyARPerspectiveProjectionMatrix cmat= this._projection_mat_ref;\r
-               final double w1 = i_linear1.run * i_linear2.rise - i_linear2.run * i_linear1.rise;\r
-               final double w2 = i_linear1.rise * i_linear2.intercept - i_linear2.rise * i_linear1.intercept;\r
-               final double w3 = i_linear1.intercept * i_linear2.run - i_linear2.intercept * i_linear1.run;\r
+               final double w1 = i_linear1.dy * i_linear2.dx - i_linear2.dy * i_linear1.dx;\r
+               final double w2 = i_linear1.dx * i_linear2.c - i_linear2.dx * i_linear1.c;\r
+               final double w3 = i_linear1.c * i_linear2.dy - i_linear2.c * i_linear1.dy;\r
 \r
                final double m0 = w1 * (cmat.m01 * cmat.m12 - cmat.m02 * cmat.m11) + w2 * cmat.m11 - w3 * cmat.m01;//w1 * (cpara[0 * 4 + 1] * cpara[1 * 4 + 2] - cpara[0 * 4 + 2] * cpara[1 * 4 + 1]) + w2 * cpara[1 * 4 + 1] - w3 * cpara[0 * 4 + 1];\r
                final double m1 = -w1 * cmat.m00 * cmat.m12 + w3 * cmat.m00;//-w1 * cpara[0 * 4 + 0] * cpara[1 * 4 + 2] + w3 * cpara[0 * 4 + 0];\r