@@ -1766,16 +1766,16 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
1766
1766
CvTermCriteria termCrit )
1767
1767
{
1768
1768
const int NINTRINSIC = 18 ;
1769
- Ptr<CvMat> npoints, err, J_LR, Je, Ji, imagePoints[2 ], objectPoints, RT0;
1769
+ Ptr<CvMat> npoints, imagePoints[2 ], objectPoints, RT0;
1770
1770
double reprojErr = 0 ;
1771
1771
1772
- double A[2 ][9 ], dk[2 ][14 ]={{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }}, rlr[9 ];
1772
+ double A[2 ][9 ], dk[2 ][14 ]={{0 }}, rlr[9 ];
1773
1773
CvMat K[2 ], Dist[2 ], om_LR, T_LR;
1774
1774
CvMat R_LR = cvMat (3 , 3 , CV_64F, rlr);
1775
1775
int i, k, p, ni = 0 , ofs, nimages, pointsTotal, maxPoints = 0 ;
1776
1776
int nparams;
1777
1777
bool recomputeIntrinsics = false ;
1778
- double aspectRatio[2 ] = {0 , 0 };
1778
+ double aspectRatio[2 ] = {0 };
1779
1779
1780
1780
CV_Assert ( CV_IS_MAT (_imagePoints1) && CV_IS_MAT (_imagePoints2) &&
1781
1781
CV_IS_MAT (_objectPoints) && CV_IS_MAT (_npoints) &&
@@ -1855,11 +1855,10 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
1855
1855
1856
1856
recomputeIntrinsics = (flags & CALIB_FIX_INTRINSIC) == 0 ;
1857
1857
1858
- err.reset (cvCreateMat ( maxPoints*2 , 1 , CV_64F ));
1859
- Je.reset (cvCreateMat ( maxPoints*2 , 6 , CV_64F ));
1860
- J_LR.reset (cvCreateMat ( maxPoints*2 , 6 , CV_64F ));
1861
- Ji.reset (cvCreateMat ( maxPoints*2 , NINTRINSIC, CV_64F ));
1862
- cvZero ( Ji );
1858
+ Mat err ( maxPoints*2 , 1 , CV_64F );
1859
+ Mat Je ( maxPoints*2 , 6 , CV_64F );
1860
+ Mat J_LR ( maxPoints*2 , 6 , CV_64F );
1861
+ Mat Ji ( maxPoints*2 , NINTRINSIC, CV_64F, Scalar (0 ) );
1863
1862
1864
1863
// we optimize for the inter-camera R(3),t(3), then, optionally,
1865
1864
// for intrinisic parameters of each camera ((fx,fy,cx,cy,k1,k2,p1,p2) ~ 8 parameters).
@@ -1943,8 +1942,6 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
1943
1942
R[k] = cvMat (3 , 3 , CV_64F, r[k]);
1944
1943
T[k] = cvMat (3 , 1 , CV_64F, t[k]);
1945
1944
1946
- // FIXME: here we ignore activePoints[k] because of
1947
- // the limited API of cvFindExtrnisicCameraParams2
1948
1945
cvFindExtrinsicCameraParams2 ( &objpt_i, &imgpt_i[k], &K[k], &Dist[k], &om[k], &T[k] );
1949
1946
cvRodrigues2 ( &om[k], &R[k] );
1950
1947
if ( k == 0 )
@@ -2001,7 +1998,6 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
2001
1998
for (;;)
2002
1999
{
2003
2000
const CvMat* param = 0 ;
2004
- CvMat tmpimagePoints;
2005
2001
CvMat *JtJ = 0 , *JtErr = 0 ;
2006
2002
double *_errNorm = 0 ;
2007
2003
double _omR[3 ], _tR[3 ];
@@ -2013,8 +2009,6 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
2013
2009
CvMat dt3dt1 = cvMat (3 , 3 , CV_64F, _dt3dt1);
2014
2010
CvMat dt3dt2 = cvMat (3 , 3 , CV_64F, _dt3dt2);
2015
2011
CvMat om[2 ], T[2 ], imgpt_i[2 ];
2016
- CvMat dpdrot_hdr, dpdt_hdr, dpdf_hdr, dpdc_hdr, dpdk_hdr;
2017
- CvMat *dpdrot = &dpdrot_hdr, *dpdt = &dpdt_hdr, *dpdf = 0 , *dpdc = 0 , *dpdk = 0 ;
2018
2012
2019
2013
if ( !solver.updateAlt ( param, JtJ, JtErr, _errNorm ))
2020
2014
break ;
@@ -2028,9 +2022,7 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
2028
2022
{
2029
2023
double * iparam = solver.param ->data .db + (nimages+1 )*6 ;
2030
2024
double * ipparam = solver.prevParam ->data .db + (nimages+1 )*6 ;
2031
- dpdf = &dpdf_hdr;
2032
- dpdc = &dpdc_hdr;
2033
- dpdk = &dpdk_hdr;
2025
+
2034
2026
if ( flags & CALIB_SAME_FOCAL_LENGTH )
2035
2027
{
2036
2028
iparam[NINTRINSIC] = iparam[0 ];
@@ -2083,44 +2075,43 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
2083
2075
cvComposeRT ( &om[0 ], &T[0 ], &om_LR, &T_LR, &om[1 ], &T[1 ] );
2084
2076
2085
2077
objpt_i = cvMat (1 , ni, CV_64FC3, objectPoints->data .db + ofs*3 );
2086
- err->rows = Je->rows = J_LR->rows = Ji->rows = ni*2 ;
2087
- cvReshape ( err, &tmpimagePoints, 2 , 1 );
2078
+ err.resize (ni*2 ); Je.resize (ni*2 ); J_LR.resize (ni*2 ); Ji.resize (ni*2 );
2088
2079
2089
- cvGetCols ( Ji, &dpdf_hdr, 0 , 2 );
2090
- cvGetCols ( Ji, &dpdc_hdr, 2 , 4 );
2091
- cvGetCols ( Ji, &dpdk_hdr, 4 , NINTRINSIC );
2092
- cvGetCols ( Je, &dpdrot_hdr, 0 , 3 );
2093
- cvGetCols ( Je, &dpdt_hdr, 3 , 6 );
2080
+ CvMat tmpimagePoints (err.reshape (2 , 1 ));
2081
+ CvMat dpdf (Ji.colRange (0 , 2 ));
2082
+ CvMat dpdc (Ji.colRange (2 , 4 ));
2083
+ CvMat dpdk (Ji.colRange (4 , NINTRINSIC));
2084
+ CvMat dpdrot (Je.colRange (0 , 3 ));
2085
+ CvMat dpdt (Je.colRange (3 , 6 ));
2094
2086
2095
2087
for ( k = 0 ; k < 2 ; k++ )
2096
2088
{
2097
- double l2err;
2098
2089
imgpt_i[k] = cvMat (1 , ni, CV_64FC2, imagePoints[k]->data .db + ofs*2 );
2099
2090
2100
2091
if ( JtJ || JtErr )
2101
2092
cvProjectPoints2 ( &objpt_i, &om[k], &T[k], &K[k], &Dist[k],
2102
- &tmpimagePoints, dpdrot, dpdt, dpdf, dpdc, dpdk,
2093
+ &tmpimagePoints, & dpdrot, & dpdt, & dpdf, & dpdc, & dpdk,
2103
2094
(flags & CALIB_FIX_ASPECT_RATIO) ? aspectRatio[k] : 0 );
2104
2095
else
2105
2096
cvProjectPoints2 ( &objpt_i, &om[k], &T[k], &K[k], &Dist[k], &tmpimagePoints );
2106
2097
cvSub ( &tmpimagePoints, &imgpt_i[k], &tmpimagePoints );
2107
2098
2108
- l2err = cvNorm ( &tmpimagePoints, 0 , CV_L2 );
2109
-
2110
- if ( JtJ || JtErr )
2099
+ if ( solver.state == CvLevMarq::CALC_J )
2111
2100
{
2112
2101
int iofs = (nimages+1 )*6 + k*NINTRINSIC, eofs = (i+1 )*6 ;
2113
2102
assert ( JtJ && JtErr );
2114
2103
2104
+ Mat _JtJ (cvarrToMat (JtJ)), _JtErr (cvarrToMat (JtErr));
2105
+
2115
2106
if ( k == 1 )
2116
2107
{
2117
2108
// d(err_{x|y}R) ~ de3
2118
2109
// convert de3/{dr3,dt3} => de3{dr1,dt1} & de3{dr2,dt2}
2119
2110
for ( p = 0 ; p < ni*2 ; p++ )
2120
2111
{
2121
- CvMat de3dr3 = cvMat ( 1 , 3 , CV_64F, Je-> data .ptr + Je-> step *p );
2112
+ CvMat de3dr3 = cvMat ( 1 , 3 , CV_64F, Je.ptr (p) );
2122
2113
CvMat de3dt3 = cvMat ( 1 , 3 , CV_64F, de3dr3.data .db + 3 );
2123
- CvMat de3dr2 = cvMat ( 1 , 3 , CV_64F, J_LR-> data .ptr + J_LR-> step *p );
2114
+ CvMat de3dr2 = cvMat ( 1 , 3 , CV_64F, J_LR.ptr (p) );
2124
2115
CvMat de3dt2 = cvMat ( 1 , 3 , CV_64F, de3dr2.data .db + 3 );
2125
2116
double _de3dr1[3 ], _de3dt1[3 ];
2126
2117
CvMat de3dr1 = cvMat ( 1 , 3 , CV_64F, _de3dr1 );
@@ -2138,39 +2129,27 @@ double cvStereoCalibrate( const CvMat* _objectPoints, const CvMat* _imagePoints1
2138
2129
cvCopy ( &de3dt1, &de3dt3 );
2139
2130
}
2140
2131
2141
- cvGetSubRect ( JtJ, &_part, cvRect (0 , 0 , 6 , 6 ) );
2142
- cvGEMM ( J_LR, J_LR, 1 , &_part, 1 , &_part, CV_GEMM_A_T );
2143
-
2144
- cvGetSubRect ( JtJ, &_part, cvRect (eofs, 0 , 6 , 6 ) );
2145
- cvGEMM ( J_LR, Je, 1 , 0 , 0 , &_part, CV_GEMM_A_T );
2146
-
2147
- cvGetRows ( JtErr, &_part, 0 , 6 );
2148
- cvGEMM ( J_LR, err, 1 , &_part, 1 , &_part, CV_GEMM_A_T );
2132
+ _JtJ (Rect (0 , 0 , 6 , 6 )) += J_LR.t ()*J_LR;
2133
+ _JtJ (Rect (eofs, 0 , 6 , 6 )) = J_LR.t ()*Je;
2134
+ _JtErr.rowRange (0 , 6 ) += J_LR.t ()*err;
2149
2135
}
2150
2136
2151
- cvGetSubRect ( JtJ, &_part, cvRect (eofs, eofs, 6 , 6 ) );
2152
- cvGEMM ( Je, Je, 1 , &_part, 1 , &_part, CV_GEMM_A_T );
2153
-
2154
- cvGetRows ( JtErr, &_part, eofs, eofs + 6 );
2155
- cvGEMM ( Je, err, 1 , &_part, 1 , &_part, CV_GEMM_A_T );
2137
+ _JtJ (Rect (eofs, eofs, 6 , 6 )) += Je.t ()*Je;
2138
+ _JtErr.rowRange (eofs, eofs + 6 ) += Je.t ()*err;
2156
2139
2157
2140
if ( recomputeIntrinsics )
2158
2141
{
2159
- cvGetSubRect ( JtJ, &_part, cvRect (iofs, iofs, NINTRINSIC, NINTRINSIC) );
2160
- cvGEMM ( Ji, Ji, 1 , &_part, 1 , &_part, CV_GEMM_A_T );
2161
- cvGetSubRect ( JtJ, &_part, cvRect (iofs, eofs, NINTRINSIC, 6 ) );
2162
- cvGEMM ( Je, Ji, 1 , &_part, 1 , &_part, CV_GEMM_A_T );
2142
+ _JtJ (Rect (iofs, iofs, NINTRINSIC, NINTRINSIC)) += Ji.t ()*Ji;
2143
+ _JtJ (Rect (iofs, eofs, NINTRINSIC, 6 )) += Je.t ()*Ji;
2163
2144
if ( k == 1 )
2164
2145
{
2165
- cvGetSubRect ( JtJ, &_part, cvRect (iofs, 0 , NINTRINSIC, 6 ) );
2166
- cvGEMM ( J_LR, Ji, 1 , &_part, 1 , &_part, CV_GEMM_A_T );
2146
+ _JtJ (Rect (iofs, 0 , NINTRINSIC, 6 )) += J_LR.t ()*Ji;
2167
2147
}
2168
- cvGetRows ( JtErr, &_part, iofs, iofs + NINTRINSIC );
2169
- cvGEMM ( Ji, err, 1 , &_part, 1 , &_part, CV_GEMM_A_T );
2148
+ _JtErr.rowRange (iofs, iofs + NINTRINSIC) += Ji.t ()*err;
2170
2149
}
2171
2150
}
2172
2151
2173
- reprojErr += l2err*l2err ;
2152
+ reprojErr += norm (err, NORM_L2SQR) ;
2174
2153
}
2175
2154
}
2176
2155
if (_errNorm)
0 commit comments