opencv - OpenCV 中的立体校准 + 校正

标签 opencv computer-vision stereo-3d

我正在进行立体视觉设置,机翼上方安装了 2 个摄像头。左摄像头向内倾斜几度,而右摄像头与机翼平行。所有可用图像 here

然后使用(剪切和粘贴,但不按原样编译)

// performing stereocalibration given imagePoint_leftcamera and rightcamera
Flea3.reproj_error = stereoCalibrate(objectPoints,imagePoints_left,imagePoints_right,cameraMatrix_left,
        distCoeffs_left,cameraMatrix_right,distCoeffs_right,imageSize, Flea3.R, Flea3.T, Flea3.E, Flea3.F,
        TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5),
        CV_CALIB_FIX_INTRINSIC );

// Peform stereorectification
stereoRectify(cameraMatrix_left, distCoeffs_left, cameraMatrix_right, distCoeffs_right, imageSize, Flea3.R, Flea3.T, Flea3.R1, Flea3.R2, Flea3.P1, Flea3.P2, Flea3.Q, CALIB_ZERO_DISPARITY, -1, Size(), &Flea3.validRoi_left, &Flea3.validRoi_right);

//computes undistort and rectify maps
initUndistortRectifyMap(cameraMatrix_left, distCoeffs_left, R1, P1, imageSize, CV_16SC2, rmap[0][0], rmap[0][2]);
initUndistortRectifyMap(cameraMatrix_right, distCoeffs_right, R2, P2, imageSize, CV_16SC2, rmap[1][0], rmap[1][3]);

remap(src_left, img_left, rmap[0][0], rmap[0][4], CV_INTER_LINEAR);
remap(src_right, img_right, rmap[1][0], rmap[1][5], CV_INTER_LINEAR);

右图中的黑色区域不应该在右边吗?既然右边的摄像头应该向右倾斜?

此外,尽管立体校正似乎有效,但 ROI(用红色框表示)显然是错误的!

我的校准好吗?顺便说一句,我的 cv::stereocalibrate 返回的重新投影错误是 0.6004

最佳答案

请查看底部的绿色匹配线 - 没有对应关系。在实践中,您必须在不同的位置和方向使用大约 20-30 个棋盘图案姿势(校准装置),包括深度旋转(倾斜、倾斜)、平面内旋转,并且请至少在您的某些部分覆盖整个图像校准镜头或在不同的镜头中逐个部分一致地覆盖它。

需要多个校准图像的原因如下。考虑齐次坐标中的无穷远点(称为理想点或消失点)。沿x方向的理想点是
Xinf = [1, 0, 0, 0]T
如果你把它带回欧几里德空间,你会得到 [1/0=Inf, 0/0, 0/0]T。如果你将你的投影矩阵从左边乘以 Xinf(同源坐标),结果除了第一列之外的所有地方都会有零。 结论: X 方向的消失点为您提供了投影矩阵的第一列。其他列来自其他消失点。反之则更难证明——即要获得正确的 P,你需要消失点,让我们暂时假设它。

您的校准问题在于您的装备中没有清晰的消失点,因为它是前置摄像头。您必须倾斜它以使投影线收敛(在多个方向成为消失点)。另一个问题是您的装备只占据了图像的一小部分,这是以其他区域为代价进行优化的地方。使用多个钻机姿势重新校准,您将获得更好的结果。

关于opencv - OpenCV 中的立体校准 + 校正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22389012/

相关文章:

image - 使用 png 文件读取视差图

python - 有什么方法可以将 numpy 数组指定为 'Image Widget' 吗?

linux - 无法在linux中编译opencv

python - 在另一个图像上匹配轮廓或绘制 (png) 轮廓

algorithm - 在 2d 图像算法上检测多个相似的石头?

c++ - 为什么 StereoSGBM 给出负数和上面的 numberOfDisparities 数

android - 如何加快我的Android-openCV应用程序的速度?

c++ - OCR 和 OpenCV : Difference between two frames on high resolution images

c# - EmguCV:使用光流在运动中的物体上绘制轮廓?

python - 在 Python 2.7 和 OpenCV 3.3 中使用 triangulatePoints 每次输出 3D 点都会发生变化