开源代码位于:GitHub - Shelfcol/livox_camera_lidar_calibration_modified: livox_camera_lidar_calibration的改进得

代码为cameraCalib.cpp

运行: roslaunch camera_lidar_calibration cameraCalib.launch

1. 拍摄并读取23张拍摄的棋盘格照片

相片拍摄:准备20张以上的照片数据,各个角度和位置都要覆盖,拍摄的时候距离不要太近(3米左右),如图所示:

Mat imageInput = imread(filename);

2. 提取棋盘格的角点

Size board_size = Size(row_number, col_number); /* 标定板上每行、列的角点数 */

vector<Point2f> image_points_buf; /* 缓存每幅图像上检测到的角点 */

0 == findChessboardCorners(imageInput, board_size, image_points_buf)

3. 对角点提取成功的图片进行亚像素角点提取

Mat view_gray; // 保存对应的灰度图

cvtColor(imageInput, view_gray, cv::COLOR_RGB2GRAY); // 转灰度图

/* 亚像素精确化 */

// image_points_buf 初始的角点坐标向量,同时作为亚像素坐标位置的输出

// Size(5,5) 搜索窗口大小

// (-1,-1)表示没有死区

// TermCriteria 角点的迭代过程的终止条件, 可以为迭代次数和角点精度两者的组合

cornerSubPix(view_gray, image_points_buf, Size(5, 5), Size(-1, -1), TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::MAX_ITER, 30, 0.1));

(具体的原理后面补上)

drawChessboardCorners(view_gray, board_size, image_points_buf, false); // 用于在图片中标记角点

4. 根据图片的宽高设定假设的世界角点坐标。

这里的boad_size 的height为棋盘格的数值方向的角点数,width为水平方向角点数,这里注意不包含最外一圈黑块。下面图片对应的width = 8, height = 6。其中每个方块的尺寸为Size square_size(w,h),w和h单位为mm。

这里假定左上角的角点坐标为(0,0),按照格子的尺寸计算其他的角点的坐标,这里假定标定板位于世界坐标系z=0的平面上

/* 初始化标定板上角点的三维坐标,以(0,0)坐标开始,每个角点的长宽由测量确定 */
int i, j, t;
for (t = 0; t<image_count; t++) { // 遍历所有图片数vector<Point3f> tempPointSet;for (i = 0; i<board_size.height; i++) {for (j = 0; j<board_size.width; j++) {Point3f realPoint;/* 假设标定板放在世界坐标系中z=0的平面上 */realPoint.x = i * square_size.width;realPoint.y = j * square_size.height; // 右x下yrealPoint.z = 0;tempPointSet.push_back(realPoint);}}object_points.push_back(tempPointSet);
}

5. 根据提取的角点和假定的世界坐标系角点计算相机内参

/* 开始标定 */
// object_points 世界坐标系中的角点的三维坐标
// image_points_seq 每一个内角点对应的图像坐标点
// image_size 图像的像素尺寸大小
// cameraMatrix 输出,内参矩阵
// distCoeffs 输出,畸变系数
// rvecsMat 输出,旋转向量
// tvecsMat 输出,位移向量
// 0 标定时所采用的算法
calibrateCamera(object_points, image_points_seq, image_size, cameraMatrix, distCoeffs, rvecsMat, tvecsMat, 0); //

6. 根据计算的内参进行三维点重投影,计算标定误差

/* 通过得到的摄像机内外参数,对假定空间的三维点进行重新投影计算,得到新的投影点,保存在image_points2中 */

输入:假定的世界点,是世界点对应的旋转,平移矩阵,相机内参,畸变系数,输出投影到相机平面的点坐标

projectPoints(tempPointSet, rvecsMat[i], tvecsMat[i], cameraMatrix, distCoeffs, image_points2);

这里学习一个小知识:

