Kinect One使用OpenCV进行校准
我正在为使用OpenCV的Kinect one进行立体声校准项目。 Kinect SDK中的CoordinateMapper不提供足够的结果(速度和质量)。 彩色相机具有全高清分辨率(1920x1080像素),深度/红外图像为512x424像素。 我的棋盘在A3纸上是10x7,36毫米。
我分别使用cv::calibrateCamera
为两台摄像机执行内部校准。 最终的相机和失真矩阵与GML相机校准非常相似。 cv::undistort
返回应用这些参数的良好视觉效果。 错误是0.941842(红外)和0.583004(彩色)
接下来是使用以前的内在函数的立体声校准:
cv::Mat rotation, translation, fundamental, essential;
std::cout << "Stereo Error: " << cv::stereoCalibrate(pointsBoard, points1, points2, cameraMatrix1, distortion1, cameraMatrix2, distortion2, imageSize,
rotation, translation, essential, fundamental, cv::TermCriteria(CV_TERMCRIT_ITER+ CV_TERMCRIT_EPS, 100, 1e-5), CV_CALIB_FIX_INTRINSIC|CV_CALIB_ZERO_TANGENT_DIST) << std::endl;
cv::Mat R1, R2, P1, P2, Q;
cv::Rect validRoi[2];
cv::stereoRectify(cameraMatrix1, distortion1,
cameraMatrix2, distortion2,
imageSize, rotation, translation, R1, R2, P1, P2, Q,
cv::CALIB_ZERO_DISPARITY, 1, imageSize, &validRoi[0], &validRoi[1]);
cv::initUndistortRectifyMap(cameraMatrix1, distortion1, R1, P1, imageSize, CV_16SC2, rmap[0][0], rmap[0][7]);
cv::initUndistortRectifyMap(cameraMatrix2, distortion2, R2, P2, imageSize, CV_16SC2, rmap[1][0], rmap[1][8]);
我在校准过程中创建了一个未失真的地图并仅校正一次。 像素中的平移通过cv::remap
一个校准图像来计算,再次搜索棋盘并计算X中的平均平移,因为两幅图像的高度和宽度都应匹配? 立体声为0.412727,重投影误差为0.715183,仅使用棋盘格平行于相机的图像(生长在不同的位置/角度上)。 校准图像重新映射和翻译看起来不错。
在实时模式下,两个图像都会被重新映射和翻译,以便它们匹配:
//overlay images
// recitfy
cv::remap(depth1, depth2, rmap[0][0], rmap[0][13], cv::INTER_LINEAR);
cv::remap(color1, color2, rmap[1][0], rmap[1][14], cv::INTER_LINEAR);
// translation and crop
depth1 = depth2(cv::Rect(750, 380, imagesOutputSize.width, imagesOutputSize.height)).clone();
color1 = color2(cv::Rect(750+translationX, 380, imagesOutputSize.width, imagesOutputSize.height)).clone();
结果很糟糕:(