反向鱼眼失真

Posted

技术标签:

【中文标题】反向鱼眼失真【英文标题】:Reverse Fish-Eye Distortion 【发布时间】:2013-07-31 12:17:45 【问题描述】:

我正在使用鱼眼相机,在进一步计算之前需要反转失真, 在这个问题中,这正在发生Correcting fisheye distortion

src = cv.LoadImage(src)
dst = cv.CreateImage(cv.GetSize(src), src.depth, src.nChannels)
mapx = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_32F, 1)
mapy = cv.CreateImage(cv.GetSize(src), cv.IPL_DEPTH_32F, 1)
cv.InitUndistortMap(intrinsics, dist_coeffs, mapx, mapy)
cv.Remap(src, dst, mapx, mapy, cv.CV_INTER_LINEAR + cv.CV_WARP_FILL_OUTLIERS,  cv.ScalarAll(0))

这样做的问题是,重映射函数通过这种方式遍历所有点并从中创建新图片。每帧都这样做很耗时。 我正在寻找的方法是将鱼眼图片上的点对点转换为正常图片坐标。

我们采用的方法是在输入帧上进行所有计算,然后将结果坐标转换为世界坐标,因此我们不想遍历图片的所有点并创建一个新的它。 (时间对我们来说真的很重要)

在矩阵 mapx 和 mapy 中有一些点到点的转换,但很多点没有完全转换。 我试图插入这个矩阵,但结果不是我想要的。

任何帮助都将不胜感激,即使是比 cv.Remap 更省时的其他方法。

谢谢

【问题讨论】:

从这个问题中不清楚您是想要不扭曲图像还是只是一组离散的图像位置(可能不是整数,即具有亚像素精度)。如果是后者,pf 位置的数量是否会比图像区域小得多?请澄清。 @FrancescoCallari 是的,你是对的,我只想要少量的点,基本上我想拾取轮廓会找到它们的中心点,并希望它把它带到不失真的位置,然后鸟瞰位置 【参考方案1】:

我想你想要的是cv.UndistortPoints()

假设您在扭曲的图像中检测到一些点特征distorted,您应该能够执行以下操作:

cv.UndistortPoints(distorted, undistorted, intrinsics, dist_coeffs)

这将允许您处理未失真的点,而无需为每一帧生成新的未失真图像。

【讨论】:

非常感谢,我调查了一下。所以基本上为了找到相机矩阵和 dist_coeffs 我必须做棋盘把戏?我们正在做类似的事情,以便从输入中获得鸟瞰图!是同一个过程吗? @Khashayar 如何获得相机和失真参数取决于您自己。用棋盘校准是获得它们的一种方法。由于您发布了使用它们的代码,我假设您已经拥有该数据。 相当整洁。谢谢你。

以上是关于反向鱼眼失真的主要内容,如果未能解决你的问题,请参考以下文章

如何找到未失真的鱼眼图像和正常图像之间的差异?

如何使用 OpenCV 使裁剪后的鱼眼图像不失真

在Matlab中去除图像的鱼眼镜头失真时出错[重复]

如何修改 d3js 鱼眼失真,使其支持半径

d3.js 地图上的鱼眼失真

不失真的鱼眼图像错误