opencv - 不同相机(RGB 和红外线)的 stereoCalibrate

标签 opencv calibration

我在校准两个摄像头时遇到问题:第一个是 rgb,第二个是红外线。它们具有不同的分辨率(我调整大小并裁剪了更大的图像)、焦距等...

例子:

RGB 1920x1080 RGB 1920x1080

红外线 512x424 Infrared 512x424

如何相互校准它们?我应该在 stereoCalibrate 中使用哪些参数。 默认样本 stereo_calib.cpp 产生非常大的错误。 像这样:https://www.dropbox.com/s/x57rrzp1ejm3cac/%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%202014-04-05%2012.54.17.png

完成 RMS 错误=4.1026

平均重投影误差 = 10.2601

更新

我使用 calibration.cpp 示例为每个相机独立生成了校准参数。对于 RGB 相机,我首先调整图像大小并裁剪图像以匹配红外相机 (512x424) 的分辨率,然后进行校准。对于 RGB 相机,我得到 camera.yml,对于 IR 相机,我得到 camera_ir.yml。 然后我尝试使用修改后的 stereo_calib.cpp 示例进行立体校准。在调用 stereoCalibrate 之前,我从文件中读取相机的 camera_matrix 和 distortion_coefficients 参数,并将这些矩阵放入 stereoCalibrate。

FileStorage rgbCamSettings("camera.yml", CV_STORAGE_READ);
Mat rgbCameraMatrix;
Mat rgbDistCoeffs;
rgbCamSettings["camera_matrix"] >> rgbCameraMatrix;
rgbCamSettings["distortion_coefficients"] >> rgbDistCoeffs;

FileStorage irCamSettings("camera_ir.yml", CV_STORAGE_READ);
Mat irCameraMatrix;
Mat irDistCoeffs;
irCamSettings["camera_matrix"] >> irCameraMatrix;
irCamSettings["distortion_coefficients"] >> irDistCoeffs;


Mat cameraMatrix[2], distCoeffs[2];
cameraMatrix[0] = rgbCameraMatrix;
cameraMatrix[1] = irCameraMatrix;
distCoeffs[0] = rgbDistCoeffs;
distCoeffs[1] = irDistCoeffs;

Mat R, T, E, F;



double rms = stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1],
                cameraMatrix[0], distCoeffs[0],
                cameraMatrix[1], distCoeffs[1],
                imageSize, R, T, E, F,
                TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 50, 1e-6),
                CV_CALIB_FIX_INTRINSIC +
                CV_CALIB_USE_INTRINSIC_GUESS
                );

最佳答案

在 Dropbox 上看不到你的图片(为什么不把你的图片放到 stack exchange 上?),但似乎 bundle adjustment 没有收敛。您应该尝试以下操作:

  1. 使用 cv::calibrateCamera ( link ) 独立校准每个相机,并获取每个相机的相机矩阵 K 和畸变系数 D。

  2. 使用 cv::stereoCalibrate ( link ) 和估计的 K 和 D 以及标志 CV_CALIB_USE_INTRINSIC_GUESSCV_CALIB_FIX_INTRINSIC 已启用。

这样做会将相机矩阵和畸变系数的估计与旋转和平移的估计解耦,这应该会大大改善残差。

关于opencv - 不同相机(RGB 和红外线)的 stereoCalibrate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22877869/

相关文章:

opencv - OpenCV相机校准的数学背景

python - 将图像缩减为由一组点定义的路径

android - 如何为 Android 应用程序集成 meta io + Opencv?

opencv - 如何获得相机标定矩阵?

ios磁力计: force display of calibration view

红外相机的 OpenCV 立体校准

c++ - 无法通过 opencv3.2 加载 squeezeNet 1.0 或 1.1

c++ - 将图像指针返回给 Erlang

ios - RedLaser 驾照扫描仪 - 针对每个州进行校准 (iOS)

OpenCV:移动单相机的旋转矩阵和平移向量