这段时间在优化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)值
开发完成后,发现有一部分照片的畸变调整还是不行,反而更离谱
仔细调试代码+借阅后台代码进行查看
发现后台是根据不同相机做不同处理的,于是再次询问了上面知乎的作者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的帮助,虽然他肯定不知道
想想你的文章写的特别好
不错不错,我喜欢看 https://www.ea55.com/
《切格瓦拉传下部游击队》战争片高清在线免费观看:https://www.jgz518.com/xingkong/92906.html
《Def喜剧果酱25》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/53430.html