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