摄像头或者相机会因为镜片的光学特性而发生有规律的变形或者畸变,包括桶型畸变,枕型畸变和线性畸变。普通相机的这些畸变十分轻微,人的肉眼几乎分辨不出,所以这时可以不需要校正。对于广角相机,鱼眼相机,由于视角极大,相机透镜的物理属性十分明显,从而容易导致相片极度畸变,这时除了一些追求特殊艺术效果的场合,大部分情况下都需要校正。

这里使用OPENCV算法对相机标定和畸变校正。OPENCV是非常牛B的图像,视频,相机处理算法库,封装了图像计算,图像处理,分像解析,图像分离,图像切割,图像识别,图像滤镜,图像查找,图像匹配等十分强大的函数库。在VR,AR,3D,二维码,车牌,身份证,银行卡识别方面也应用很广。OPENCV底层使用C和C++实现,这使其也有十分优异的速度。智能手机可以使用很多种访求调用OPENCV完成工作,android从早期的JNI和现在的服务调用。从调用方式上来说是越来越简单了,但从应用角度来说,却是选择越来越多,根据不同场合和需求,既可以直接原始JNI,也可以使用JAR调用C,还可以通过OPENCV MANAGER的服务实现。

摄像头或者相机,或者图片的校正分两个步骤,一是标定,二是反畸变。标定过程是求出摄像头或者相机或者图片的畸变参数,通过这些参数使用特定畸变算法对图像进行校正。

1.相机标定算法比较复杂,详情参考我的前面博客。这里不再对算法做具体解释说明,只简单介绍一下标定的方法。在OPECV中,标定有两种算法,一种是棋盘纸,类似方格子纸,一种是圆圈阵列纸,两种方法实现的原理一样,都是通过分析图像上固定角点的位置实现,取得的标定的参数也一样,下面具体实现代码,我通过一个布尔变量使得我们的校正算法可以兼容棋盘和圆圈阵列两种方式。核心函数是findCirclesGrid和findChessboardCorners

boolean isChessboard = false;
private void findPattern(Mat grayFrame) {isChessboard = false;mPatternWasFound = Calib3d.findCirclesGrid(grayFrame, mPatternSize,mCorners, Calib3d.CALIB_CB_ASYMMETRIC_GRID);if (!mPatternWasFound) {isChessboard = true;mPatternWasFound = Calib3d.findChessboardCorners(grayFrame, mPatternSize2,mCorners, Calib3d.CALIB_CB_NORMALIZE_IMAGE + Calib3d.CALIB_CB_ADAPTIVE_THRESH + Calib3d.CALIB_CB_FAST_CHECK);}}

2.求得到角点会在后面转为畸变矩阵存储mDistortionCoefficients,以备反畸变算法调用。核心函数是calibrateCamera

public void calibrate() {ArrayList<Mat> rvecs = new ArrayList<Mat>();ArrayList<Mat> tvecs = new ArrayList<Mat>();Mat reprojectionErrors = new Mat();ArrayList<Mat> objectPoints = new ArrayList<Mat>();if (isChessboard){objectPoints.add(Mat.zeros(mCornersSize2, 1, CvType.CV_32FC3));}else {objectPoints.add(Mat.zeros(mCornersSize, 1, CvType.CV_32FC3));}calcBoardCornerPositions(objectPoints.get(0));for (int i = 1; i < mCornersBuffer.size(); i++) {objectPoints.add(objectPoints.get(0));}Calib3d.calibrateCamera(objectPoints, mCornersBuffer, mImageSize,mCameraMatrix, mDistortionCoefficients, rvecs, tvecs, mFlags);mIsCalibrated = Core.checkRange(mCameraMatrix)&& Core.checkRange(mDistortionCoefficients);mRms = computeReprojectionErrors(objectPoints, rvecs, tvecs, reprojectionErrors);Log.i(TAG, String.format("Average re-projection error: %f", mRms));Log.i(TAG, "Camera matrix: " + mCameraMatrix.dump());Log.i(TAG, "Distortion coefficients: " + mDistortionCoefficients.dump());
}

3.最后使用反畸变函数undistort把校正后的图像还原。

public Mat render(CvCameraViewFrame inputFrame) {Mat renderedFrame = new Mat(inputFrame.rgba().size(), inputFrame.rgba().type());Imgproc.undistort(inputFrame.rgba(), renderedFrame,mCalibrator.getCameraMatrix(), mCalibrator.getDistortionCoefficients());return renderedFrame;
}

4两种算法的标定比较,两种方法是独立的,都可以达到标定的目的,棋盘纸的方法比较比较慢,圆圈阵列比较快,在低端手机上校正,可以使用圆圈阵列。

