@@ -2296,7 +2296,7 @@ void cvStereoRectify( const CvMat* _cameraMatrix1, const CvMat* _cameraMatrix2,
2296
2296
CvRect* roi1, CvRect* roi2 )
2297
2297
{
2298
2298
double _om[3 ], _t[3 ] = {0 }, _uu[3 ]={0 ,0 ,0 }, _r_r[3 ][3 ], _pp[3 ][4 ];
2299
- double _ww[3 ], _wr[3 ][3 ], _z[3 ] = {0 ,0 ,0 }, _ri[3 ][3 ];
2299
+ double _ww[3 ], _wr[3 ][3 ], _z[3 ] = {0 ,0 ,0 }, _ri[3 ][3 ], _w3[ 3 ] ;
2300
2300
cv::Rect_<float > inner1, inner2, outer1, outer2;
2301
2301
2302
2302
CvMat om = cvMat (3 , 1 , CV_64F, _om);
@@ -2305,11 +2305,13 @@ void cvStereoRectify( const CvMat* _cameraMatrix1, const CvMat* _cameraMatrix2,
2305
2305
CvMat r_r = cvMat (3 , 3 , CV_64F, _r_r);
2306
2306
CvMat pp = cvMat (3 , 4 , CV_64F, _pp);
2307
2307
CvMat ww = cvMat (3 , 1 , CV_64F, _ww); // temps
2308
+ CvMat w3 = cvMat (3 , 1 , CV_64F, _w3); // temps
2308
2309
CvMat wR = cvMat (3 , 3 , CV_64F, _wr);
2309
2310
CvMat Z = cvMat (3 , 1 , CV_64F, _z);
2310
2311
CvMat Ri = cvMat (3 , 3 , CV_64F, _ri);
2311
2312
double nx = imageSize.width , ny = imageSize.height ;
2312
2313
int i, k;
2314
+ double nt, nw;
2313
2315
2314
2316
if ( matR->rows == 3 && matR->cols == 3 )
2315
2317
cvRodrigues2 (matR, &om); // get vector rotation
@@ -2320,15 +2322,33 @@ void cvStereoRectify( const CvMat* _cameraMatrix1, const CvMat* _cameraMatrix2,
2320
2322
cvMatMul (&r_r, matT, &t);
2321
2323
2322
2324
int idx = fabs (_t[0 ]) > fabs (_t[1 ]) ? 0 : 1 ;
2323
- double c = _t[idx], nt = cvNorm (&t, 0 , CV_L2);
2324
- _uu[idx] = c > 0 ? 1 : -1 ;
2325
2325
2326
- // calculate global Z rotation
2327
- cvCrossProduct (&t,&uu,&ww);
2328
- double nw = cvNorm (&ww, 0 , CV_L2);
2329
- if (nw > 0.0 )
2330
- cvConvertScale (&ww, &ww, acos (fabs (c)/nt)/nw);
2331
- cvRodrigues2 (&ww, &wR);
2326
+ // if idx == 0
2327
+ // e1 = T / ||T||
2328
+ // e2 = e1 x [0,0,1]
2329
+
2330
+ // if idx == 1
2331
+ // e2 = T / ||T||
2332
+ // e1 = e2 x [0,0,1]
2333
+
2334
+ // e3 = e1 x e2
2335
+
2336
+ _uu[2 ] = 1 ;
2337
+ cvCrossProduct (&uu, &t, &ww);
2338
+ nt = cvNorm (&t, 0 , CV_L2);
2339
+ nw = cvNorm (&ww, 0 , CV_L2);
2340
+ cvConvertScale (&ww, &ww, 1 / nw);
2341
+ cvCrossProduct (&t, &ww, &w3);
2342
+ nw = cvNorm (&w3, 0 , CV_L2);
2343
+ cvConvertScale (&w3, &w3, 1 / nw);
2344
+ _uu[2 ] = 0 ;
2345
+
2346
+ for (i = 0 ; i < 3 ; ++i)
2347
+ {
2348
+ _wr[idx][i] = -_t[i] / nt;
2349
+ _wr[idx ^ 1 ][i] = -_ww[i];
2350
+ _wr[2 ][i] = _w3[i] * (1 - 2 * idx); // if idx == 1 -> opposite direction
2351
+ }
2332
2352
2333
2353
// apply to both views
2334
2354
cvGEMM (&wR, &r_r, 1 , 0 , 0 , &Ri, CV_GEMM_B_T);
@@ -2342,16 +2362,11 @@ void cvStereoRectify( const CvMat* _cameraMatrix1, const CvMat* _cameraMatrix2,
2342
2362
double fc_new = DBL_MAX;
2343
2363
CvPoint2D64f cc_new[2 ] = {{0 ,0 }, {0 ,0 }};
2344
2364
2345
- for ( k = 0 ; k < 2 ; k++ ) {
2346
- const CvMat* A = k == 0 ? _cameraMatrix1 : _cameraMatrix2;
2347
- const CvMat* Dk = k == 0 ? _distCoeffs1 : _distCoeffs2;
2348
- double dk1 = Dk && Dk->data .ptr ? cvmGet (Dk, 0 , 0 ) : 0 ;
2349
- double fc = cvmGet (A,idx^1 ,idx^1 );
2350
- if ( dk1 < 0 ) {
2351
- fc *= 1 + dk1*(nx*nx + ny*ny)/(4 *fc*fc);
2352
- }
2353
- fc_new = MIN (fc_new, fc);
2354
- }
2365
+ newImgSize = newImgSize.width * newImgSize.height != 0 ? newImgSize : imageSize;
2366
+ const double ratio_x = (double )newImgSize.width / imageSize.width / 2 ;
2367
+ const double ratio_y = (double )newImgSize.height / imageSize.height / 2 ;
2368
+ const double ratio = idx == 1 ? ratio_x : ratio_y;
2369
+ fc_new = (cvmGet (_cameraMatrix1, idx ^ 1 , idx ^ 1 ) + cvmGet (_cameraMatrix2, idx ^ 1 , idx ^ 1 )) * ratio;
2355
2370
2356
2371
for ( k = 0 ; k < 2 ; k++ )
2357
2372
{
0 commit comments