0

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

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 更省时的其他方法。

谢谢

4

1 回答 1

3

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

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

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

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

于 2013-07-31T16:03:51.260 回答