通过鱼眼扭曲功能扭曲直线并在图像中正确绘制

Posted

技术标签:

【中文标题】通过鱼眼扭曲功能扭曲直线并在图像中正确绘制【英文标题】:Distort a straight line via fisheye distortion function and draw it correctly in image 【发布时间】:2016-06-07 19:05:41 【问题描述】:

我在世界坐标中有一条线并将其投影到图像上(如本问题math.stackexchange 中所述)。这会在图像空间中产生一个简单的线方程,因此我可以在图像中使用 OpenCV 轻松打印它。

现在我想将线条投影到鱼眼相机图像中。因为我有一个相应的非线性失真函数,所以我可以很容易地扭曲点。现在最简单的方法是通过这个函数从生成的线中扭曲每个点。但这会导致多个线段和未设置的像素(通常属于失真线)。

我想知道什么是获得正确扭曲线的聪明方法。也许还需要以不同的方式处理线投影?我可以更频繁地对直线进行采样(即使用亚像素坐标),但我认为这并不能保证我得到正确的解决方案。

编辑:

我的失真函数是一个简单的多项式

r(a) = k1*a+k2*a^2+k3*a^3+k4*a^4

其中a 是未失真的入射光线与光轴的角度,r 是失真图像中像素的半径。你可以阅读更多关于here的信息。

【问题讨论】:

请张贴(或指向)您打算使用的镜头畸变模型的方程。 @FrancescoCallari :我在原始帖子中添加了信息。 【参考方案1】:

简单的解决方案确实是提高您的线条分辨率。 如果添加更多像素(子像素更好),那么失真后的图像会更好看。

我认为更正确的方法是向后映射。找到从失真图像中的每个像素(正方形,整数)到未失真图像中像素(四边形,实数)的映射。 这将确保您的扭曲线不会有任何孔洞。

【讨论】:

我已经有一个带有相应向后映射的查找表。正如你所说,由于我在未失真的图像中有一个线方程,我可以计算失真图像中的线。但这意味着,对于一条线,如果线方程成立,我必须测试失真图像中的每个像素。或者有什么技巧可以用来加快这个过程。 @Vaniax。首先,逆映射并不总是那么容易。在普通相机中,给定失真系数,从未失真到失真的映射很容易,但另一种方式涉及迭代求解(x 和 y 耦合)。幸运的是,您使用的模型是可逆的,因此不应该存在任何准确性问题。其次,我已经假设您已经在未失真的图像中创建了像素图像,我不是在谈论原始线方程。为什么你这么关心速度?主要因素是您将执行的插值以获得像素值。

以上是关于通过鱼眼扭曲功能扭曲直线并在图像中正确绘制的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 cv2.fisheye.undistortPoints 将扭曲空间中的点转换为未扭曲空间中的点?

如何使用 opencv.omnidir 模块去扭曲鱼眼图像

使用opencv3鱼眼模型的圆形鱼眼扭曲

如何将未扭曲图像的点投影到扭曲图像?

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

整流鱼眼镜头到飞机上