Commit 43b03b65 authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #8864 from sovrasov:calib_flags_update

parents 594652ca c0e456de
...@@ -268,6 +268,7 @@ enum { CALIB_USE_INTRINSIC_GUESS = 0x00001, ...@@ -268,6 +268,7 @@ enum { CALIB_USE_INTRINSIC_GUESS = 0x00001,
CALIB_TILTED_MODEL = 0x40000, CALIB_TILTED_MODEL = 0x40000,
CALIB_FIX_TAUX_TAUY = 0x80000, CALIB_FIX_TAUX_TAUY = 0x80000,
CALIB_USE_QR = 0x100000, //!< use QR instead of SVD decomposition for solving. Faster but potentially less precise CALIB_USE_QR = 0x100000, //!< use QR instead of SVD decomposition for solving. Faster but potentially less precise
CALIB_FIX_TANGENT_DIST = 0x200000,
// only for stereo // only for stereo
CALIB_FIX_INTRINSIC = 0x00100, CALIB_FIX_INTRINSIC = 0x00100,
CALIB_SAME_FOCAL_LENGTH = 0x00200, CALIB_SAME_FOCAL_LENGTH = 0x00200,
......
...@@ -1319,7 +1319,7 @@ static double cvCalibrateCamera2Internal( const CvMat* objectPoints, ...@@ -1319,7 +1319,7 @@ static double cvCalibrateCamera2Internal( const CvMat* objectPoints,
(npoints->rows != 1 && npoints->cols != 1) ) (npoints->rows != 1 && npoints->cols != 1) )
CV_Error( CV_StsUnsupportedFormat, CV_Error( CV_StsUnsupportedFormat,
"the array of point counters must be 1-dimensional integer vector" ); "the array of point counters must be 1-dimensional integer vector" );
if(flags & CV_CALIB_TILTED_MODEL) if(flags & CALIB_TILTED_MODEL)
{ {
//when the tilted sensor model is used the distortion coefficients matrix must have 14 parameters //when the tilted sensor model is used the distortion coefficients matrix must have 14 parameters
if (distCoeffs->cols*distCoeffs->rows != 14) if (distCoeffs->cols*distCoeffs->rows != 14)
...@@ -1328,7 +1328,7 @@ static double cvCalibrateCamera2Internal( const CvMat* objectPoints, ...@@ -1328,7 +1328,7 @@ static double cvCalibrateCamera2Internal( const CvMat* objectPoints,
else else
{ {
//when the thin prism model is used the distortion coefficients matrix must have 12 parameters //when the thin prism model is used the distortion coefficients matrix must have 12 parameters
if(flags & CV_CALIB_THIN_PRISM_MODEL) if(flags & CALIB_THIN_PRISM_MODEL)
if (distCoeffs->cols*distCoeffs->rows != 12) if (distCoeffs->cols*distCoeffs->rows != 12)
CV_Error( CV_StsBadArg, "Thin prism model must have 12 parameters in the distortion matrix" ); CV_Error( CV_StsBadArg, "Thin prism model must have 12 parameters in the distortion matrix" );
} }
...@@ -1498,24 +1498,28 @@ static double cvCalibrateCamera2Internal( const CvMat* objectPoints, ...@@ -1498,24 +1498,28 @@ static double cvCalibrateCamera2Internal( const CvMat* objectPoints,
if(flags & CALIB_FIX_ASPECT_RATIO) if(flags & CALIB_FIX_ASPECT_RATIO)
mask[0] = 0; mask[0] = 0;
if( flags & CV_CALIB_FIX_FOCAL_LENGTH ) if( flags & CALIB_FIX_FOCAL_LENGTH )
mask[0] = mask[1] = 0; mask[0] = mask[1] = 0;
if( flags & CV_CALIB_FIX_PRINCIPAL_POINT ) if( flags & CALIB_FIX_PRINCIPAL_POINT )
mask[2] = mask[3] = 0; mask[2] = mask[3] = 0;
if( flags & CV_CALIB_ZERO_TANGENT_DIST ) if( flags & CALIB_ZERO_TANGENT_DIST )
{ {
param[6] = param[7] = 0; param[6] = param[7] = 0;
mask[6] = mask[7] = 0; mask[6] = mask[7] = 0;
} }
if( !(flags & CALIB_RATIONAL_MODEL) ) if( !(flags & CALIB_RATIONAL_MODEL) )
flags |= CALIB_FIX_K4 + CALIB_FIX_K5 + CALIB_FIX_K6; flags |= CALIB_FIX_K4 + CALIB_FIX_K5 + CALIB_FIX_K6;
if( !(flags & CV_CALIB_THIN_PRISM_MODEL)) if( !(flags & CALIB_THIN_PRISM_MODEL))
flags |= CALIB_FIX_S1_S2_S3_S4; flags |= CALIB_FIX_S1_S2_S3_S4;
if( !(flags & CV_CALIB_TILTED_MODEL)) if( !(flags & CALIB_TILTED_MODEL))
flags |= CALIB_FIX_TAUX_TAUY; flags |= CALIB_FIX_TAUX_TAUY;
mask[ 4] = !(flags & CALIB_FIX_K1); mask[ 4] = !(flags & CALIB_FIX_K1);
mask[ 5] = !(flags & CALIB_FIX_K2); mask[ 5] = !(flags & CALIB_FIX_K2);
if( flags & CALIB_FIX_TANGENT_DIST )
{
mask[6] = mask[7] = 1;
}
mask[ 8] = !(flags & CALIB_FIX_K3); mask[ 8] = !(flags & CALIB_FIX_K3);
mask[ 9] = !(flags & CALIB_FIX_K4); mask[ 9] = !(flags & CALIB_FIX_K4);
mask[10] = !(flags & CALIB_FIX_K5); mask[10] = !(flags & CALIB_FIX_K5);
...@@ -1817,39 +1821,39 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1 ...@@ -1817,39 +1821,39 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
cvConvert( points, imagePoints[k] ); cvConvert( points, imagePoints[k] );
cvReshape( imagePoints[k], imagePoints[k], 2, 1 ); cvReshape( imagePoints[k], imagePoints[k], 2, 1 );
if( flags & (CV_CALIB_FIX_INTRINSIC|CV_CALIB_USE_INTRINSIC_GUESS| if( flags & (CALIB_FIX_INTRINSIC|CALIB_USE_INTRINSIC_GUESS|
CV_CALIB_FIX_ASPECT_RATIO|CV_CALIB_FIX_FOCAL_LENGTH) ) CALIB_FIX_ASPECT_RATIO|CALIB_FIX_FOCAL_LENGTH) )
cvConvert( cameraMatrix, &K[k] ); cvConvert( cameraMatrix, &K[k] );
if( flags & (CV_CALIB_FIX_INTRINSIC|CV_CALIB_USE_INTRINSIC_GUESS| if( flags & (CALIB_FIX_INTRINSIC|CALIB_USE_INTRINSIC_GUESS|
CV_CALIB_FIX_K1|CV_CALIB_FIX_K2|CV_CALIB_FIX_K3|CV_CALIB_FIX_K4|CV_CALIB_FIX_K5|CV_CALIB_FIX_K6) ) CALIB_FIX_K1|CALIB_FIX_K2|CALIB_FIX_K3|CALIB_FIX_K4|CALIB_FIX_K5|CALIB_FIX_K6) )
{ {
CvMat tdist = cvMat( distCoeffs->rows, distCoeffs->cols, CvMat tdist = cvMat( distCoeffs->rows, distCoeffs->cols,
CV_MAKETYPE(CV_64F,CV_MAT_CN(distCoeffs->type)), Dist[k].data.db ); CV_MAKETYPE(CV_64F,CV_MAT_CN(distCoeffs->type)), Dist[k].data.db );
cvConvert( distCoeffs, &tdist ); cvConvert( distCoeffs, &tdist );
} }
if( !(flags & (CV_CALIB_FIX_INTRINSIC|CV_CALIB_USE_INTRINSIC_GUESS))) if( !(flags & (CALIB_FIX_INTRINSIC|CALIB_USE_INTRINSIC_GUESS)))
{ {
cvCalibrateCamera2( objectPoints, imagePoints[k], cvCalibrateCamera2( objectPoints, imagePoints[k],
npoints, imageSize, &K[k], &Dist[k], NULL, NULL, flags ); npoints, imageSize, &K[k], &Dist[k], NULL, NULL, flags );
} }
} }
if( flags & CV_CALIB_SAME_FOCAL_LENGTH ) if( flags & CALIB_SAME_FOCAL_LENGTH )
{ {
static const int avg_idx[] = { 0, 4, 2, 5, -1 }; static const int avg_idx[] = { 0, 4, 2, 5, -1 };
for( k = 0; avg_idx[k] >= 0; k++ ) for( k = 0; avg_idx[k] >= 0; k++ )
A[0][avg_idx[k]] = A[1][avg_idx[k]] = (A[0][avg_idx[k]] + A[1][avg_idx[k]])*0.5; A[0][avg_idx[k]] = A[1][avg_idx[k]] = (A[0][avg_idx[k]] + A[1][avg_idx[k]])*0.5;
} }
if( flags & CV_CALIB_FIX_ASPECT_RATIO ) if( flags & CALIB_FIX_ASPECT_RATIO )
{ {
for( k = 0; k < 2; k++ ) for( k = 0; k < 2; k++ )
aspectRatio[k] = A[k][0]/A[k][4]; aspectRatio[k] = A[k][0]/A[k][4];
} }
recomputeIntrinsics = (flags & CV_CALIB_FIX_INTRINSIC) == 0; recomputeIntrinsics = (flags & CALIB_FIX_INTRINSIC) == 0;
err.reset(cvCreateMat( maxPoints*2, 1, CV_64F )); err.reset(cvCreateMat( maxPoints*2, 1, CV_64F ));
Je.reset(cvCreateMat( maxPoints*2, 6, CV_64F )); Je.reset(cvCreateMat( maxPoints*2, 6, CV_64F ));
...@@ -1873,40 +1877,40 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1 ...@@ -1873,40 +1877,40 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
if( recomputeIntrinsics ) if( recomputeIntrinsics )
{ {
uchar* imask = solver.mask->data.ptr + nparams - NINTRINSIC*2; uchar* imask = solver.mask->data.ptr + nparams - NINTRINSIC*2;
if( !(flags & CV_CALIB_RATIONAL_MODEL) ) if( !(flags & CALIB_RATIONAL_MODEL) )
flags |= CV_CALIB_FIX_K4 | CV_CALIB_FIX_K5 | CV_CALIB_FIX_K6; flags |= CALIB_FIX_K4 | CALIB_FIX_K5 | CALIB_FIX_K6;
if( !(flags & CV_CALIB_THIN_PRISM_MODEL) ) if( !(flags & CALIB_THIN_PRISM_MODEL) )
flags |= CV_CALIB_FIX_S1_S2_S3_S4; flags |= CALIB_FIX_S1_S2_S3_S4;
if( !(flags & CV_CALIB_TILTED_MODEL) ) if( !(flags & CALIB_TILTED_MODEL) )
flags |= CV_CALIB_FIX_TAUX_TAUY; flags |= CALIB_FIX_TAUX_TAUY;
if( flags & CV_CALIB_FIX_ASPECT_RATIO ) if( flags & CALIB_FIX_ASPECT_RATIO )
imask[0] = imask[NINTRINSIC] = 0; imask[0] = imask[NINTRINSIC] = 0;
if( flags & CV_CALIB_FIX_FOCAL_LENGTH ) if( flags & CALIB_FIX_FOCAL_LENGTH )
imask[0] = imask[1] = imask[NINTRINSIC] = imask[NINTRINSIC+1] = 0; imask[0] = imask[1] = imask[NINTRINSIC] = imask[NINTRINSIC+1] = 0;
if( flags & CV_CALIB_FIX_PRINCIPAL_POINT ) if( flags & CALIB_FIX_PRINCIPAL_POINT )
imask[2] = imask[3] = imask[NINTRINSIC+2] = imask[NINTRINSIC+3] = 0; imask[2] = imask[3] = imask[NINTRINSIC+2] = imask[NINTRINSIC+3] = 0;
if( flags & CV_CALIB_ZERO_TANGENT_DIST ) if( flags & CALIB_ZERO_TANGENT_DIST )
imask[6] = imask[7] = imask[NINTRINSIC+6] = imask[NINTRINSIC+7] = 0; imask[6] = imask[7] = imask[NINTRINSIC+6] = imask[NINTRINSIC+7] = 0;
if( flags & CV_CALIB_FIX_K1 ) if( flags & CALIB_FIX_K1 )
imask[4] = imask[NINTRINSIC+4] = 0; imask[4] = imask[NINTRINSIC+4] = 0;
if( flags & CV_CALIB_FIX_K2 ) if( flags & CALIB_FIX_K2 )
imask[5] = imask[NINTRINSIC+5] = 0; imask[5] = imask[NINTRINSIC+5] = 0;
if( flags & CV_CALIB_FIX_K3 ) if( flags & CALIB_FIX_K3 )
imask[8] = imask[NINTRINSIC+8] = 0; imask[8] = imask[NINTRINSIC+8] = 0;
if( flags & CV_CALIB_FIX_K4 ) if( flags & CALIB_FIX_K4 )
imask[9] = imask[NINTRINSIC+9] = 0; imask[9] = imask[NINTRINSIC+9] = 0;
if( flags & CV_CALIB_FIX_K5 ) if( flags & CALIB_FIX_K5 )
imask[10] = imask[NINTRINSIC+10] = 0; imask[10] = imask[NINTRINSIC+10] = 0;
if( flags & CV_CALIB_FIX_K6 ) if( flags & CALIB_FIX_K6 )
imask[11] = imask[NINTRINSIC+11] = 0; imask[11] = imask[NINTRINSIC+11] = 0;
if( flags & CV_CALIB_FIX_S1_S2_S3_S4 ) if( flags & CALIB_FIX_S1_S2_S3_S4 )
{ {
imask[12] = imask[NINTRINSIC+12] = 0; imask[12] = imask[NINTRINSIC+12] = 0;
imask[13] = imask[NINTRINSIC+13] = 0; imask[13] = imask[NINTRINSIC+13] = 0;
imask[14] = imask[NINTRINSIC+14] = 0; imask[14] = imask[NINTRINSIC+14] = 0;
imask[15] = imask[NINTRINSIC+15] = 0; imask[15] = imask[NINTRINSIC+15] = 0;
} }
if( flags & CV_CALIB_FIX_TAUX_TAUY ) if( flags & CALIB_FIX_TAUX_TAUY )
{ {
imask[16] = imask[NINTRINSIC+16] = 0; imask[16] = imask[NINTRINSIC+16] = 0;
imask[17] = imask[NINTRINSIC+17] = 0; imask[17] = imask[NINTRINSIC+17] = 0;
...@@ -1977,7 +1981,7 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1 ...@@ -1977,7 +1981,7 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
for( k = 0; k < 2; k++ ) for( k = 0; k < 2; k++ )
{ {
double* iparam = solver.param->data.db + (nimages+1)*6 + k*NINTRINSIC; double* iparam = solver.param->data.db + (nimages+1)*6 + k*NINTRINSIC;
if( flags & CV_CALIB_ZERO_TANGENT_DIST ) if( flags & CALIB_ZERO_TANGENT_DIST )
dk[k][2] = dk[k][3] = 0; dk[k][2] = dk[k][3] = 0;
iparam[0] = A[k][0]; iparam[1] = A[k][4]; iparam[2] = A[k][2]; iparam[3] = A[k][5]; iparam[0] = A[k][0]; iparam[1] = A[k][4]; iparam[2] = A[k][2]; iparam[3] = A[k][5];
iparam[4] = dk[k][0]; iparam[5] = dk[k][1]; iparam[6] = dk[k][2]; iparam[4] = dk[k][0]; iparam[5] = dk[k][1]; iparam[6] = dk[k][2];
...@@ -2027,14 +2031,14 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1 ...@@ -2027,14 +2031,14 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
dpdf = &dpdf_hdr; dpdf = &dpdf_hdr;
dpdc = &dpdc_hdr; dpdc = &dpdc_hdr;
dpdk = &dpdk_hdr; dpdk = &dpdk_hdr;
if( flags & CV_CALIB_SAME_FOCAL_LENGTH ) if( flags & CALIB_SAME_FOCAL_LENGTH )
{ {
iparam[NINTRINSIC] = iparam[0]; iparam[NINTRINSIC] = iparam[0];
iparam[NINTRINSIC+1] = iparam[1]; iparam[NINTRINSIC+1] = iparam[1];
ipparam[NINTRINSIC] = ipparam[0]; ipparam[NINTRINSIC] = ipparam[0];
ipparam[NINTRINSIC+1] = ipparam[1]; ipparam[NINTRINSIC+1] = ipparam[1];
} }
if( flags & CV_CALIB_FIX_ASPECT_RATIO ) if( flags & CALIB_FIX_ASPECT_RATIO )
{ {
iparam[0] = iparam[1]*aspectRatio[0]; iparam[0] = iparam[1]*aspectRatio[0];
iparam[NINTRINSIC] = iparam[NINTRINSIC+1]*aspectRatio[1]; iparam[NINTRINSIC] = iparam[NINTRINSIC+1]*aspectRatio[1];
...@@ -2096,7 +2100,7 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1 ...@@ -2096,7 +2100,7 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
if( JtJ || JtErr ) if( JtJ || JtErr )
cvProjectPoints2( &objpt_i, &om[k], &T[k], &K[k], &Dist[k], cvProjectPoints2( &objpt_i, &om[k], &T[k], &K[k], &Dist[k],
&tmpimagePoints, dpdrot, dpdt, dpdf, dpdc, dpdk, &tmpimagePoints, dpdrot, dpdt, dpdf, dpdc, dpdk,
(flags & CV_CALIB_FIX_ASPECT_RATIO) ? aspectRatio[k] : 0); (flags & CALIB_FIX_ASPECT_RATIO) ? aspectRatio[k] : 0);
else else
cvProjectPoints2( &objpt_i, &om[k], &T[k], &K[k], &Dist[k], &tmpimagePoints ); cvProjectPoints2( &objpt_i, &om[k], &T[k], &K[k], &Dist[k], &tmpimagePoints );
cvSub( &tmpimagePoints, &imgpt_i[k], &tmpimagePoints ); cvSub( &tmpimagePoints, &imgpt_i[k], &tmpimagePoints );
...@@ -2372,7 +2376,7 @@ void cvStereoRectify( const CvMat* _cameraMatrix1, const CvMat* _cameraMatrix2, ...@@ -2372,7 +2376,7 @@ void cvStereoRectify( const CvMat* _cameraMatrix1, const CvMat* _cameraMatrix2,
// For simplicity, set the principal points for both cameras to be the average // For simplicity, set the principal points for both cameras to be the average
// of the two principal points (either one of or both x- and y- coordinates) // of the two principal points (either one of or both x- and y- coordinates)
if( flags & CV_CALIB_ZERO_DISPARITY ) if( flags & CALIB_ZERO_DISPARITY )
{ {
cc_new[0].x = cc_new[1].x = (cc_new[0].x + cc_new[1].x)*0.5; cc_new[0].x = cc_new[1].x = (cc_new[0].x + cc_new[1].x)*0.5;
cc_new[0].y = cc_new[1].y = (cc_new[0].y + cc_new[1].y)*0.5; cc_new[0].y = cc_new[1].y = (cc_new[0].y + cc_new[1].y)*0.5;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment