• 使用python+opencv进行图像的去畸变


    一、去畸变的分类:

    1.1.在普通相机cv模型中,畸变系数主要有下面几个:(k1; k2; p1; p2[; k3[; k4; k5; k6]] ,其中最常用的是前面四个,k1,k2为径向畸变系数,p1,p2为切向畸变系数。

    2.在fisheye模型中,畸变系数主要有下面几个(k1,k2,k3,k4)

    这篇文章主要介绍普通相机cv模型

    二、去畸变的两种方法

    其实去畸变可以分为有两种方法(每种方法均给出参数链接,有兴趣可以跳转查看)

    1.getOptimalNewCameraMatrix+undistort(本篇文章简写为GU)
    2.getOptimalNewCameraMatrix+initUndistortRectifyMap+remap(本篇文章简写为GIR)

    区别:GU方法中的undistort其实是第二种方法GIR中initUndistortRectifyMap+remap的结合,在调用undistort函数的时候,内部其实就是在调用initUndistortRectifyMap+remap。

    使用范围:对于一张图片,GU方法和GIR方法都可以使用,但是当图片多的时候,GU方法就会浪费时间,因为initUndistortRectifyMap()这个函数在处理多个图片时,他的输出(mapx、mapy)其实只要计算一次就够了,然后把(mapx、mapy)作为remap的其中两个输入进行畸变校正,只需要多次调用remap即可。

    三、函数分析

    1.**alpha**参数

    这里主要说一下getOptimalNewCameraMatrix()函数中的alpha参数,他的大小在0~1之间,如果
    alpha=1,原图像的所有像素能够得到保留,也就是在去畸变之后会出现黑色区域;alpha=0,会将黑色像素去除;在0~1之间,会按照比例重新计算fx,fy,cx,cy。这里alpha的取值,其实是在改变inner和outer矩阵

    事实上,内矩阵inner(alpha=0)等同于不含任何黑色边框的图幅大小,而外矩阵outer(alpha=1)等同于原图大小

    图片引用自一篇文章(https://blog.csdn.net/a472609409/article/details/90515742)
    图一
    alpha=1
    图二

    alpha=1
    2.**initUndistortRectifyMap()**函数

    1.cameraMatrix:输入相机矩阵1

    2.distCoeffs:输入参数,相机的畸变系数:(k1,k2,p1,p2[,k3[,k4,k5,k6[,s1,s2,s3,s4[,τx,τy]]]]),有4,5,8,12或14个元素。如果这个向量是空的,就认为是零畸变系数。
    3.R:可选的修正变换矩阵,是个3*3的矩阵。通过stereoRectify计算得来的R1或R2可以放在这里。如果这个矩阵是空的,就假设为单位矩阵。在cvInitUndistortMap中,R被认为是单位矩阵。
    4.newCameraMatrix:新的相机矩阵2

    5.size:未畸变的图像尺寸。
    6.m1type:第一个输出的映射的类型,可以为 CV_32FC1, CV_32FC2或CV_16SC2,参见cv::convertMaps。
    7.map1:第一个输出映射。
    8.map2:第二个输出映射。

    3.**undistort()**函数

    如果undistort函数的最后一个参数使用原相机内参,那么得到的结果就是上面图1的结果,相当于alpha=0的情况。

    如果undistort函数的最后一个参数使用getOptimalNewCameraMatrix计算出来的新矩阵,那么得到损失像素后的图像,也就是当alpha=1时,得到上面图2的结果。

    四、总结

    好了,对于图片的矫正,还有两个函数,分别是getOptimalNewCameraMatrix,remap,不过这两个函数没有太多太容易出错的地方,根据上面给出的参数链接就可以写对。

    目前这篇文章只是对图像进行去畸变,如果要对某一个像素点进行去畸变,可以参考引用5,里面有具体介绍!

    目前学到这些,后续我也要对某一个像素点进行去畸变,到时候再进行更新!

    五、引用

    感谢下列文章的帮助:
    1.https://www.cnblogs.com/riddick/p/6711263.html
    2.https://blog.csdn.net/a472609409/article/details/90515742
    3.https://blog.csdn.net/u013341645/article/details/78710740
    4.https://zhuanlan.zhihu.com/p/74133719
    5.https://zhuanlan.zhihu.com/p/137053640(该篇文章使用C++进行编写,但是内容还是排版都看到很舒服)
    6.https://www.jianshu.com/p/6daa8dbbfa30(该篇文章主要对畸变函数进行比较)

  • 相关阅读:
    Kotlin 学习 (一)
    Spring Boot 学习(一)
    三大特性之继承
    OC中的点语法
    getter和setter
    三大特性之封装
    匿名对象
    对象作为返回值
    对象作为参数的连续传递
    对象作为参数传递
  • 原文地址:https://www.cnblogs.com/ycycn/p/14063841.html
Copyright © 2020-2023  润新知