相机标定的一些记录

摄像机标定(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
    评论
### 回答1: OpenCV是一个开源的计算机视觉库,其中包含了一些用于双目相机标定的函数和工具。双目相机标定是一种用于确定相机的内部参数和外部参数的过程,以便在后续的图像处理中能够准确地测量和重构三维场景。 双目相机标定程序主要包含以下步骤: 1. 收集标定图像:首先需要收集一系列用于标定的图像,这些图像通常包含了在不同位置和角度下的标定板。标定板是一种特殊的棋盘格,由于其具有一些规律的特征点,可以用于准确地估计相机的参数。 2. 提取特征点:通过使用OpenCV中的函数,可以从标定图像中提取出待标定相机的特征点。这些特征点通常是图像中棋盘格的角点,可以通过计算这些角点的像素坐标来得到双目相机的内部参数。 3. 计算内部参数:根据提取的特征点,可以使用OpenCV提供的函数,计算出相机的内部参数矩阵,包括焦距和主点的坐标。这些参数可以在后续的立体视觉算法中用于图像对齐和三维重构。 4. 计算外部参数:在这一步骤中,通过在不同位置和角度下拍摄的标定图像,计算出相机的外部参数,包括旋转矩阵和平移向量。这些参数描述了相机在世界坐标系中的位置和姿态,可以用于提取双目图像之间的几何关系。 5. 检验标定结果:使用得到的内部参数和外部参数,可以对标定图像进行重构,计算出三维空间中的点坐标。通过比较这些重构的点和实际场景中的点的位置,可以评估标定结果的准确性。 通过使用OpenCV提供的双目相机标定程序,可以方便地进行相机的内部参数和外部参数的计算,为后续的立体视觉分析和三维重构提供准确的相关参数。 ### 回答2: OpenCV双目相机标定程序是一种用于测量并校正双目相机系统的工具。它可以帮助我们确定相机的内部参数(例如焦距、主点位置),以及相机之间的外部参数(例如旋转和平移矩阵),从而使我们能够在三维空间中精确地重建场景。 在标定过程中,我们需要使用一个具有已知精确三维坐标的物体,并且将它从不同的角度拍摄。标定程序会分析双目图像对之间的差异,并根据每个图像中物体的对应点来计算相机参数。 首先,我们需要提供一组包含世界坐标和相应图像中的对应点的输入数据。这些对应点可以通过人工标记或使用特征检测算法(如SIFT或SURF)自动获取。 接下来,标定程序会根据所提供的数据计算相机的内部参数。这些参数包括焦距(表示相机对物体的放大倍数)、主点位置(表示物体与相机视野中心的偏移)以及一些畸变参数(用于补偿透视变形)。 此外,标定程序还会计算相机之间的外部参数,即旋转和平移矩阵。这些参数描述了相机之间的位置和方向关系,从而可以将不同相机视角下的图像对齐到同一坐标系中进行后续处理。 最后,标定程序会输出一组包含相机内部和外部参数的数据。这些参数可以用于后续的双目视觉处理任务,如立体匹配、深度估计等。 总的来说,OpenCV双目相机标定程序是一个用于确定双目相机系统参数的工具。通过有效的标定,我们可以提高双目视觉任务的准确性和稳定性,从而更好地应用于三维重建、目标检测、机器人导航等领域。 ### 回答3: OpenCV双目相机标定程序是一个用于校准双目相机的工具。双目相机标定是确定左右相机的内外参数,以便进行立体视觉的关键步骤。 首先,双目相机标定程序需要一组已知的空间3D点的坐标和对应的图像2D点。这些3D-2D点对被称为标定板。在标定过程中,我们需要多次对标定板进行不同的位置和姿态的拍摄,并记录下每次拍摄时两个相机的图像。这些图像将用于计算相机的内参和外参。 通过在每个图像上检测标定板上的角点,我们可以获取2D点的像素坐标。然后,通过比较3D点和2D点的对应关系,我们可以使用非线性优化方法计算出相机的内参数(如焦距和主点坐标)以及外参数(如相机之间的旋转和平移矩阵)。 进行相机标定时,需要使用OpenCV的cv2.calibrateCamera()函数。该函数将接受标定板的2D和3D点对,并返回相机的内参数矩阵、畸变系数和外参数。标定板上的拍摄应该包括不同的位置和姿态。 值得一提的是,标定过程中需要注意一些细节,比如保持相机固定、使用高质量的标定板、适当的角点检测等。标定结果的准确性将决定后续使用双目相机进行立体视觉的精度。 总之,OpenCV双目相机标定程序是一个强大的工具,可以帮助我们获得双目相机的校准参数,为后续的立体视觉应用奠定基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值