什么是cv :: calibrateCamera的“可接受”返回值?

背景:

我目前正在使用OpenCV开展立体视觉项目。 我试图从一组两幅矫正图像中创建一幅差异图,但我没有得到我期望的结果。 在查看修正后的图像时,图像之间存在明显的垂直偏移,整理后不应该存在。 我目前正在寻找错误可能是什么。 我的代码基于OpenCV书籍中的立体声校准和通信代码,以及此示例。 我使用OpenCV的C ++接口。 我的OpenCV版本是2.1,来自Ubuntu 11.04存储库。

问题的简短版本:

该功能可接受的RMS返回值是什么:

double cv::calibrateCamera(...)

我目前使用一组〜20个棋盘图像对来校准每个相机。 相机是两个完全相同的PS3 Eyes(分辨率为640 * 480像素)。 cv::calibrateCamera返回一个介于160300之间的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);

我为多个图像对执行此操作,并将结果点放在imagePointsLeftimagePointsRight 。 我已经在一个单独的程序中对相同的图像进行了检查,我可以通过cv::drawChessboardCorners以相同的顺序正确地注册左右图像正确地注册所有的角cv::drawChessboardCorners 。 对于每个图像对,我也填充一组对象坐标,如下所示:

vector<cv::Point3f> obj;
for(int i = 0; i < ny; i++)
  for(int j = 0; j < nx; j++)
    obj.push_back(cv::Point3f(i*squareSize,j*squareSize,0.0));
objectPoints.push_back(obj);

然后我尝试用这些图像校准相机:

double rms = cv::calibrateCamera(objectPoints, imagePointsLeft, m_imageSize, m_cameraMatrixLeft, m_distortionMatrixLeft, rvecsLeft, tvecsLeft);

当我使用标志CV_CALIB_FIX_INTRINSIC调用cv::stereoCalibrate时,我使用此函数中的相机内在函数(此文档中建议使用此方法进行立体声校准)。

我继续调用cv::stereoRectifycv::initUndistortRectifyMap ,后者用于两个摄像头。 使用initUndistortRectifyMap的输出和相机的新鲜图像生成校正图像的cv::remap 。 两张图片只包含有效像素(没有黑色区域)。 我的问题是,给定行的像素与其他图像中的同一行不匹配(存在轻微的垂直偏移)。 这使得很难从StereoBM等通信算法中获得好的结果。


相机校准存在问题: cv::calibrateCamera()返回均方根(RMS)重投影误差[1],并且在良好的校准中应该在0.1和1.0像素之间。 作为一个参考点,我使用由两台以640 x 480分辨率运行的硬件同步的Playstation Eye摄像头组成的自定义立体相机,获得大约0.25像素的RMS错误。

你确定cv::findChessboardCorners()返回的像素坐标与obj中的像素坐标是否相同? 如果坐标轴翻转,则会出现类似于您所描述的症状。

[1]:OpenCV通过使用最终的一组校准参数将三维棋盘点投影到图像中并比较角落的位置来计算重投影误差。 RMS误差为300意味着平均而言,这些投影点中的每一个与其实际位置相距300 px。

链接地址: http://www.djcxy.com/p/30615.html

上一篇: What is an "acceptable" return value from cv::calibrateCamera?

下一篇: How PostgreSQL index deals with MVCC