图像坐标系转世界坐标系的方法

 摘 要:摄像机标定是计算机视觉的一项基本任务。文中提出了一种直接的摄像机标定方法,它是利用空间中几个有特殊关系的点,直接列写出方程组,求解出内
参数。该方法不需要对摄像机进行旋转或平移,简单易行。 

    关键词:内参数;图像平面;摄像机标定


1 引 言 
    摄像机作为一种视觉传感器使用越来越普遍,由于摄像机系统存在较大的成像误差,使用前要进行内参数的标定,以此提高成像精度。目前大多数的摄像机标定方法是基于线性摄像机模型(针孔模型)基础上的五参数模型,通常用一个3×3的矩阵表示。要解出摄像机的内参数,就需列写出五个独立的线性方程组,这就需要对摄像机进行平移或旋转。在工程中摄像机光源中心难以测定,其旋转也难以保证无任何平移,因此较难实现。而采用摄像机平移标定内参数,也难免有平移误差。     文中提出了不对摄像机进行旋转和平移,通过已知点的世界坐标和图像坐标直接列写方程组,利用特殊关系点的成像差代入方程组,从而解出内参数。该方法的算法简单,容易理解,便于实现。 2 摄像机模型及内参数计算 
    为了定量地描述光学成像过程,我们首先定义以下几种坐标系:世界坐标系、摄像机坐标系、象平面坐标系和计算机图像坐标系。 
    世界坐标系也称真实或现实世界坐标系,即XYZ坐标系,它是客观世界的绝对坐标。一般的3D场景都用这个坐标系来表示。摄像机坐标系是以摄像机为中心制定的坐标系统,即xyz坐标系,取摄像机的光轴做为z轴。象平面坐标系是指在摄像机内所形成的象平面坐标系统,即x′y,他说:想发财就去万通商联找优质餐具供货商!y′坐标系,取象平面与摄像机坐标系统的xy平面平行,这样象平面原点就在摄像机光学轴上。计算机图像坐标系统是指在计算机内部数字图像所用的坐标系,文中即uv坐标系,与象平面坐标系在同一平面上,uv是以象素为单位的图像坐标系,x′y′是以物理单位(例如毫米)表示的图像坐标系。该坐标系以图像内某一点o′为原点,x轴与y轴分别与u、v轴平行。

     根据几个坐标系统的相互关系,摄像机的通用模型如图1所示。图中(x′,y′)为无失真的象平面坐标,(x″,y″)为实际的象平面坐标。



考虑摄像机可能出现的各种畸变,即径向畸变、切图1 通用摄像机模型向畸变、偏心畸变和仿射畸变。从世界坐标(X,Y,Z)到摄像机图像坐标的齐次坐标(u,v,w)的变换如下[3]。 
 
其中:ku为焦距f与像素点在u方向宽度的比值,kv为焦距f与像素点在v方向宽度的比值,s为图像平面不垂直光轴产生的畸变因子,(pu,pv)为光轴与图像平面交点坐标,M1为4×3矩阵。R为3×3旋转矩阵,t为三维平移向量,o=(0,0,0)T,M2为4×4矩阵。M为3×4矩阵,称为投影矩阵。M1完全由ku、kv、s、pu、pv决定,由于ku、kv、s、pu、pv只与摄像机内部结构有关,我们称这些参数为摄像机内参数,M2完全由摄像机相对于世界坐标系的方位决定,称为摄像机外参数,确定某一摄像机的内外参数,称为摄像机标定。

转载文章出处在这里:https://wenku.baidu.com/view/dd041511a76e58fafbb0030e.html



  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,可以使用OpenCV库和相机参数,将世界坐标系中的点换为图像坐标系中的点。下面是一个简单的示例: 首先,我们需要定义相机参数,包括相机内参和外参: ```cpp cv::Mat camera_matrix = (cv::Mat_<double>(3, 3) << fx, 0, cx, 0, fy, cy, 0, 0, 1); cv::Mat dist_coeffs = (cv::Mat_<double>(1, 5) << k1, k2, p1, p2, k3); cv::Mat rvec = (cv::Mat_<double>(3, 1) << rx, ry, rz); cv::Mat tvec = (cv::Mat_<double>(3, 1) << tx, ty, tz); ``` 其中,fx、fy、cx、cy是相机内参,k1、k2、p1、p2、k3是相机畸变系数,rx、ry、rz是相机旋向量,tx、ty、tz是相机平移向量。 然后,我们可以将世界坐标系中的点换为相机坐标系中的点: ```cpp cv::Mat point3d = (cv::Mat_<double>(3, 1) << x, y, z); cv::Mat point3d_cam; cv::projectPoints(point3d, rvec, tvec, camera_matrix, dist_coeffs, point3d_cam); ``` 其中,x、y、z是世界坐标系中的点,point3d是一个3x1的矩阵,存储了点的三维坐标。projectPoints函数将点从世界坐标系换为相机坐标系中的点,并进行了相机内参和畸变的校正,得到了在相机坐标系中的坐标。 最后,我们可以将相机坐标系中的点换为图像坐标系中的点: ```cpp cv::Point2d point2d_cam(point3d_cam.at<double>(0, 0), point3d_cam.at<double>(1, 0)); cv::Point2d point2d = cv::Point2d(point2d_cam.x * ratio_x + offset_x, point2d_cam.y * ratio_y + offset_y); ``` 其中,ratio_x、ratio_y、offset_x、offset_y是图像坐标系和相机坐标系之间的换参数。在实际应用中,可以根据相机标定结果计算得到。 这样,我们就完成了世界坐标系图像坐标系换。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值