2015-12-14 50 views
3

我已经完成摄像机标定。现在我想要获得棋盘图片的鸟瞰图。如下所示。但结果是奇怪的,它看起来不是一个正方形。你可以看到pic3.Every广场是7.95x7.95。做吸尘器为什么?摄像机标定和OpenCV中的鸟眼投影

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()); 

enter image description here

enter image description here enter image description here

+1

可能是镜头畸变或图像不完美的平面度。您的输入图像中是否存在 – Micka

+0

? – Micka

+1

@Micka使这个答案:) – alexisrozhkov

回答

3

通常的单应性将改变直线至直线。

由于您只提供了4个角,所以透视变换是唯一定义的。所以如果你确实已经选择了正确的4个角落,但在模式内的某个地方有错误的结构,这些结构在输入图像中一定是错误的。

在您的情况下,这可能发生在镜头变形上,因此实际上的直线在(输入)图像中不可见为直线。或者您的输入图像中的线条在现实世界中不是直的,例如,您的图案底座不是完全平面的,或者您的图案没有很好地粘在飞机上。

在GIMP我已经添加了一些标记到您的图像。

enter image description here

大纲(绿点)是单直线从一个角到下一个。正如你所看到的,它们在图案底座的边框上很好地说谎,这暗示你的图像没有太多的镜头失真。

另一方面,顶部红线由单线段组成,连接两个相邻拐角。如您所见,第二和第三线段存在显着的“弯曲”,所以在整个图案上不存在直线。 底部的红线(细)是从图案的一侧到另一侧的直线,如您所见,白线的两侧都有一些白色像素。所以你的图案在图像中看起来不是直的。

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

如用户3896254(thx)所述,不同的错误可能被透视变形强烈放大。测量(或手动标记)错误(即使是亚像素精度)也可能是另一个问题。

+2

我可以补充说,由不完整(非平坦)图案引起的轻微缺陷以及镜头引起的轻微(或不)变形在通过单应性变形后被强烈放大。校准过程中应始终记住这一点。此外,在点对准过程中(例如,从锐角捕获标记),您具有更多的透视失真,则会出现较大的相对测量误差,这会降低您的透视估计 – alexisrozhkov