背景:
我目前正在使用OpenCV开展立体视觉项目.我正在尝试从一组两个校正的图像创建一个视差图,但我没有得到我期望的结果.在查看校正后的图像时,图像之间会有明显的垂直偏移,整改后不应该出现这种情况.我正在寻找错误可能是什么.我的代码基于OpenCV书籍和本例中的立体声校准和对应代码.我使用OpenCV的C++接口.我的OpenCV版本是2.1,来自Ubuntu 11.04存储库.
问题的简短版本:
函数可接受的RMS返回值是多少:
double cv::calibrateCamera(...)
Run Code Online (Sandbox Code Playgroud)
我目前使用一组~20个棋盘图像对来校准每个摄像机.相机是两个相同的PS3眼睛(分辨率为640*480像素)安装在一起.cv::calibrateCamera返回160到300之间的RMS误差(我对不同的图像集有不同的结果).这是这个图像分辨率的可接受值还是我应该尝试获得更好的棋盘图像?
长版(详情,代码示例):
获得工作立体视觉; 首先,我想确保相机校准程序正常工作.我使用一系列棋盘图像来校准我的立体声设置,如下所示:
// Find chessboard corners
cv::Mat left = ... //Load image
vector<cv::Point2f> points;
bool found = cv::findChessboardCorners(left, patternSize, points, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_NORMALIZE_IMAGE);
if(found)
cv::cornerSubPix(left, points, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1));
imagePointsLeft.push_back(points);
Run Code Online (Sandbox Code Playgroud)
我为多个图像对执行此操作,并将结果点放入imagePointsLeft和imagePointsRight.我在相同的图像上运行了一个单独的程序检查,我在视觉上确认左右图像使用相同的顺序正确地记录所有角落cv::drawChessboardCorners.对于每个图像对,我还填充一组对象坐标,如下所示:
vector<cv::Point3f> obj;
for(int i = 0; i < ny; i++)
for(int j = 0; j < nx; j++) …Run Code Online (Sandbox Code Playgroud)