livox_camera_lidar_calibration学习--相机内参标定
开源代码位于: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学习--相机内参标定相关推荐
- 二十.激光、视觉和惯导LVIO-SLAM框架学习之相机内参标定
专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...
- Basler相机内参标定及Basler相机和Livox-avia激光雷达联合标定
本次相机内参标定及相机-激光雷达联合标定采用的数据为同一批.数据采集系统:ubuntu-20.04,ROS-noetic. 前期准备 关于系统安装以及ROS环境配置,在这里不写出具体步骤,可查阅其他相 ...
- 工业相机基础知识以及相机内参标定
第一部分 工业相机基础知识 本部分主要参考以下文章: [计算机视觉]相机成相之像距.物距.焦距 CCD以及镜头入门知识 工业摄像头传感器尺寸与像元尺寸的关系 1.相机成像 根据相机成像原理,可得到如下 ...
- 【自动驾驶】27.相机畸变_相机内参标定 整理
本文整理了很多有关相机畸变博客的相关内容,都附上的原文地址,也纠正了一些其他博客的错误. 下面两张截图来自高翔博士的<视觉SLAM十四讲>书中内容. 有关添加畸变矫正以及去畸变的详细过程, ...
- ZED2双目相机内参标定
前言 一个 8x6 的棋盘标定板,边长 10.8 cm,因为标定用的是内部角点,所以实际打印出是 9x7 大小 保证一个 5m X 5m 的无遮挡环境 一个发布了左右图像到 ROS 中的双目相机 标定 ...
- zed相机拆机_机器人技术:ZED 双目相机内参标定方法
今天在家总结了下标定 ZED 相机的步骤,方便开学后直接开整. 一.准备工作 一个 8x6 的棋盘标定板,边长 10.8 cm,因为标定用的是内部角点,所以实际打印出是 9x7 大小 保证一个 5m ...
- zed2i相机内参标定
参考: https://blog.csdn.net/yanpeng_love/article/details/107166922 https://blog.csdn.net/weixin_419549 ...
- 单目相机内参标定的问题
疑问: 一直有一个问题,就是单目相机标定的时候大都是移动标定板,固定相机不动,也没有说出个所以然来,但是为什么没有教程说固定标定板不动,移动相机呢? ------------------------- ...
- 单目相机内参标定注意事项
为了提高单目相机标定的精度,认真看了张正友标定法的原文,并且学习过网上一些牛人的方法,但是大部分时候说的很笼统,自己把这些经验总结起来并都测试了一下,感觉靠谱的结论列出如下: (1)在标定时,标定模板 ...
最新文章
- dtree的使用和扩展
- 儿童吹泡泡水简单配方_儿童吹泡泡水简单配方[组图]
- 0603贴片电阻阻值对照表_怎样读贴片电阻阻值
- linux ps 显示不了中文,enscript转txt为ps文件时中文变成乱码
- java exe 路径_Java程序获取执行自己的java.exe路径
- 横河电机修复多个工控产品漏洞,可用于破坏和操纵物理进程
- 关于G++库链接的一个问题
- flt文件matlab,FLT文件扩展名 - 什么是.flt以及如何打开? - ReviverSoft
- 一个案例深入Python中的__new__和__init__
- win7下笔记本电脑给手机开热点
- 禁止查看网页源代码方法
- android自定义view(三)绘制表格和坐标系
- 浙大计算机跨专业考研心路历程记录
- html首页问候语,每日一条问候语
- 我中了CVPR顶会论文以后
- 拼题A入驻CSDN平台啦!
- 中央一套被抢注成避孕套商标
- win10 下载 linux系统安装教程,win10安装linux双系统的方法是什么_win10装linux双系统的方法...
- 处男作《程序员第二步-从程序员到项目经理》分娩记之一
- 重写to String()方法
热门文章
- 通过坚果云、KeePassXC、keepass2android实现跨平台的密码管理方案
- 心海软件学心理测试系统,心海软件心理管理系统
- 隐马尔科夫模型HMM之Baum-Welch算法Python代码实现
- 联想微型计算机内容不清楚,联想L2060wa显示器显示不清楚,特别是文字更无法看...
- ORB-SLAM2构建稠密地图 ros-kinetic 深度相机
- 无框架的php cms审计,通读审计之DOYOCMS
- 高速网络芯片 入驻移动基站
- 电动车控制器电路图,PCB和源程序,学习无刷电机控制器好资料
- 第二章 控制方程离散化之低阶格式(一)
- 放弃那些没用的资料吧!最新C/C++学习线路总结