立体视觉矫正后图像变形

4

我目前正在使用OpenCV实现立体视觉。现在我正在使用Stereo_Calib示例来消除畸变并矫正图像。消除畸变效果很好。

enter image description here

但是当我应用校正时,图像会非常扭曲。

enter image description here

这是用于矫正图像的代码。参数rmap的计算方式与Stereo_calib示例相同(请参见此处)。
void StereoCalibration::StereoRectify(Mat &imageLeft, Mat &imageRight)
{
Mat imLeft, imRight;

remap(imageLeft, imLeft,DistLeft.rmap[0], DistLeft.rmap[1], CV_INTER_CUBIC);            
remap(imageRight,imRight, DistRight.rmap[0], DistRight.rmap[1], CV_INTER_CUBIC);

imageLeft = imLeft;
imageRight = imRight;   
}

这种结果的原因是糟糕的校准图像。任何遇到此类问题的人都必须提供他们的校准图像进行审查。 - Christoph Rackwitz
4个回答

2

我知道这个问题已经几年了,但是我最近遇到了类似的问题。在 morynicz 的答案基础上,关于用“坏棋盘”模式校准立体图像,我发现即使你的棋盘图案有轻微变形,例如不是平的,也会在矫正时产生大的扭曲。例如,在OpenCV算法中,假设一个平面棋盘图案被呈现出来,那么该图案中的任何物理变形都将错误地归因于相机光学畸变(或两个相机传感器之间的相对方向)。然后,算法将尝试非常努力地去除这种虚假畸变,导致图像非常扭曲。

为了避免这个问题,如果可能的话,请使用平板电脑(或其他电子屏幕)显示棋盘图案,因为这样可以保证它是平的。

此外,您应该检查用于校准立体对的图像是否聚焦并且没有运动模糊或图像撕裂。

如果使用OpenCV进行矫正,请在stereoCalibrate函数中尝试一些标志的实验,因为这可能会导致更“优化”的矫正适用于您特定的应用。


1

对于任何需要帮助的人,我处理的是非常大规模分辨率的图像,并且在获得良好的校准图像后获得非常低的重投影误差率。在矫正之后,我的立体图像对非常扭曲,深度图也非常糟糕。

尝试的一个方法是,如果您的图像有扭曲,您可能需要将它们降采样。

另一个尝试的方法是,结合stereoCalibrate中的标志,而不仅仅选择一个标志。

对我来说,像这样做起作用:

cv2.stereoCalibrate(
    object_points, image_points_left,image_points_right,
    camera_matrix_left,dist_left,
    camera_matrix_right, dist_right,
    (5472,3648),None,None,None,None,
    cv2.CALIB_FIX_ASPECT_RATIO + cv2.CALIB_ZERO_TANGENT_DIST + cv2.CALIB_USE_INTRINSIC_GUESS + cv2.CALIB_SAME_FOCAL_LENGTH + cv2.CALIB_RATIONAL_MODEL,criteria
)

如果失真的图像像问题中那样被扭曲,那么您的校准图像就不好。重投影误差只告诉您数据是否有问题。良好的重投影误差并不意味着数据是好的。一个典型的错误是未能用网格图案覆盖视野的重要部分。 - Christoph Rackwitz
那么即使校准不良,这些立体标志仍然可以校正和纠正适当的立体视觉对以创建深度图?我使用了一台20MP相机,棋盘图片是由一个实习生完成的,但我们用不同的位置、旋转和扭曲覆盖了相机的大部分“3D空间”,大约有40张照片。我的工作空间非常小,因此需要较小的棋盘(在机器车间制成)。它们似乎对如何尝试校正非常敏感-这是校准不良的结果吗?我仍然能生成很好的深度图。 - devman3211
每个图像必须包含一个显著覆盖图像的模式,否则它是无用的。任何覆盖面积少于10%的内容都是边缘的,如果不是垃圾的话。不要把这样的任务交给实习生。他们对这些东西知之甚少,并且他们倾向于不质疑您可能有的任何指令或意见。或者至少确保他们写了一篇关于数学的论文。https://calib.io/blogs/knowledge-base/calibration-best-practices - Christoph Rackwitz
有趣,谢谢。那么我们的棋盘格应该足够大,以覆盖任何方向时大部分的框架吗?那么正方形/方块的大小和数量呢?更多的图像点会使校准更好吗?如果我们通过改变正方形的大小,同时保持棋盘格的大小来适应更多的正方形,则较小的棋盘格正方形越小越难检测,但是当处理超高分辨率相机时,这将确保更好的校准还是没有区别? - devman3211
OpenCV的棋盘检测要求所有节点都可见。这使它们成为一个糟糕的选择(直到我有一些空闲时间来修复它...),因为在您的相机视图的角落处,您几乎没有或根本没有点,而那里是最需要的地方。目前,使用“charuco”,但即使这些也存在问题。分辨率与校准中的错误无关。只有当它们实际覆盖整个图像时,更多的点才有意义。许多点位于中心是毫无意义的,并且会出现“递减收益”。十亿个点是愚蠢的。我的直觉是1k-10k点已经足够了。 - Christoph Rackwitz

0

最近我开始研究opencv立体图像校准和矫正,发现得到的图像非常相似。虽然确保板子是直的并且需要在摄像机的角落和中间以不同的x、y、z和倾斜位置拍摄多张图片是正确的,但对我起作用的是stereoCalibrate中的标志。我使用了opencv文档中指定的所有标志,除了INTRINSIC_GUESS,这样就可以得到非常好的无畸变和矫正的图像。


0

我遇到了同样的问题,我认为问题出在错误的棋盘用于校准或地图混淆。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接