stereoRectify 有时不起作用

stereoRectify doesn't work sometimes

我在 aruco 板上拍摄了很多物体:

文件夹内所有图片均未失真,可在此下载:https://drive.google.com/drive/folders/1egatZWvy575HHdu82bdgXqEJH2vs1Rcx?usp=sharing

对于每张图片,我都有 xml 文件,其中包含 t_vec 和 r_vec 的 aruco 板。我在边框上画了蓝线,它非常适合,所以这些矢量是正确的:

对于每对图像,我使用此代码计算从一个视口到另一个视口的 R 和 T:

pair<Mat,Mat> calcRT(View&v1, View&v2) {
    Mat R1,R2,R,T;
    Rodrigues(v1.r, R1);
    Rodrigues(v2.r, R2);
    R = R2*R1.inv();
    Mat RT1 = R*v1.t.t();
    T = v2.t.t() - RT1;
    return make_pair(R, T);
}

然后我这样调用纠正:

auto RT = calcRT(v1, v2);
Mat R1, R2, P1, P2, Q, RT_d;
RT.first.convertTo(RT_d, CV_64F);
Mat tt = RT.second;
tt.convertTo(tt, CV_64F);
auto imageSize = Size(v1.img.cols, v1.img.rows);
Rect validROI[2];
stereoRectify(cm, Mat(), cm, Mat(), imageSize,
    RT_d, tt, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY*0,.999, imageSize, &validROI[0], &validROI[1]);
bool isVerticalStereo = fabs(P2.at<double>(1, 3)) > fabs(P2.at<double>(0, 3));
Mat rmap[2][2];
initUndistortRectifyMap(cm, Mat(), R1, P1, imageSize, CV_32FC1, rmap[0][0], rmap[0][1]);
initUndistortRectifyMap(cm, Mat(), R2, P2, imageSize, CV_32FC1, rmap[1][0], rmap[1][1]);
Mat canvas;
double sf = 1;
int w, h;
if (isVerticalStereo) {return;} // I never get here
cout << "horisontal stereo" << endl;
w = cvRound(imageSize.width*sf);
h = cvRound(imageSize.height*sf);
canvas.create(h, w * 2, CV_8UC3);
String file;
Mat rimg1, rimg2;
remap(v1.img, rimg1, rmap[0][0], rmap[0][1], INTER_LINEAR);
remap(v2.img, rimg2, rmap[1][0], rmap[1][1], INTER_LINEAR);

因此,有些对是完全正确的:

但其余的不是黑就是坏:

由于 stereoRectify,我总是得到垂直立体声。我尝试了 flagsalpha 参数的各种组合。但是大多数对看起来都不正确。我做错了什么?

程序源代码如下:https://gist.github.com/stiv-yakovenko/62f179c97a602fb87320c810c75e0102

看起来这是一个已知问题,与 stereoRectify opencv 中的不稳定有关:

https://github.com/opencv/opencv/issues/11131

我的解决方法如下:取 100 个随机 3d 点,将它们投射到两张照片上,然后使用 findFundamentalMatstereoRectifyUncalibrated 找到纠正同形异义词。之后我不得不在 x 和 y 方向移动图像,但其余的都是正确的。