相机畸变矫正

这里引用了高翔博士打《SLAM 十四讲》,首先谢谢高博啦!

理论知识

dis7
img1
dis2
dis3
dis4
dis5

说明:本文参考的应该是《SLAM 十四讲》第一版,在这里有个错误,后版中改了过来,这里提出,免得误导博友。公式5.11 - 5.14 中打Xcorrected和Ycorrected表示的是未矫正的坐标,也就是存在畸变打点的坐标。这里描述的是相机畸变的过程,将该过程取反即是去畸变过程)

畸变参数获取

  1. 在标定相机时,即可获得径向畸变参数k,和切向畸变参数p。
  2. 在式中出现的(r,theta)是由像素坐标转到极坐标得到。
  3. fx和fy,cx和cy由相机内参得到。
  4. x,y:理想图像中不存在畸变的点的坐标
  5. Xcorrected和Ycorrected:畸变之后点的坐标

目的:求取x,y

矫正效果

corrected1
corrected2

说明:图片中打红色的圆是矫正之后打点,其相邻的角点是存在畸变的点。
(不要盯着我萌萌哒打师兄看哦!!!)

实现

    for(int i=0; i<size; i++)
    {
        Mx = P_Norm[i].x;
        My = P_Norm[i].y;
        rSquare = pow(Mx, 2) + pow(My, 2);
        A = (1 + strCamPara.k1 * rSquare + strCamPara.k2 * pow(rSquare, 2)
             + strCamPara.k3 * pow(rSquare, 3));
        B = 2*strCamPara.p1;
        C = 2*strCamPara.p2;
        D = strCamPara.p2*rSquare;
        E = strCamPara.p1*rSquare;

        a = (My - E)/(Mx - D);
        b = a*B + C;
        d = D - Mx;
        //solve the formula "b*x^2 + A*x + d = 0", then we will get 'x'
        e = pow(A, 2) - 4*b*d;

        //b=0 ?
        if(b==0)
        {
            //if b=0, then get the formula "A*x + d = 0", solve it and get 'x'
            x1 = d/A;
            y1 = a*x1;
            //cout<<i<<" e=0, and the point is "<<Point2f(x1,y1)<<endl;
            p_temp.push_back(Point2f(x1,y1));
        }
        else
        {
            if(e >= 0)
            {
                x1 = (-A + sqrt(e))*0.5/b;
                x2 = (-A - sqrt(e))*0.5/b;
                y1 = a*x1;
                y2 = a*x2;

        //give up these points Point2f(x1,y2),Point2f(x2,y1),Point2f(x2,y2)
        //cout<<i<<" point is "<<Point2f(x1,y1)<<endl;
        //cout<<i<<" point is "<<Point2f(x1,y2)<<endl;
        //cout<<i<<" point is "<<Point2f(x2,y2)<<endl;
        //cout<<i<<" point is "<<Point2f(x2,y2)<<endl;
                p_temp.push_back(Point2f(x1,y1));
            }
            else
            {
                cerr<<"e < 0, is "<<e<<endl;
                continue;
            }
        }
    }

完整的实现过程点击下载,内附存在畸变打照片及相机参数。

================分割线=====================

更正一下,SLAM十四讲的内容应该是没有问题的,而且很多资料上都和其是一致的
让我陷入怀疑书本有误的是上述代码(代码是按照公式推导出来的,没有问题)运行出来的结果,如上图,给人的感觉就是矫正,相反如果照着书本上编写相应的代码(这个比较容易,可以自己试试一下)并且运行之后的结果给人的感觉畸变过程,而且畸变更严重了,很奇怪的感觉

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
鱼眼相机畸变矫正是修正鱼眼相机拍摄图像中的畸变问题,使图像更符合人眼所见的真实场景。Python提供了一些库和方法可以进行鱼眼相机畸变矫正。 一种常用的方法是通过相机的标定矫正参数来进行畸变矫正。为了进行相机标定,可以使用OpenCV库中的`cv2.calibrateCamera`函数,它可以根据一组已知的特征点和对应的畸变图像,计算出相机的内部和外部参数。接着,可以使用`cv2.undistort`函数对图像进行畸变矫正。 另一种常用的方法是使用球面映射法进行畸变矫正。这种方法将鱼眼图像映射到一个球面上,然后再将球面投射成平面图像。这可以通过使用OpenCV库中的`cv2.fisheye.undistortImage`函数来实现。这个函数可以根据鱼眼相机的标定参数,对图像进行畸变矫正。 在进行鱼眼相机畸变矫正之前,需要先进行相机的标定。可以使用OpenCV库提供的相机标定工具进行标定。标定过程中需要使用特殊的标定板,以及一组已知的特征点和对应的畸变图像。根据标定结果,可以得到相机的内部和外部参数,进而进行畸变矫正。 总结起来,Python提供了多种方法和库来进行鱼眼相机畸变矫正,其中包括使用相机标定参数进行矫正和使用球面映射法进行矫正。具体方法的选择可根据实际需求和具体场景来确定。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值