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
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
//現在のエラーレートを計算しておく\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
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
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
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
// 良い値が取れたら、差換え\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
{\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