【立体视觉】世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的关系

本文详细介绍了相机成像过程中涉及的世界坐标系、相机坐标系、图像坐标系及像素坐标系之间的转换关系。通过数学模型阐述了从现实世界到数字图像的整个成像流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相机的成像过程涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。这篇博客介绍相机的成像过程,以及四个坐标系之间的装换关系。

相机理想成像模型:

这里写图片描述

世界坐标系:

客观三维世界的绝对坐标系,也称客观坐标系。因为数码相机安放在三维空间中,我们需要世界坐标系这个基准坐标系来描述数码相机的位置,并且用它来描述安放在此三维环境中的其它任何物体的位置,用(X, Y, Z)表示其坐标值。

相机坐标系(光心坐标系):

以相机的光心为坐标原点,X 轴和Y 轴分别平行于图像坐标系的 X 轴和Y 轴,相机的光轴为Z 轴,用(Xc, Yc, Zc)表示其坐标值。

图像坐标系:

以CCD 图像平面的中心为坐标原点,X轴和Y 轴分别平行于图像平面的两条垂直边,用( x , y )表示其坐标值。图像坐标系是用物理单位(例如毫米)表示像素在图像中的位置。

像素坐标系:

以 CCD 图像平面的左上角顶点为原点,X 轴和Y 轴分别平行于图像坐标系的 X 轴和Y 轴,用(u , v )表示其坐标值。数码相机采集的图像首先是形成标准电信号的形式,然后再通过模数转换变换为数字图像。每幅图像的存储形式是M × N的数组,M 行 N 列的图像中的每一个元素的数值代表的是图像点的灰度。这样的每个元素叫像素,像素坐标系就是以像素为单位的图像坐标系。

已知一个现实世界中的物体点的在世界坐标系中的坐标为(X, Y, Z),经过相机拍摄得到图片,在图片上的像素坐标为(u , v )。假设在图像坐标系中的坐标为( x , y ),在相机坐标系中的坐标为(Xc, Yc, Zc)。各个坐标之间的转化如下:

像素坐标系与图像坐标系的关系

这里写图片描述
他们之间的转换关系为:

u=xdx+u0

v=ydy+v0

采用齐次坐标再用矩阵形式将上式表示为:
uv1=1dx0001dy0u0v01xy11

其中(u0, v0)是图像坐标系原点在像素坐标系中的坐标,dx 和 dy分别是每个像素在图像平面x和 y方向上的物理尺寸。

图像坐标系与相机坐标系的关系

xf=XCZC

yf=YCZC

其中 f 为焦距(像平面与相机坐标系原点的距离)。用齐次坐标系和矩阵表示上述关系:
ZCxy1=f000f0001000XCYCZC12

相机坐标系与世界坐标系的关系

XCYCZC1=[R0Tt1]XYZ13

其中 R 为3 × 3正交旋转矩阵,t 为三维平移向量。

像素坐标系与世界坐标系的关系

由式(1)(2)(3)可得:

这里写图片描述

