1.光学相机镜头一般都存在畸变的问题,畸变属于成像的几何失真,它是由于焦平面上不同区域对影像的放大率不同而形成的画面扭曲变形现象。除了一些特定的场合,大部分情况下,这些失真都是需要校正到正常人眼不产生扭曲的程度。

2常见的畸变是枕形畸变,桶形畸变和线性畸变。广角镜头的摄像设备拍摄出来的图像经常会有桶形畸变的问题。原因在于广角镜头使用的是凸透镜,初中物理知识告诉我们凸透镜会对光线起汇聚作用,这是光的折射造成的。而离镜头中心越远,折射效果越强,因而其拍出来的照片会以镜头中心为圆心,呈圆形向外扩展失真。

3.摄像头精确校正需要先获取标定数据,可以利用张正友的张氏标定法,或者使用MATLAB标定。

4.一般摄像头畸变校正可以使用OPENCV,OpenCV的畸变参数总共有五个,径向畸变3个(k1,k2,k3)和切向畸变2个(p1,p2)。

径向畸变: 
 
切向畸变: 
 
以及在OpenCV中的畸变系数的排列(这点一定要注意k1,k2,p1,p2,k3),千万不要以为k是连着的。 

其公式由好像是泰勒公式,K和P应该可以无限精确,也可以横竖使用不同参数,r=x*X+y*y;

5.这里不对标定过程和opencv校正过程详细推理。这里使用代码实现简单的畸变算法,考虑到效率和实时性,略去切向畸变,径向畸变假设x,y相等且只取一阶K值,其实一阶K值大约已经可以把畸变控制人眼接受的范围内了。

6.代码

public class LensCorrect2 {// 镜头校正查找表private Point[][] CorrInd = null;// new Point[480][640];private double k1 = 0f;private double k2 = 0f;private Bitmap mBm = null;private int mW = 0;private int mH = 0;private int max_x = 0, max_y = 0;private int min_x = 0, min_y = 0;// 镜头径向畸变校正初始化public LensCorrect2(double k1, double k2, Bitmap mBm) {super();this.k1 = k1;this.k2 = k2;this.mBm = mBm;this.mW = mBm.getWidth();this.mH = mBm.getHeight();int cw = mW >> 1;int ch = mH >> 1;CorrInd = new Point[mH][mW];Log.i("XXXXX", "imgHeight=" + mH);Log.i("XXXXX", "imgWidth=" + mW);int it;int jt;int it2;int jt2;for (int i = 0; i < mH; i++) {it = (i + 1) - ch; // (i+1) 是其真正的图像坐标for (int j = 0; j < mW; j++) {double temp;jt = (j + 1) - cw; // (j+1) 是其真正的图像坐标temp = 1 + k1 * it * it + k2 * jt * jt;it2 = (int) (temp * it);jt2 = (int) (temp * jt);it2 = it2 + ch + 1;jt2 = jt2 + cw + 1;// Log.i("AAAAA", "imgHeight="+imgHeight);// Log.i("AAAAA", "imgWidth="+imgWidth);// Log.i("AAAAA", "i="+i);// Log.i("AAAAA", "j="+j);// Log.i("XXXXX", "jt2="+jt2);// Log.i("XXXXX", "it2="+it2);if (max_x < jt2) {max_x = jt2;}if (min_x > jt2) {min_x = jt2;}if (max_y < it2) {max_y = it2;}if (min_y > it2) {min_y = it2;}Point p = new Point(jt2, it2);CorrInd[i][j] = p;}}Log.i("XXXXX", "max_x=" + max_x);Log.i("XXXXX", "min_x=" + min_x);Log.i("XXXXX", "max_y=" + max_y);Log.i("XXXXX", "min_y=" + min_y);}public Bitmap getLensCorrect() {Bitmap bm = Bitmap.createBitmap((max_x - min_x) + 1,(max_y - min_y) + 1, Bitmap.Config.ARGB_8888);int it2;int jt2;for (int i = 0; i < mH; i++) {for (int j = 0; j < mW; j++) {it2 = CorrInd[i][j].y;jt2 = CorrInd[i][j].x;bm.setPixel(jt2 - min_x, it2 - min_y, mBm.getPixel(j, i));}}return bm;}public Bitmap getLensCorrect0() {Bitmap bm = Bitmap.createBitmap(mW, mH, Bitmap.Config.ARGB_8888);int it2;int jt2;for (int i = 0; i < mH; i++) {for (int j = 0; j < mW; j++) {it2 = CorrInd[i][j].y;jt2 = CorrInd[i][j].x;if ((it2 >= 0) && (jt2 >= 0) && (it2 < mH) && (jt2 < mW)) {// bm.setPixel(j, i, mBm.getPixel(jt2, it2));bm.setPixel(jt2, it2, mBm.getPixel(j, i));}}}return bm;}}

7.下图对图像进行反畸变,由于用于测试的广角相机手机找不到了,没有找到合适的图片,使用一下没有变形的图片,对其做反桶形畸变,反畸变后,损失的像素需要插值补充完整

android广角相机畸变校正算法和实现相关推荐

