当前位置: 首页 > news >正文

相机去畸变,以及双目平行校正----极线校正(一)————之单目畸变校正详细过程

转载:http://blog.csdn.net/wangxiaokun671903/article/details/37973365

  通过相机标定的程序获取了两个相机各自的内参矩阵和畸变系数,以及两个相机达到平行时各自的旋转矩阵。OpencvMatlab都给了我们现成的函数,可以利用这些数据进行去畸变或者双目平行校正,因为有需求要将去畸变和平行校正移植到硬件上,那么自己如何利用这些参数和矩阵写去畸变的程序和双目平行校正的程序呢?我本人发现的网上这方面资料较少。在此总结一下。

去畸变的过程就是针对单目相机进行的变换,平行校正就是针对双目相机的操作。

本文针对单目去畸变的方法展开叙述:

和“从世界坐标系到相机坐标系再到图像物理坐标系最后到图像像素坐标系”过程相逆,我们做去畸变时,是已经通过相机标定获取了相机的内参矩阵和畸变系数的,另外,我们已知的就是相机拍摄出来一副图像。

内参矩阵:

 畸变系数:


 则各参数如下:

 

 去畸变的操作步骤如下:

1),将图像的像素坐标系通过内参矩阵转换到相机坐标系:

 

2),在相机坐标系下进行去畸变操作。

3),去畸变操作结束后,将相机坐标系重新转换到图像像素坐标系。

4),并用源图像的像素值对新图像的像素点进行插值。



插值算法如下:



1[x+1]-x2[y+1]-y3I1([x],[y])4y-[y]5I1([x],[y+1])6x-[x]7I1([x+1],[y])8I1([x+1],[y+1])


 I2(u,v)=1*2*3+1*4*5+6*2*7+6*4*8


编程实例:


 

去畸变之前的图像:



[plain]  view plain  copy
  1. for x=1:W1   
  2. for y=1:H1    
  3. %图像像素坐标系转换到相机坐标系  
  4.         yy=(y-cy)/fy;   
  5.         xx=(x-cx)/fx;  
  6. %在相机坐标系中做去畸变  
  7.         r=xx^2+yy^2;  
  8.         xxx=xx*(1+k21*r+k22*r^2+k23*r^3)+2*p21*xx*yy+p22*(r+2*xx^2);  
  9.         yyy=yy*(1+k21*r+k22*r^2+k23*r^3)+2*p22*xx*yy+p21*(r+2*yy^2);  
  10.     %去畸变后重新将相机坐标系转换到图像像素坐标系  
  11.         xxxx=xxx*fx2+cx2;  
  12.         yyyy=yyy*fy2+cy2;  
  13.         if (xxxx>1 && xxxx<=W2 && yyyy>1 && yyyy<=H2)  
  14.             h=yyyy;  
  15.             w=xxxx;     I22(y,x)=(floor(w+1)-w)*(floor(h+1)-h)*I2(floor(h),floor(w))+(floor(w+1)-w)*(h-floor(h))*I2(floor(h+1),floor(w))+(w-floor(w))*(floor(h+1)-h)*I2(floor(h),floor(w+1))+(w-floor(w))*(h-floor(h))*I2(floor(h+1),floor(w+1));  
  16.         end  



去畸变之后的图片:




相关文章:

  • 摄像机模型与标定—棋盘、亚像素角点和绘制棋盘角点
  • 摄像机模型与标定——单应性
  • 摄像机模型与标定——摄像机标定
  • 摄像机模型与标定——标定函数
  • 摄像机模型与标定——三个坐标系及其之间关系
  • 推导四对对应点单应矩阵的计算公式?
  • 透视投影中已知两平面的单应矩阵,能否求出这两平面的夹角?
  • 相机标定的网页收纳
  • 机器视觉的相机标定到底是什么?
  • 摄像机标定--矫正畸变
  • 机器学习(Machine Learning)深度学习(Deep Learning)资料汇总
  • 机器学习(Machine Learning)深度学习(Deep Learning)资料(下)
  • 【深度学习Deep Learning】资料大全
  • 【机器学习Machine Learning】资料大全
  • 深度学习
  • 【Leetcode】101. 对称二叉树
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • #Java异常处理
  • 0基础学习移动端适配
  • Android开源项目规范总结
  • Codepen 每日精选(2018-3-25)
  • FastReport在线报表设计器工作原理
  • Java多态
  • js如何打印object对象
  • js中forEach回调同异步问题
  • nfs客户端进程变D,延伸linux的lock
  • passportjs 源码分析
  • PV统计优化设计
  • sessionStorage和localStorage
  • SpringCloud集成分布式事务LCN (一)
  • Vim 折腾记
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 时间复杂度与空间复杂度分析
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 主流的CSS水平和垂直居中技术大全
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​linux启动进程的方式
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #### go map 底层结构 ####
  • #pragma multi_compile #pragma shader_feature
  • $L^p$ 调和函数恒为零
  • (C#)获取字符编码的类
  • (C++)八皇后问题
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (简单) HDU 2612 Find a way,BFS。
  • (九)One-Wire总线-DS18B20
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)四层和七层负载均衡的区别
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • /dev下添加设备节点的方法步骤(通过device_create)