我已完成相机校准。现在我想得到Bird's Eye的棋盘图片。正如我所示。但结果很奇怪,看起来不是一个正方形。你可以看到pic3.Every square是7.95x7.95。 smoebody知道为什么?
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());
答案 0 :(得分:3)
一般来说,单应性会将直线变换为直线。
由于您只提供了4个角,因此透视变换是唯一定义的。因此,如果你确实选择了正确的4个角但是在模式中的某个地方存在错误的结构,那么这些结构在输入图像中肯定是错误的。
在您的场景中,这可能是由镜头失真引起的,因此实际上直线在(输入)图像中看不到直线。或者输入图像中的线条在现实世界中并不直观,例如,您的图案底座不是完美的平面,或者您的图案未在平面上粘合良好。
在GIMP中我为你的图片添加了一些标记。
轮廓(绿点)是从一个角到下一个角的单条直线。正如你所看到的,它们在图案底座的边框上非常好地躺着,这暗示你的图像中没有太多的镜头扭曲。
另一方面,顶部红线由单线段组成,总是连接两个相邻的角。如您所见,第2和第3线段存在明显的“弯曲”,因此整个图案上没有直线。 底部红线(细线)是从图案的一侧到另一侧的直线,您可以看到有些部分的白色像素位于线的两侧。因此,您的图案在图像中似乎不是直的。
我猜你的模式不是很好,但这只是一个猜测,最后它可能是一些奇怪的镜头行为。您可以从不同视图捕获相同模式的图像(如果可能,可以使用相同的相机焦点等)以进一步分析。
如user3896254(thx)所述,透视变形可能会强烈地放大不同的误差。测量(或手动标记)误差(即使在亚像素精度下)可能是另一个问题。