关于3d场景坐标映射对应2d相机的畸变处理实践

这段时间在优化3d场景坐标(x,y,z)映射到相机的2d图片(u,v)的代码.在之前的实现里,我这边前端实现了无畸变的坐标转换,但是在一些畸变比较大的图片里,坐标点显示偏差较大,功能无法使用.

之前我们标注平台的3d立方体映射到相机图片上是通过后端计算,对需求的实时性上面有很大的影响.于是近期我在尝试前端去实现相机畸变的矫正研究.

https://zhuanlan.zhihu.com/p/94445955
首先我网上搜索相机畸变方面文章,主要参考了知乎,然后咨询了一下作者本人,

大概理解了坐标转换的原理和顺序:
已知世界坐标(x,y,z)
1.根据相机矩阵转换为相机坐标(x相,y相,z相) z轴正方向为相机朝向,x轴向右,y轴向下
2.坐标归一化得到 (x归,y归,1) = (x相/z相,y相/z相,1)
3.得到距离 r = sqrt(x归^2+y归^2)
4.这时候进行相机畸变调整 得到x',y'

x' = x归*(1+k1*r^2+k2*r^4+k3*r^6)+2*p1*x归*y归+p2*(r^2+2*x归^2)
y' = y归*(1+k1*r^2+k2*r^4+k3*r^6)+2*p2*x归*y归+p1*(r^2+2*y归^2)

5.(x',y',1)乘以相机内参得到最终(u,v)值

开发完成后,发现有一部分照片的畸变调整还是不行,反而更离谱
仔细调试代码+借阅后台代码进行查看
http://image.fengyitong.name/20230211_code.jpg

发现后台是根据不同相机做不同处理的,于是再次询问了上面知乎的作者Mver,确定了鱼眼相机的处理逻辑和普通针孔相机处理逻辑不一致,又翻阅了关于鱼眼相机畸变处理的资料
https://zhuanlan.zhihu.com/p/577186117
https://blog.csdn.net/qq_39642978/article/details/112758040
得到结论

已知世界坐标(x,y,z)

转换为相机的相对坐标
相机坐标归一化(x相/z相,y相/z相,1) => (x归,y归,1)
计算 r = sqrt(x归^2+y归^2)
计算 theta = atan(r)
计算矫正 r_d = theta(1+k1theta^2+k2theta^4+k3theta^6+k4*theta^8)
计算 scale = r_d / r
计算 x' = x归 scale ; y' = y归 scale
(x',y',1) 乘以相机内参得到图片像素(u,v)

其中做到第5布计算矫正r_d的时候,卡住了我一晚上没成功,最终通过另外一个博客得到正解(上面博客介绍应该也是对的,只不过参数值和opencv不同)
https://blog.csdn.net/qq_16137569/article/details/112398976

到这步总算所有畸变都处理成功,最终测试成功时,那一刻感到从心底升起的喜悦,只感觉神经气爽,海阔天空
我想这就是高级多巴胺吧,是让我能在求知的路上一路前进的动力来源.O(∩_∩)O
在这里感谢Mver的帮助,虽然他肯定不知道

标签: none

添加新评论