• 【CV】相机畸变


    相机畸变

    由于摄像机制造工艺偏差,以及入射光线在通过各个透镜时的折射误差和CCD点阵位置误差等,世纪的光学系统存在着非线性几何失真,从而使目标像点与理论像点之间存在着多种几何畸变。

    其中影响最大的是径向畸变和切向畸变。径向畸变来自于透镜形状,切向畸变来自于整个摄像机的组装过程。

    径向畸变主要有桶形畸变,枕形畸变和胡子畸变。主要原因是镜头形状的缺陷。

    其中径向畸变成像仪中心畸变为0,随着向边缘移动,畸变越来越严重。可以通过下面的泰勒级数展开式进行校正:

    Xc = x ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 )

    Yc = y ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 )

    r是该点距离成像中心的距离,r = x^2 + y^2xy是图像中畸变后的位置坐标,XcYc是通过校正后得到的真实坐标,k1k2k3...是参数。

     

    切向畸变主要有薄棱镜畸变和离心畸变。主要原因是由于透镜制造上的缺陷使得透镜本身与图像平面不平行。可以通过如下公式来矫正:

    Xc = x + [ 2p1y + p2 ( r^2 + 2x^2 )]

    Yc = y + [ 2p2x + p1 ( r^2 + 2y^2 )]

    r是该点距离成像中心的距离,r = x^2 + y^2 xy是图像中畸变后的位置坐标,XcYc是通过校正后得到的真实坐标,p1p2是参数。

     

    opencv畸变模型

    径向畸变模型:

    Xc = x ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 )

    Yc = y ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 )

    切向畸变模型:

    Xc = xd + [ 2p1xdyd + p2 ( r^2 + 2xd^2 )]

    Yc = yd + [ 2p2xdyd + p1 ( r^2 + 2yd^2 )]

    可得(一般情况下,薄棱镜畸变可以忽略不计,故opencv2.0版本只考虑了径向畸变和切向畸变):

    Xc = xd ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 ) + [ 2p1xdyd + p2 ( r^2 + 2xd^2 )] ( 1 + p3r^2 + … )

    Yc = yd ( 1 + k1r^2 + k2r^4 + k3r^6 ) / ( 1 + k4r^2 + k5r^4 + k6r^6 ) + [ 2p2xdyd + p1 ( r^2 + 2yd^2 )] ( 1 + p3r^2 + … )

    p3为考虑切向畸变的扩展,此外设为0即可。

    张正友标定中只有k1,k2,k3,p1,p2五个参数,对于质量比较好的相机切向畸变很小可忽略,k3也可忽略,张正友标定中默认p1,p20

     

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    bash中常见环境变量env、set、export 、declare与bash漏洞原理
    Java-获取时间方法比较
    Java-数据类型转换大全
    Java-后端图片处理(图片拼接)
    Java-AOP切面
    Java-异常状态码
    Spring Data JPA-日常使用
    Http-请求头各种参数设置
    Java-java命令运行jar编译问题
    SpringBoot-文件上传
  • 原文地址:https://www.cnblogs.com/ldudxy/p/14821382.html
Copyright © 2020-2023  润新知