stereoRectify有时不起作用

时间:2018-03-25 07:12:25

标签: opencv stereo-3d

我在aruco板上有许多物体镜头:

enter image description here

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

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

enter image description here

对于每对图像,我使用此代码计算从一个视口到另一个视口的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);

因此,一些配对完全正确:

enter image description here

但其余的都是黑色或破碎的:

enter image description here

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

以下是该计划的源代码:https://gist.github.com/stiv-yakovenko/62f179c97a602fb87320c810c75e0102

1 个答案:

答案 0 :(得分:0)

看起来这是opencv中 stereoRectify 不稳定的已知问题:

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

我的解决方法如下:取100个随机3d点,将它们投影到两张照片,然后使用 findFundamentalMat stereoRectifyUncalibrated 查找纠正单应性。之后,我不得不在x和y方向上移动图像,但其余的都是正确的。