<think>我们正在处理的问题:Halcon如何将像素坐标系转为相机坐标系 在机器视觉中,Halcon提供了丰富的算子来实现相机标定和坐标转换。将像素坐标系转换为相机坐标系通常需要以下步骤: 1. 相机标定:获取相机的内参(焦距、主点、畸变系数等)和外参(相机相对于世界坐标系的位置和方向)。 2. 使用标定结果进行转换。 具体转换步骤: - 像素坐标(u, v) -> 归一化平面坐标(x', y'):通过内参矩阵的逆矩阵进行转换。 公式:x' = (u - cx) / fx y' = (v - cy) / fy 其中,(fx, fy)是相机的焦距(以像素为单位),(cx, cy)是主点(图像中心)的像素坐标。 - 归一化平面坐标(x', y') -> 相机坐标系下的三维点(Xc, Yc, Zc):由于归一化平面上的点是在Zc=1的平面上,所以实际的三维点需要知道深度(即Zc)。如果没有深度信息,我们只能得到在相机坐标系下的一条射线(方向向量),而无法得到具体的三维点。因此,通常需要额外的深度信息(例如,从立体视觉、结构光或已知的物体距离获得)。 在Halcon中,可以使用以下算子: - 相机标定:使用`calibrate_cameras`等算子获取相机参数。 - 像素坐标转相机坐标:使用`image_points_to_world_plane`(如果已知世界坐标系的平面)或者使用`get_line_of_sight`获取视线(即从相机中心穿过像素点的射线方向),然后结合深度信息计算。 但是,请注意:`image_points_to_world_plane`是将像素点转换到世界坐标系中的一个平面(例如,标定板平面)上,它需要知道世界平面的位置。而如果我们想得到相机坐标系下的点(而不是世界坐标系),并且没有世界平面的信息,我们可以使用以下方法: 步骤: 1. 获取相机的内参矩阵(CameraMatrix)和畸变参数(如果考虑畸变,需要先进行畸变校正)。 2. 使用内参矩阵将像素坐标转换为归一化坐标(去除畸变后)。 3. 如果已知该像素对应的深度值Z(在相机坐标系下的Z坐标),那么: Xc = x' * Z Yc = y' * Z 在Halcon中,可以使用算子`get_line_of_sight`来获取从相机中心穿过像素点的射线(方向向量)。然后,如果知道深度(即该点到相机中心的距离),就可以计算出相机坐标系下的具体点。 示例代码(Halcon): ```halcon * 假设已经标定好相机,并得到内参矩阵CameraParam * 定义像素坐标 Row := 300 Column := 400 * 获取视线(归一化的方向向量) get_line_of_sight(Row, Column, CameraParam, X, Y, Z) * 此时,得到的方向向量为(X, Y, Z),归一化(即模为1)的方向向量。 * 如果已知深度D(例如,该点距离相机中心的实际距离为D),那么相机坐标系下的点为: Xc := X * D Yc := Y * D Zc := Z * D ``` 注意:如果没有深度信息,则只能得到方向,无法得到具体的三维点坐标。 因此,像素坐标转相机坐标的关键在于深度信息的获取。 总结: 像素坐标系相机坐标系需要相机内参和深度信息。首先通过内参将像素坐标转换到归一化平面(得到归一化坐标),然后乘以深度值得到相机坐标系中的三维点。 §§相关问题§§ 1. 在Halcon中,如何获取相机的内参和外参? 2. 如果不知道深度信息,如何从单目相机获取三维坐标? 3. 相机标定过程中需要注意哪些关键步骤? 4. 畸变校正对像素坐标转换到相机坐标有什么影响? 5. Halcon中除了`get_line_of_sight`,还有哪些算子可用于坐标转换?</think>在Halcon中,将像素坐标系转换为相机坐标系需要以下关键步骤和算子: ### 核心原理 1. **相机标定**:通过标定板图像获取相机内参(焦距、主点、畸变系数)和外参(相机位姿) 2. **转换公式**:基于针孔相机模型 ``` [Xc] [1/fx 0 -cx/fx] [u] [Yc] = [0 1/fy -cy/fy] * [v] * Zc [1 ] [0 0 1 ] [1] ``` 其中 `(u,v)` 为像素坐标,`(Xc,Yc,Zc)` 为相机坐标系坐标,`(fx,fy)` 为焦距,`(cx,cy)` 为主点坐标 ### 操作步骤(Halcon实现) ```halcon * 1. 相机标定(需提前拍摄标定板图像) CalibDataID := create_calib_data('camera', 1, 1) read_cam_par('camera_parameters.dat', CamParam) * 读取相机参数 set_calib_data_cam_param(CalibDataID, 0, CamParam) * 2. 获取像素坐标(示例坐标) u := 512 v := 384 * 3. 像素坐标转相机坐标(需要深度信息Z) * 方法1:已知深度值(单位:mm) Z := 500 * 假设物体距离相机500mm image_points_to_world_plane(CamParam, Pose, u, v, 'mm', Xw, Yw) * 获得平面坐标 * 此时相机坐标系中:Xc = Xw, Yc = Yw, Zc = Z * 方法2:通过点云获取深度(需3D相机) get_image_point_3d(PointCloud, u, v, Xc, Yc, Zc) * 直接输出相机坐标系坐标 ``` ### 关键说明 1. **深度信息必需**:转换必须提供Z值(实际距离或点云深度) 2. **相机参数**:需通过`calibrate_cameras`或读取标定文件获得 3. **畸变校正**:使用`change_radial_distortion_cam_par`处理镜头畸变 4. **坐标系定义**: - 相机坐标系:原点在光心,Z轴沿光轴方向 - 像素坐标系:原点在图像左上角
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值