OpenCV 中的相机标定和鸟瞰投影

koo*_*121 4 c++ camera opencv

我已经完成了相机校准。现在我想获得棋盘图片的鸟瞰图。如下所示。但结果很奇怪,看起来不是一个正方形。你可以看到图3。每个正方形都是7.95x7.95。有人知道为什么吗?

gpsPoints[0] = Point2f(..., ...);
gpsPoints[1] = Point2f(..., ...);
gpsPoints[2] = Point2f(..., ...);
gpsPoints[3] = Point2f(..., ...);

dst[0] = Point2f(..., ...);
dst[1] = Point2f(..., ...);
dst[2] = Point2f(..., ...);
dst[3] = Point2f(..., ...);
Mat transmtx = getPerspectiveTransform(gpsPoints, dst);
warpPerspective(img, frame, transmtx, img.size());
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述 在此输入图像描述

Mic*_*cka 5

一般来说,单应性会将直线转换为直线。

由于您只提供了 4 个角,因此透视变换是唯一定义的。因此,如果您确实选择了正确的 4 个角,但图案中的某个位置存在错误的结构,那么这些结构在输入图像中肯定已经是错误的。

在您的场景中,这可能是由于镜头畸变而发生的,因此现实中的直线在(输入)图像中看不到直线。或者输入图像中的线条在现实世界中并不笔直,例如您的图案底座不是完全平坦的,或者您的图案没有很好地粘合在平面上。

在 GIMP 中,我向您的图像添加了一些标记。

在此输入图像描述

轮廓(绿点)是从一个角到下一个角的单直线。正如您所看到的,它们很好地位于图案底座的边界上,这暗示图像中没有太多镜头畸变。

另一方面,顶部的红线由单线段组成,始终连接两个相邻的角。正如您所看到的,第二条和第三条线段有明显的“弯曲”,因此整个图案上没有直线。底部的红线(细)是从图案的一侧到另一侧的直线,您可以看到线条两侧有一些白色像素的部分。所以你的图案在图像中看起来并不直。

我猜你的图案制作得不好,但这只是一个猜测,最终也可能是一些奇怪的镜头行为。您可以从不同的视图(相同的相机焦点等,如果可能)捕获相同图案的图像以进一步分析。

正如用户3896254(thx)所述,透视扭曲可能会严重放大不同的错误。测量(或手动标记)错误(即使是亚像素精度)可能是另一个问题。

  • 我可以补充一点,由不完美(非平坦)图案引起的微小缺陷和由透镜引起的轻微(或无)畸变在单应性变形后会被强烈放大。在校准过程中您应该始终牢记这一点。此外,在点配准过程中(例如,从锐角捕捉标记)透视失真越大,相对测量误差就会越大,这会降低您的传输估计 (2认同)