2

我需要使用部分校准的相机的图像校正,即只知道内在参数。所以首先我匹配一些关键点并使用findFundamentalMat(...). 这是我到目前为止的结果,看起来还可以吗?

关键点看起来不错

我得到的平均错误是:274.326(看起来很多?)我用来计算这个值的代码如下:

vector<Point3f> linesL;
vector<Point3f> linesR;
computeCorrespondEpilines(pL, 1, f, linesL);
computeCorrespondEpilines(pR, 2, f, linesR);
double avgErr = 0;

for(int i = 0; i < linesL.size(); i++ ) {

    double err = fabs(pL[i].x*linesR[i].x +
    pL[i].y*linesR[i].y + linesR[i].z) +
    fabs(pR[i].x*linesL[i].x +
    pR[i].y*linesL[i].y + linesL[i].z);
    if(err != err)
        cout << "nan" << endl;
    cout << err << endl;
    avgErr += err;
}
cout << "avg err = " << avgErr/linesL.size() << endl;

这是齐次坐标的简单距离公式,对吧?然后我基本上是这样做的:

Mat h1, h2;
Mat w;
stereoRectifyUncalibrated(pL, pR, f, imgL.size(), h1, h2);
warpPerspective(imgL, w, h1, imgL.size());

但是当尝试显示图像时,它看起来像这样: 错误转化

所以我的问题是:我做错了什么?我也知道 ransac 是不确定的,但我的平均误差有时在前面提到的 270 左右,但有时会上升到 3.79508e+19 等。

PS:pL 和 pR,是使用 f 的掩码过滤的匹配点,阈值为 3。我知道这里有一些关于这个主题的线索,我也确实按照那里给出的指示,我的问题只是在当前的情况下找到问题的根源。

4

0 回答 0