  1. matlab相机畸变校正csdn,android广角相机畸变校正算法和实现示例

    1.光学相机镜头一般都存在畸变的问题,畸变属于成像的几何失真,它是由于焦平面上不同区域对影像的放大率不同而形成的画面扭曲变形现象.除了一些特定的场合,大部分情况下,这些失真都是需要校正到正常人眼不产生 ...

  2. 鱼眼图像畸变校正matlab,鱼眼镜头畸变校正算法的设计

    王赛男 刘涛 左震宇 摘   要:鱼眼镜头的拍摄角度大,成像角度宽,但是在进行图像采集和成像的过程中存在大量畸变,直接使用采集而来的图像很难满足实际需求,因此需要对图像进行后续处理.本文根据摄像机参数 ...

  3. 鱼眼校正c语言算法,一种简单而精确的鱼眼图像校正算法研究

    舒旭 摘 要: 针对鱼眼图像的校正提出了一种有效区域提取算法,并在鱼眼图像的球面物投影平面展开时与目标半立方体的校正平面建立线性映射.实验结果表明,该算法能有效地提取鱼眼图像轮廓的有效区域,同时半立方 ...

  4. 图像处理中几何畸变校正,图像纠正的方法有哪些

    如何通过人工神经网络实现图像识别 . 人工神经网络(ArtificialNeuralNetworks)(简称ANN)系统从20世纪40年代末诞生至今仅短短半个多世纪,但由于他具有信息的分布存储.并行处 ...

  5. 计算摄影:基于深度学习的畸变校正

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 在手机中的计算摄影4-超广角畸变校正中,我为你描述了广角镜头的镜头畸变校正和透视畸变校正,尤其是花了很 ...

  6. 基于深度学习的畸变校正

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 荐语 透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的 ...

  7. 手机广角相机标定和畸变校正

    摄像头或者相机会因为镜片的光学特性而发生有规律的变形或者畸变,包括桶型畸变,枕型畸变和线性畸变.普通相机的这些畸变十分轻微,人的肉眼几乎分辨不出,所以这时可以不需要校正.对于广角相机,鱼眼相机,由于视 ...

  8. 激光振镜误差校正算法C语言,动态聚焦激光振镜扫描系统的误差分析及图形校正算法.pdf...

    动态聚焦激光振镜扫描系统的误差分析及图形校正算法.pdf 份态象金激疙非在镜扫描系统份钱差令祈怠⑤荷乡镇正算法 文世峰,史玉升,谢 军 (华中科技大学材料学院塑性成形模拟及模具技术国家重点实验室,湖北 ...

  9. OpenCV相机标定与畸变校正

    点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自OpenCV学堂. OpenCV单目相机标定,图像畸变校正 相机标定定义与原理 01 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点 ...

最新文章

  1. 遍历JavaScript中的数组
  2. backtrack笔记本无法用Fn调亮度
  3. 索引维护存储过程(作业调用)
  4. 重叠IO模型-异步IO
  5. 力扣- -231. 2的幂
  6. SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件试读版
  7. as3 与 java_每天学一点Flash(48) As3.0 与 java 通信(1)
  8. python main函数
  9. 【每日算法Day 63】LeetCode 第 179 场周赛题解
  10. java对list里面按照分数排名_近3年全国高校高考录取分数线排名,600分以上高校55所...
  11. cad2010多个文件并排显示_CAD2010中如何将多个文档并排显示在一个窗口里?
  12. 初中毕业能学习软件测试吗,我只是初中毕业而且23岁了会不会太晚我想学 – 手机爱问...
  13. 在delphi中调用chm帮助文件_delphi教程
  14. msdia*.dll unregistered
  15. PPT母版和PPT模板
  16. BZOJ 4093: [Usaco2013 Dec]Vacation Planning
  17. python层次分析法案例_在R语言中使用层次分析法-案例1
  18. 微型计算机软硬件论文,关于微型计算机软硬件论文3000字_微型计算机软硬件毕业论文范文模板...
  19. 爬取B站视频 - m4s文件的相关研究
  20. (19年最新,操作极简)linux下使用xmind zen破解版

热门文章

  1. G1D16-fraud-SVM
  2. cesium 实现测距离测面积 (划线画面 跟随鼠标位置 )
  3. java和js中判断两个字符串是否相等对比
  4. C4D模型工具—循环/路径切割
  5. 玩游戏用什么显卡 ,GPU天梯性能分析
  6. 硬盘有坏道的表现和避免硬盘坏道的方法
  7. ArcGIS教程:再现水立方
  8. Nginx 根据url参数设置反向代理
  9. 引用数据类型之间的转换 [Java]
  10. debian linux中语言由中文改为英文