CV_<bit_depth>(S|U|F)C<number_of_channels>

         CV_32FC2表示32位浮点数双通道

 double total_err = 0.0;         /* 所有图像的平均误差的总和 */double err = 0.0;               /* 每幅图像的平均误差 */vector<Point2f> image_points2;  /* 保存重新计算得到的投影点 */fout << "Average error: \n";for (i = 0; i<image_count; i++) {vector<Point3f> tempPointSet = object_points[i];/* 通过得到的摄像机内外参数,对假定空间的三维点进行重新投影计算,得到新的投影点,保存在image_points2中 */projectPoints(tempPointSet, rvecsMat[i], tvecsMat[i], cameraMatrix, distCoeffs, image_points2);/* 计算新的投影点和旧的投影点之间的误差*/vector<Point2f> tempImagePoint = image_points_seq[i]; // 第i张图片的角点坐标Mat tempImagePointMat = Mat(1, tempImagePoint.size(), CV_32FC2); // 双通道数据,每个存放Vec2fMat image_points2Mat  = Mat(1, image_points2.size(),  CV_32FC2);for (unsigned int j = 0; j < tempImagePoint.size(); j++) {image_points2Mat.at<Vec2f>(0, j) = Vec2f(image_points2[j].x, image_points2[j].y);tempImagePointMat.at<Vec2f>(0, j) = Vec2f(tempImagePoint[j].x, tempImagePoint[j].y);}err = norm(image_points2Mat, tempImagePointMat, NORM_L2); // 计算L2距离total_err += err /= point_counts[i];fout << "The error of picture " << i + 1 << " is " << err << " pixel" << endl;}fout << "Overall average error is: " << total_err / image_count << " pixel" << endl << endl;

7. 标定结果

1个3x3的内参矩阵,5个畸变纠正参数(k1,k2,p1,p2,k3)

8. Matlab标定相机内参

Matlab中的cameraCalibrator工具可以标定内参,我们只需要结果中的1,,2和11数据

livox_camera_lidar_calibration学习--相机内参标定相关推荐

  1. 二十.激光、视觉和惯导LVIO-SLAM框架学习之相机内参标定

    专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...

  2. Basler相机内参标定及Basler相机和Livox-avia激光雷达联合标定

    本次相机内参标定及相机-激光雷达联合标定采用的数据为同一批.数据采集系统:ubuntu-20.04,ROS-noetic. 前期准备 关于系统安装以及ROS环境配置,在这里不写出具体步骤,可查阅其他相 ...

  3. 工业相机基础知识以及相机内参标定

    第一部分 工业相机基础知识 本部分主要参考以下文章: [计算机视觉]相机成相之像距.物距.焦距 CCD以及镜头入门知识 工业摄像头传感器尺寸与像元尺寸的关系 1.相机成像 根据相机成像原理,可得到如下 ...

  4. 【自动驾驶】27.相机畸变_相机内参标定 整理

    本文整理了很多有关相机畸变博客的相关内容,都附上的原文地址,也纠正了一些其他博客的错误. 下面两张截图来自高翔博士的<视觉SLAM十四讲>书中内容. 有关添加畸变矫正以及去畸变的详细过程, ...

  5. ZED2双目相机内参标定

    前言 一个 8x6 的棋盘标定板,边长 10.8 cm,因为标定用的是内部角点,所以实际打印出是 9x7 大小 保证一个 5m X 5m 的无遮挡环境 一个发布了左右图像到 ROS 中的双目相机 标定 ...

  6. zed相机拆机_机器人技术:ZED 双目相机内参标定方法

    今天在家总结了下标定 ZED 相机的步骤,方便开学后直接开整. 一.准备工作 一个 8x6 的棋盘标定板,边长 10.8 cm,因为标定用的是内部角点,所以实际打印出是 9x7 大小 保证一个 5m ...

  7. zed2i相机内参标定

    参考: https://blog.csdn.net/yanpeng_love/article/details/107166922 https://blog.csdn.net/weixin_419549 ...

  8. 单目相机内参标定的问题

    疑问: 一直有一个问题,就是单目相机标定的时候大都是移动标定板,固定相机不动,也没有说出个所以然来,但是为什么没有教程说固定标定板不动,移动相机呢? ------------------------- ...

  9. 单目相机内参标定注意事项

    为了提高单目相机标定的精度,认真看了张正友标定法的原文,并且学习过网上一些牛人的方法,但是大部分时候说的很笼统,自己把这些经验总结起来并都测试了一下,感觉靠谱的结论列出如下: (1)在标定时,标定模板 ...

最新文章

  1. dtree的使用和扩展
  2. 儿童吹泡泡水简单配方_儿童吹泡泡水简单配方[组图]
  3. 0603贴片电阻阻值对照表_怎样读贴片电阻阻值
  4. linux ps 显示不了中文,enscript转txt为ps文件时中文变成乱码
  5. java exe 路径_Java程序获取执行自己的java.exe路径
  6. 横河电机修复多个工控产品漏洞,可用于破坏和操纵物理进程
  7. 关于G++库链接的一个问题
  8. flt文件matlab,FLT文件扩展名 - 什么是.flt以及如何打开? - ReviverSoft
  9. 一个案例深入Python中的__new__和__init__
  10. win7下笔记本电脑给手机开热点
  11. 禁止查看网页源代码方法
  12. android自定义view(三)绘制表格和坐标系
  13. 浙大计算机跨专业考研心路历程记录
  14. html首页问候语,每日一条问候语
  15. 我中了CVPR顶会论文以后
  16. 拼题A入驻CSDN平台啦!
  17. 中央一套被抢注成避孕套商标
  18. win10 下载 linux系统安装教程,win10安装linux双系统的方法是什么_win10装linux双系统的方法...
  19. 处男作《程序员第二步-从程序员到项目经理》分娩记之一
  20. 重写to String()方法

热门文章

  1. 通过坚果云、KeePassXC、keepass2android实现跨平台的密码管理方案
  2. 心海软件学心理测试系统,心海软件心理管理系统
  3. 隐马尔科夫模型HMM之Baum-Welch算法Python代码实现
  4. 联想微型计算机内容不清楚,联想L2060wa显示器显示不清楚,特别是文字更无法看...
  5. ORB-SLAM2构建稠密地图 ros-kinetic 深度相机
  6. 无框架的php cms审计,通读审计之DOYOCMS
  7. 高速网络芯片 入驻移动基站
  8. 电动车控制器电路图,PCB和源程序,学习无刷电机控制器好资料
  9. 第二章 控制方程离散化之低阶格式(一)
  10. 放弃那些没用的资料吧!最新C/C++学习线路总结