相机标定的一些记录

摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程,即在图片上哪个像素点

标定分为两个部分

1.第一步是从世界坐标系转换为相机坐标系,这一步是三维点到三维点的转换,主要包括旋转矩阵 R ,t等参数,称为相机外参标定

  1. 第二步是相机坐标系到图像坐标系,这一部是三维到二维点的转换,主要包括 K(相机内参)参数,称为相机内参的标定

举列:

相机与激光雷达的标定:

传统标定方法

一、外参的标定方法

以相机为中心,根据人为测量激光雷达与相机关于右手坐标系的相对位姿。后续在通过结果细微的调节.

一、内参的标定方法

(1) 首先打印出标定版,如下图

(2) 如果是普通相机或者鱼眼相机,有两个使用工具,第一个是ROS的相机标定工具

在终端输入以下指令

rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/camera/right/image_raw

其中 --size 表示为标定板长宽的黑白格子的数量

--square 为每个黑白格的长度,单位为(m)

--image 为图像的话题

演示效果如下:

右边有四个参数

X 为标定板在图像中的横向照片提取数量是否满足要求。

Y 为标定版在图像中的纵向照片提取数量是否满足要求。

Size 为标定版在图像中的远近照片提取数量是否满足要求。

Skew 为标定版在图像中的倾斜照片提取数量是否满足要求。

当所有角度需求满足要求时,即四个参数下方都为绿色时,CALIBRATE按钮显示黄色,点击即可开始标定相机内参。

第一个滑动条可根据是否为普通相机或者鱼眼相机来选择。 最终得到相机内参参数如下

('D = ', [-0.04483935850269598, 0.21668635011274098, -7.511409441343408e-06, -0.014566337456272171, 0.0])
('K = ', [657.954311720957, 0.0, 297.0047475623269, 0.0, 653.7091694249858, 236.35301154477284, 0.0, 0.0, 1.0])
('R = ', [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0])
('P = ', [664.5278930664062, 0.0, 290.7184962020892, 0.0, 0.0, 667.2344970703125, 236.43032880130704, 0.0, 0.0, 0.0, 1.0, 0.0])
None
# oST version 5.0 parameters
 
 
[image]
 
width
640
 
height
480
 
[narrow_stereo]
 
camera matrix
657.954312 0.000000 297.004748
0.000000 653.709169 236.353012
0.000000 0.000000 1.000000
 
distortion
-0.044839 0.216686 -0.000008 -0.014566 0.000000
 
rectification
1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
 
projection
664.527893 0.000000 290.718496 0.000000
0.000000 667.234497 236.430329 0.000000
0.000000 0.000000 1.000000 0.000000

主要关注以下参数:

camera matrix 657.954312 0.000000 297.004748 fx , 0, cx 0.000000 653.709169 236.353012 = 0 , fy ,cy,

0.000000 0.000000 1.000000 0 , 0 , 1

当已知外参.激光雷达得到的每个激光点位置转换到相机坐标的转换公式如下

float point_in_cam_x = output_cloud->points[i].x * laser_to_cam_(0, 0) + output_cloud->points[i].y * laser_to_cam_(0, 1) + output_cloud->points[i].z * laser_to_cam_(0, 2) + laser_to_cam_(0, 3);
float point_in_cam_y = output_cloud->points[i].x * laser_to_cam_(1, 0) + output_cloud->points[i].y * laser_to_cam_(1, 1) + output_cloud->points[i].z * laser_to_cam_(1, 2) + laser_to_cam_(1, 3);
float point_in_cam_z = output_cloud->points[i].x * laser_to_cam_(2, 0) + output_cloud->points[i].y * laser_to_cam_(2, 1) + output_cloud->points[i].z * laser_to_cam_(2, 2) + laser_to_cam_(2, 3);

output_cloud为激光雷达每个激光点的数据

laser_to_cam_<<0.08083690, -0.99662126, -0.01167763, -0.19623674, 0.04087759, 0.01505343, -0.99906721, -0.26569012, R t 0.99591426, 0.08030508, 0.04197840, -0.59186737, = 0 1 0.00000000, 0.00000000, 0.00000000, 1.00000000;

为激光雷达到相机的人为测量的变换矩阵。

当已知内参,相机坐标中的位置转换到像素位置的位置如下

int x = (int)((camera_intrinsics_(0, 0) * point_in_cam_x + camera_intrinsics_(0, 1) * point_in_cam_y + camera_intrinsics_(0, 2) * point_in_cam_z) / point_in_cam_z);
 int y = (int)((camera_intrinsics_(1, 0) * point_in_cam_x + camera_intrinsics_(1, 1) * point_in_cam_y + camera_intrinsics_(1, 2) * point_in_cam_z) / point_in_cam_z);

camera_intrinsics_ << fx, 0, cx,0, 0,fy, cy,0,0, 0, 0, 0, 0.0, 0.0, 0.0, 1.0;为相机内参参数

最终可以实现激光雷达的激光点到相机的像素具体的位置的变换

也可以使用matlab2020b进行标定

matlab2019之前的相机标定没有自带可标定鱼眼摄像头的工具

可参考以下链接

matlab标定

全景相机的标定方法

由于全景相机通过自己进行放射变换等一些处理,所以使用传统的标定工具无法得到一个正确的相机内参参数。如下图

传统的matlab标定得到的结果为标定板只会出现在相机坐标系前方180度的范围,而实际标定过程中是对相机360度的范围分别进行了标定。

所以传统方法不太使用与全景相机的标定

故采取的方法为如下

(1) 外参标定

实验方法如上述传统标定方法

(2) 角度映射

全景相机包含了相机左右360度 上下180度所有的方位

首先通过上述所的激光点到相机坐标转换

得到的相机坐标下的每个激光点的 x y z

通过 arctan(y/x) 得到偏航角度 , 得到在像素坐标横坐标 为 照片长度/360 * 偏航角度

通过 arctan(z/(x^2 + y^2)) 得到俯仰角度 得到在像素坐标下纵坐标为 照片宽度/180 * 俯仰角度

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值