我需要使用部分校准的相机的图像校正,即只知道内在参数。所以首先我匹配一些关键点并使用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。我知道这里有一些关于这个主题的线索,我也确实按照那里给出的指示,我的问题只是在当前的情况下找到问题的根源。