cvcalibration.cpp.svn-base
来自「非结构化路识别」· SVN-BASE 代码 · 共 2,039 行 · 第 1/5 页
SVN-BASE
2,039 行
icvDetMatrix3x3_64d(rotMatr, &detRotMatr);
if( fabs(detRotMatr - 1.0) < bigeps )
{
/* norm(in' * in - eye(3)) < bigeps */
icvInvertMatrix_64d(rotMatr,3,invRotMatr);
icvMulMatrix_64d(rotMatr,3,3,invRotMatr,3,3,tmpmat3);
icvSetIdentity_64d(tmpEye3, 3, 3);
icvSubMatrix_64d(tmpmat3,tmpEye3,tmpmat3,3,3);
/* icvSVDecomposition_64d( tmpmat3,
3,3,
matrS,
matrV); */
tmpMat = cvMat( 3, 3, CV_64FC1, tmpmat3 );
matS = cvMat( 3, 1, CV_64FC1, matrS );
cvSVD( &tmpMat, &matS );
if( matrS[0] < bigeps )/* norm(matr) is max of singular value of matr */
{
icvTrace_64d(rotMatr, 3, 3, &trace);
trace = (trace - 1.0) / 2.0;
if( trace > 1 )
{
theta = 0;
}
else
{
if( trace < -1 )
{
theta = -CV_PI;
}
else
{
theta = acos(trace);
}
}
icvSetZero_64d(dtrdR,9,1);
dtrdR[0]= 0.5f;
dtrdR[4]= 0.5f;
dtrdR[8]= 0.5f;
if( sin(theta) >= 1e-5 )
{
/* Test for error sqrt(x) x >= 0 */
vth = (double)(1/(2*sin(theta)));
om1[0] = rotMatr[2 * 3 + 1] - rotMatr[1 * 3 + 2];
om1[1] = rotMatr[0 * 3 + 2] - rotMatr[2 * 3 + 0];
om1[2] = rotMatr[1 * 3 + 0] - rotMatr[0 * 3 + 1];
icvScaleVector_64d(om1,om,3,vth);
icvScaleVector_64d(om,rotVect,3,theta);
if( Jacobian != 0 )
{
dthetadtr = (double)(-1 / sqrt(1. - trace * trace));
icvScaleVector_64d(dtrdR, dthetadR, 9, dthetadtr);
dvar1dtheta[0] = (double)(-vth*cos(theta)/sin(theta));
dvar1dtheta[1] = 1;
icvSetZero_64d(dvardR,9,5);
icvMulMatrix_64d(dvar1dtheta,1,2,dthetadR,9,1,dvardR + 9 * 3);
dvardR[0 * 9 + 5] = 1;
dvardR[0 * 9 + 7] = -1;
dvardR[1 * 9 + 2] = -1;
dvardR[1 * 9 + 6] = 1;
dvardR[2 * 9 + 1] = 1;
dvardR[2 * 9 + 3] = -1;
icvSetZero_64d(dvar2dvar,5,4);
dvar2dvar[0 * 5 + 0] = vth;
dvar2dvar[1 * 5 + 1] = vth;
dvar2dvar[2 * 5 + 2] = vth;
dvar2dvar[0 * 5 + 3] = om1[0];
dvar2dvar[1 * 5 + 3] = om1[1];
dvar2dvar[2 * 5 + 3] = om1[2];
dvar2dvar[3 * 5 + 4] = 1;
/* Calculate dout = domegadvar2 * dvar2dvar * dvardR */
icvSetZero_64d(domegadvar2,4,3);
domegadvar2[0 * 4 + 0] = theta;
domegadvar2[1 * 4 + 1] = theta;
domegadvar2[2 * 4 + 2] = theta;
domegadvar2[0 * 4 + 3] = om[0];
domegadvar2[1 * 4 + 3] = om[1];
domegadvar2[2 * 4 + 3] = om[2];
icvMulMatrix_64d(domegadvar2,4,3,dvar2dvar,5,4,tmp53);
icvMulMatrix_64d(tmp53,5,3,dvardR,9,5,Jacobian);
}
}
else
{
if( trace > 0 )
{
icvSetZero_64d(rotVect, 3, 1);
if( Jacobian != 0 )
{
icvSetZero_64d(Jacobian, 9, 3);
Jacobian[0 * 9 + 5] = 0.5f;
Jacobian[0 * 9 + 7] = -0.5f;
Jacobian[1 * 9 + 2] = -0.5f;
Jacobian[1 * 9 + 6] = 0.5f;
Jacobian[2 * 9 + 1] = 0.5f;
Jacobian[2 * 9 + 3] = -0.5f;
}
}
else
{
tmp3[0] = (double)(sqrt((rotMatr[0 * 3 + 0] + 1.) * 0.5));
tmp3[1] = (double)(sqrt((rotMatr[1 * 3 + 1] + 1.) * 0.5));
tmp3[2] = (double)(sqrt((rotMatr[2 * 3 + 2] + 1.) * 0.5));
if( rotMatr[0 * 3 + 1] < 0 )
{
tmp3[1] = - tmp3[1];
}
if( rotMatr[0 * 3 + 2] < 0 )
{
tmp3[2] = - tmp3[2];
}
icvCopyVector_64d(tmp3,3,rotVect);
if( Jacobian != 0 )
{
/* !!! Jacobian is not defined in this section */
/* If it's need it is an error. */
/* We must to set Jacobian to NaN */
/* NaN - not a number (1.#QNAN) */
icvSetZero_64d(Jacobian,9,3);
}
}
}
}
else
{/* max sing > bigeps */
return CV_BADFACTOR_ERR;
}
}/* test for bigeps */
else
{/* det > bigeps */
return CV_BADFACTOR_ERR;
}
}/* Convertion type */
return CV_NO_ERR;
}
/*======================================================================================*/
CvStatus
icvNormalizeImagePoints( int numPoints,
CvPoint2D64d * ImagePoints,
CvVect64d focalLength,
CvPoint2D64d principalPoint,
CvVect64d distortion, CvPoint3D64d * resImagePoints )
{
int t;
int iter;
double k1, k2;
double p1, p2;
double tmpr;
double k_radial;
double x, y;
double delta_x, delta_y;
CvMatr64d r_2;
CvPoint2D64d *desPnt;
r_2 = icvCreateVector_64d( numPoints );
desPnt = (CvPoint2D64d *) icvCreateVector_64d( numPoints * 2 );
k1 = distortion[0];
k2 = distortion[1];
p1 = distortion[2];
p2 = distortion[3];
/* Shift points to principal point and use focal length */
for( t = 0; t < numPoints; t++ )
{
resImagePoints[t].x = (ImagePoints[t].x - principalPoint.x) / focalLength[0];
resImagePoints[t].y = (ImagePoints[t].y - principalPoint.y) / focalLength[1];
resImagePoints[t].z = 0;
desPnt[t].x = (ImagePoints[t].x - principalPoint.x) / focalLength[0];
desPnt[t].y = (ImagePoints[t].y - principalPoint.y) / focalLength[1];
}
/* Compensate lens distortion */
for( iter = 0; iter < 5; iter++ )
{
for( t = 0; t < numPoints; t++ )
{
x = resImagePoints[t].x;
y = resImagePoints[t].y;
tmpr = x * x + y * y;
k_radial = 1 + k1 * tmpr + k2 * tmpr * tmpr;
r_2[t] = tmpr;
delta_x = 2 * p1 * x * y + p2 * (tmpr + 2 * x * x);
delta_y = p1 * (tmpr + 2 * y * y) + 2 * p2 * x * y;
x = (desPnt[t].x - delta_x) / k_radial;
y = (desPnt[t].y - delta_y) / k_radial;
resImagePoints[t].x = x;
resImagePoints[t].y = y;
}
}
icvDeleteVector( r_2 );
icvDeleteVector( desPnt );
return CV_NO_ERR;
}
/*======================================================================================*/
/* Computes the rigid motion transformation Y = R*X+T, where R = rodrigues(om) */
CvStatus
icvRigidMotionTransform( int numPoints,
CvPoint3D64d * objectPoints,
CvVect64d rotVect, CvVect64d transVect,
CvPoint3D64d * rigidMotionTrans, /* Output points */
CvMatr64d derivMotionRot, CvMatr64d derivMotionTrans )
{
CvMatr64d tmpMatr;
CvMatr64d tmpMatr2;
CvMatr64d dYdR;
int t;
double x, y, z;
double rotMatr[3 * 3];
double dRdom[3 * 9];
tmpMatr = icvCreateMatrix_64d( numPoints, 3 );
tmpMatr2 = icvCreateMatrix_64d( numPoints, 3 );
dYdR = icvCreateMatrix_64d( 9, 3 * numPoints );
icvRodrigues_64d( rotMatr, rotVect, dRdom, CV_RODRIGUES_V2M );
icvTransposeMatrix_64d( (double *) objectPoints, 3, numPoints, tmpMatr );
icvMulMatrix_64d( rotMatr, 3, 3, tmpMatr, numPoints, 3, tmpMatr2 );
icvTransposeMatrix_64d( tmpMatr2, numPoints, 3, (double *) rigidMotionTrans );
for( t = 0; t < numPoints; t++ )
{
icvAddVector_64d( (double *) (rigidMotionTrans + t),
transVect, (double *) (rigidMotionTrans + t), 3 );
}
icvSetZero_64d( dYdR, 9, 3 * numPoints );
for( t = 0; t < numPoints; t++ )
{
icvSetIdentity_64d( derivMotionTrans + t * 9, 3, 3 );
}
for( t = 0; t < numPoints; t++ )
{
x = objectPoints[t].x;
y = objectPoints[t].y;
z = objectPoints[t].z;
dYdR[t * 27 + 0] = x;
dYdR[t * 27 + 3] = y;
dYdR[t * 27 + 6] = z;
dYdR[t * 27 + 10] = x;
dYdR[t * 27 + 13] = y;
dYdR[t * 27 + 16] = z;
dYdR[t * 27 + 20] = x;
dYdR[t * 27 + 23] = y;
dYdR[t * 27 + 26] = z;
}
icvMulMatrix_64d( dYdR, 9, numPoints * 3, dRdom, 3, 9, derivMotionRot );
icvDeleteMatrix( dYdR );
icvDeleteMatrix( tmpMatr );
icvDeleteMatrix( tmpMatr2 );
return CV_NO_ERR;
}
/*======================================================================================*/
CvStatus
icvProjectPoints( int numPoints,
CvPoint3D64d * objectPoints,
CvVect64d rotVect,
CvVect64d transVect,
CvVect64d focalLength,
CvPoint2D64d principalPoint,
CvVect64d distortion,
CvPoint2D64d * imagePoints,
CvVect64d derivPointsRot,
CvVect64d derivPointsTrans,
CvVect64d derivPointsFocal,
CvVect64d derivPointsPrincipal, CvVect64d derivPointsDistort )
{
CvPoint3D64d *Y;
CvPoint2D64d *x;
CvMatr64d trans_x;
CvMatr64d dYdom;
CvMatr64d dYdT;
CvVect64d inv_Z;
CvVect64d bb;
CvVect64d cc;
CvMatr64d dxdom;
CvMatr64d dxdT;
CvVect64d r2;
CvVect64d r4;
CvVect64d cdist;
double tmp;
double tmpx, tmpy;
CvMatr64d tmpn3;
CvMatr64d dr2dom;
CvMatr64d dr2dT;
CvMatr64d dr4dom;
CvMatr64d dr4dT;
CvMatr64d dcdistdom;
CvMatr64d dcdistdT;
CvMatr64d dcdistdk;
CvMatr64d xd1;
CvMatr64d xd2;
CvMatr64d dxd1dom;
CvVect64d tmpn;
CvMatr64d dxd1dT;
CvMatr64d dxd1dk;
CvVect64d a1;
CvVect64d a2;
CvVect64d a3;
CvMatr64d delta_x;
CvVect64d aa;
CvMatr64d ddelta_xdom;
CvMatr64d ddelta_xdT;
CvMatr64d ddelta_xdk;
CvMatr64d dxd2dom;
CvMatr64d dxd2dT;
CvMatr64d dxd2dk;
double tmp3[3];
double tmp6[6];
int t;
Y = (CvPoint3D64d *) icvCreateVector_64d( numPoints * 3 );
x = (CvPoint2D64d *) icvCreateVector_64d( numPoints * 2 );
trans_x = icvCreateMatrix_64d( numPoints, 2 );
dYdom = icvCreateMatrix_64d( 3, 3 * numPoints );
dYdT = icvCreateMatrix_64d( 3, 3 * numPoints );
inv_Z = icvCreateVector_64d( numPoints );
dxdom = icvCreateMatrix_64d( 3, 2 * numPoints );
dxdT = icvCreateMatrix_64d( 3, 2 * numPoints );
tmpn3 = icvCreateMatrix_64d( 3, numPoints );
dr2dom = icvCreateMatrix_64d( 3, numPoints );
dr2dT = icvCreateMatrix_64d( 3, numPoints );
r2 = icvCreateVector_64d( numPoints );
r4 = icvCreateVector_64d( numPoints );
cdist = icvCreateVector_64d( numPoints );
dr4dom = icvCreateMatrix_64d( 3, numPoints );
dr4dT = icvCreateMatrix_64d( 3, numPoints );
dcdistdom = icvCreateMatrix_64d( 3, numPoints );
dcdistdT = icvCreateMatrix_64d( 3, numPoints );
dcdistdk = icvCreateMatrix_64d( 4, numPoints );
xd1 = icvCreateMatrix_64d( numPoints, 2 );
xd2 = icvCreateMatrix_64d( numPoints, 2 );
dxd1dom = icvCreateMatrix_64d( 3, 2 * numPoints );
dxd1dT = icvCreateMatrix_64d( 3, 2 * numPoints );
dxd1dk = icvCreateMatrix_64d( 4, 2 * numPoints );
a1 = icvCreateVector_64d( numPoints );
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?