最近在标定相机,然后遇到各种问题,看了将近一周终于明白了一些东西,回忆了一下好像就是之前工程光学和高数的东西。。。怕忘了在这里记一下。。。
小孔模型
这个是最常用的成像模型,其实就是认为物体和相机成的像是相似的,
在小孔模型下相机的畸变其实是比较小的。
畸变
小孔模型下畸变分为径向畸变和切向畸变,用opencv做标定的时候会得到cx、cy、fx、fy这几个内参以外,还会得到k1、k2、k3、p1、p2这个5个畸变参数,k1-k3是径向畸变系数,p1、p2是切向畸变系数。
切向畸变
切向畸变是由于制造工艺缺陷导致的镜头与成像平面不平行造成的。大概会变成这样的一个图案。
通常会用这样的公式来描述切向的畸变以及反畸变矫正
径向畸变
径向畸变的原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲,通常是镜头设计的原因。可以发现径向畸变主要是和θ有关(θ是只物点和成像中心的连线与主光轴的夹角)。而和角度相关的函数通常都是由sin、cos这些构成的,所以也可以用泰勒级数进行描述(个人理解)。泰勒级数是一个逐次逼近的函数,可以无线精确但是通常会根据经验人为的选择精确到几次方,在这里通常精确到6次方,所以就变成了下面这个公司,其中的k1、k2、k3就是opencv生成的那3个系数。
鱼眼模型
小孔模型有一个局限就是当视角超过180度的时候就没办法工作了,因为相机平面要无限大才行。所以FOV超过一定程度的时候就需要换成鱼眼模型。
他的做法是先把所有的物成像时先投射到一个半球上,然后再把这个半球投影到成像平面,可以想到这时所有的物会成像为一个圆形。所以我们平时看到的鱼眼镜头的照片都是一个圆形。
这里发生了几个变化,1个是fx和fy变成了一样的数值,因为球和圆的长短轴是相等的。另外一个是取消了切向畸变,我个人的理解是因为光轴的偏转可以用fx、fy来体现,所以切向畸变就没意义了。
所以畸变就只有径向畸变了。所以也只和θ有关了。畸变系数在opencv中会得到k1-k4,而matlab中会求到k1-k3。
泰勒级数
看到了这篇文章我觉得讲得挺好的,就是为什么要做泰勒展开以及泰勒展开是如何推导的,不过他用的这个图实在是有点尴尬,上班的时候打开总是会莫名的心虚。。。https://www.zhihu.com/question/25627482
我大致的总结一下大概的问题是,因为sin、cos这些函数比较难直接直接求得某一处的函数值,比如sin2这种除非用计算器不然很难算。所以我们想能不能用一些容易求得的函数来近似的描述他。比如一个函数f(x)我们用另外一个函数g(x)来描述。如何让他们相等,可以选一个点比如(0,1)这个点,我们让f(0)=g(0),然后让f和g的导数也相等,然后让导数的导数也相等。。。这样就可以逐次逼近f(x),但是因为sin、cos是可以无限求导的,而多项式求导级数会逐渐下降,所以只能逐次逼近这样最终会得到一个g(x) = k1x+k2x2+k3x3......这样的多项式。其中k1-k3这些就是泰勒展开的系数。
网友评论