matlab畸变校正代码_FPGA 的双目视觉毕业设计(五)之matlab 极线矫正算法实现

1.简述

      有博客做了很详细的算法介绍,后面我转发过来,这里就直接分享matlab的源码,很简单的算法结构,不做详细解说。

2.我的matlab双目极线矫正源码

clear;clc;close all;  image_left = imread('./IMAG_L1.BMP');image_right= imread('./IMAG_R1.BMP'); [H, W, C] = size(image_left);  %内参A_L = [ 429.99849   0.0         376.35001;        0.0         427.66238  235.38535;        0.0         0.0         1.0];  A_R = [ 422.52402   0.0         387.14095;        0.0         421.20306   210.78373;        0.0         0.0         1.0];   fx1 = A_L(1,1);fy1 = A_L(2,2);cx1 = A_L(1,3);cy1 = A_L(2,3); fx2 = A_R(1,1);fy2 = A_R(2,2);cx2 = A_R(1,3);cy2 = A_R(2,3); fx = (fx1 + fx2)/2;fy = (fy1 + fy2)/2;cx = (cx1 + cx2)/2;cy = (cy1 + cy2)/2; AA = [fx    0   cx;      0     fy  cy;      0     0    1];%外参   D_L = [  -0.02811   0.01014   -0.00971   -0.00288  0.00000 ];D_R = [  -0.01148   -0.00157   -0.01033   0.00455  0.00000 ];   k11 = D_L(1,1);k12 = D_L(1,2);k13 = D_L(1,5);p11 = D_L(1,3);p12 = D_L(1,4); k21 = D_R(1,1);k22 = D_R(1,2);k23 = D_R(1,5);p21 = D_R(1,3);p22 = D_R(1,4); %旋转与平移 om = [ 0.00214   -0.03862  -0.00286] ; R_l = rodrigues(-om/2);R_r = R_l';  for v = 11 : H-10    for u = 26 : W-2                u1 = (u - cx)/fx;        v1 = (v - cy)/fy;                pos1 = inv(R_l)*[u1 v1 1]';        pos2 = inv(R_r)*[u1 v1 1]';                                x1 = pos1(1,:)/pos1(3,:);        y1 = pos1(2,:)/pos1(3,:);        r1 = x1^2 + y1^2;                        x2 = pos2(1,:)/pos2(3,:);        y2 = pos2(2,:)/pos2(3,:);        r2 = x2^2 + y2^2;                xx1 =  x1*(1 + k11*r1 + k12*r1^2 + k13*r1^3) + 2*p11*x1*y1 + p12*(r1 + 2*x1^2) ;        yy1 =  y1*(1 + k11*r1 + k12*r1^2 + k13*r1^3) + 2*p12*x1*y1 + p11*(r1 + 2*y1^2) ;                        xx2 =  x2*(1 + k21*r2 + k22*r2^2 +k23*r2^3) + 2*p21*x2*y2 + p22*(r2 + 2*x2^2) ;        yy2 =  y2*(1 + k21*r2 + k22*r2^2 +k23*r2^3) + 2*p22*x2*y2 + p21*(r2 + 2*y2^2) ;                xxx1 = xx1*fx1 + cx1;        yyy1 = yy1*fy1 + cy1;                xxx2 = xx2*fx2 + cx2;        yyy2 = yy2*fy2 + cy2;                 if( xxx1 > 1 && yyy1 >1 &&  xxx1 <= 752 && yyy1 <=480)            w1 = xxx1;            h1 = yyy1;                         new_image_L(v-10,u-25)=  (floor(w1+1)-w1) * (floor(h1+1)-h1) * image_left(floor(h1),floor(w1)) + (floor(w1+1)-w1) * (h1-floor(h1)) * image_left(floor(h1+1),floor(w1)) + (w1-floor(w1)) * (floor(h1+1)-h1) * image_left(floor(h1),floor(w1+1) ) + (w1-floor(w1)) * (h1-floor(h1)) * image_left(floor(h1+1),floor(w1+1));         end                 if(xxx2 > 1 && yyy2 >1 &&  xxx2 <= 752 && yyy2 <=480)            w2 = xxx2;            h2 = yyy2;                        new_image_R(v-10,u-25)=  (floor(w2+1)-w2) * (floor(h2+1)-h2) * image_right(floor(h2),floor(w2)) + (floor(w2+1)-w2) * (h2-floor(h2)) * image_right(floor(h2+1),floor(w2)) + (w2-floor(w2)) * (floor(h2+1)-h2) * image_right(floor(h2),floor(w2+1) ) + (w2-floor(w2)) * (h2-floor(h2)) * image_right(floor(h2+1),floor(w2+1));         end    endendsize(new_image_L)size(new_image_R) ori_image = [image_left,image_right];cor_image = [new_image_L,new_image_R];[e, f, g] = size(ori_image); subplot(2,1,1);imshow(ori_image);title('校正之前'); M = 10;  % 水平分量N = 10;  % 垂直分量lw = 0.001;  % 划线宽度mx= ones(1,M+1);my = linspace(1,e,M+1);% 画水平线for k = 1:M+1    line([mx(k) f*mx(k)],[my(k) my(k)],'color','g','LineWidth',lw);endnx = linspace(1,f,N+1);ny = ones(1,N+1);% 画垂直线for k = 1:N+1    line([nx(k) nx(k)],[ny(k) e*ny(k)],'color','g','LineWidth',lw);end  subplot(2,1,2);imshow(cor_image);title('校正之后'); M = 10;  % 水平分量N = 10;  % 垂直分量lw = 0.001;  % 划线宽度mx= ones(1,M+1);my = linspace(1,e,M+1);% 画水平线for k = 1:M+1    line([mx(k) f*mx(k)],[my(k) my(k)],'color','g','LineWidth',lw);endnx = linspace(1,f,N+1);ny = ones(1,N+1);% 画垂直线for k = 1:N+1    line([nx(k) nx(k)],[ny(k) e*ny(k)],'color','g','LineWidth',lw);end 

3.矫正效果图

         能看出还是有误差.

3bcbe1dd530932ae0514b4aae8dffc64.png

 4.疑惑与说明

     1)om是matlab标定得到的旋转矢量矩阵,需要用 rodrigues 函数转换为旋转角度(弧度)。

     2)这个拆分旋转矩阵的方法我是参考matlab工具箱里面的,不知道准确性。查阅很多论文和博客,以及请教群友也没给出很好答案。这个呢我算是硬凑上去的。如有知道的朋友,麻烦留言或者私聊一下,感激不敬!

371e08853dde0b8c98a0a1eabba85588.png

     3)说明一下,在做畸变矫正和极线矫正时,发现我的摄像头镜头不太好,大光圈那种,录下的图片很模糊,影响精度,所以这儿换了无畸变的镜头,很清晰了。所以和前面博客图片有些出入,但不影响。使用无畸变镜头并不意味着真没畸变,只是畸变很小,所以我还是进行畸变矫正。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值