5.源码下载地址:

https://github.com/blogercn/CameraCalibration

使用方法,代码编绎APP装入手机中

校正前校正前畸变十分严重,方形屏幕成了流体体

棋盘纸校正


圆圈阵列校正

校正后

前后对比

手机广角相机标定和畸变校正相关推荐

  1. 鱼眼摄像头标定与畸变校正(OPENCV版)

    转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://github.com/WordZzzz/fisheye_calibration 软件版本 ...

  2. 鱼眼摄像头标定与畸变校正(双OPENCV版本)

    转载请注明作者和出处:http://blog.csdn.net/u011475210 代码地址:https://github.com/WordZzzz/fisheye_calibration 软件版本 ...

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

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

  4. 【计算机视觉】摄像机标定与畸变校正

    任务1:利用OpenCV实现摄像机参数标定 设置好棋盘格参数(边长.行列数等),打印方形棋盘格并粘贴,拍摄多张标定图像: 估计标定参数,可视化标定结果.        任务2:根据标定参数进行畸变校正 ...

  5. 广角镜头的标定、畸变校正和基于ROS的实时视频输出

    参考网址: 1.棋盘格标定 https://blog.csdn.net/u011475210/article/details/79185543 2.镜头参数调整 https://blog.csdn.n ...

  6. 鱼眼镜头标定及畸变校正

    鱼眼摄像头畸变校正的方法: 棋盘矫正法 经纬度矫正法. 离线图片实现摄像头标定和矫正 1)Cmakelist 配置Opencv //要求cmake最低版本 cmake_minimum_required ...

  7. Halcon自标定做畸变校正

    一.Halcon有个算子可以实现利用单张图像,标定出相机内参,用来做畸变校正.不过对图片有要求,因为畸变越靠近图像边缘,就会越严重.所以要求图片的四周有足够的直线,最好图像中间部分也有足够的直线.提取 ...

  8. 相机标定(三) —— 畸变校正

    一.前言 根据针孔模型,物体和成像之间参数会满足相似三角形的关系.但现实中会存在装配误差和透视失真等原因,导致这种关系无法成立,使理想成像与实际成像存在误差,这种误差即称为畸变. 畸变分为径向畸变,切 ...

  9. opencv相机标定(1)-畸变校正原理

    理想相机成像模型 看到一篇博客,介绍的十分详细.参考 链接 (为了好理解,个人还是喜欢分四大坐标系,世界坐标系,摄像机坐标系,图像物理坐标系,图像像素坐标系) 1)世界坐标系->摄像机坐标系 R ...

最新文章

  1. next_permutation(,)用法
  2. linux SPI通信超时,提高SPI时钟时通信异常的案例分享
  3. 【pmcaff】麦肯锡:预测2025年将出现的12大颠覆技术【图】
  4. 华为交换机S5700开启telnet
  5. python收集数据程序_用一行Python代码进行数据收集探索!Python真牛逼!
  6. tomcat 系统服务 outofmemory
  7. HTTP电脑发送短信接口调用示例
  8. python 集合技巧
  9. python作用域总结_关于Python作用域自学总结
  10. fanuc机器人四边形编程_FANUC机器人编程及应用
  11. 百度给创新员工发2000w奖金........
  12. 自定义注解:具体的设计作用一般看过滤器的实现(以@Secured为例子部分理解)
  13. Win10 安装 PySC2 环境 -- DeepMind联合战网开发的《星际争霸 II》强化学习环境
  14. plantuml样式_PlantUML之活动图
  15. cPanelWHM删除额外的IP地址问题
  16. 绕过CDN查询真实IP
  17. Linux:根文件系统构建
  18. 3分钟学会在C ++中以编程方式合并Excel工作表中的单元格
  19. 微信开发者工具 页面颜色调整(多与黑白)
  20. UTF8编码的原理及白名单过滤utf8mb4(Caused by: java.sql.BatchUpdateException: Incorrect string value)

热门文章

  1. 接口测试系列 | 莉莉丝公司接口测试实践分享
  2. win8忘记开机密码解决方法汇总
  3. JQuery 添加动态元素JS或CSS无效
  4. 网络知识:七类网线相关知识介绍
  5. thinkphp 3.2与phpexcel
  6. HttpURLConnection调用webservice,HTTP调用webservice,简单的webservice调用
  7. Android 蓝牙 MAC 地址的读取和修改
  8. Xcode 清理存储空间,减少空间占用
  9. Word控件Spire.Doc 【页面设置】教程(5) 如何在 C# 中删除分页符
  10. Excel筛选后数据如何汇总计算?