12、计算机视觉中的各种坐标系

一、四个坐标系简介

     我觉得首先我们要理解相机模型中的四个平面坐标系的关系:像素平面坐标系(u,v)、图像物理坐标第(x,y)、相机坐标系(Xc,Yc,Zc)和世界坐标系(Xw,Yw,Zw).
         图像尺寸:它的长度和宽度是以像素为单位的
    

二、图像坐标:我想和世界坐标谈谈

         玉米将在这篇博文中,对图像坐标与世界坐标的这场对话中涉及的第二个问题:谈话方式,进行总结。世界坐标是怎样变换进摄像机,投影成图像坐标的呢?

        玉米做了一个简单的图示,在这里做一个提纲。图中显示,世界坐标系通过刚体变换到达摄像机坐标系,然后摄像机坐标系通过透视投影变换到达图像坐标系。可以看出,世界坐标与图像坐标的关系建立在刚体变换和透视投影变换的基础上。为了奖励刚体变和透视投影变换沟通了“世界上最远的距离”,玉米在图上奖励了他们两朵小红花。哈哈

 首先,让我们来看一下刚体变换是如何将世界坐标系与图像坐标系联系起来的吧。这里,先对刚体变换做一个介绍:

        刚体变换(regidbody motion):三维空间中, 当物体不发生形变时,对一个几何物体作旋转, 平移运动,称之为刚体变换

因为世界坐标系和摄像机坐标都是右手坐标系,所以其不会发生形变。我们想把世界坐标系下的坐标转换到摄像机坐标下的坐标,如下图所示,可以通过刚体变换的方式。空间中一个坐标系,总可以通过刚体变换转换到另外一个个坐标系的。转一转,走一走,就到另外一个坐标系下了。以前可能是面朝大海,经过平移旋转,最终可能只能面朝冰山了,哈哈

下面让我来看一下,二者之间刚体变化的数学表达。

其中,XC代表摄像机坐标系,X代表世界坐标系。R代表旋转,T代表平移。R、T与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsic parameter)可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。

         R则为分别绕XYZ三轴旋转的效果之和。如下面所示:

 R=r1*r2*r3.其由三个方向的θ控制,故具有三个自由度。

           好了,刚体变换就讲完了。大家应该都了解,世界坐标系到摄像机坐标系之间的转换过程了吧。

          接下来,让我们看看摄像机坐标下的坐标如何投影到图像坐标系下,最终变为照片中的一个像素。这其中包含两个过程:一是从摄像机坐标到“空间图像坐标”(x,y)所发生的透视投影;二是从“连续图像坐标”到“离散图像坐标”(u,v)。后者我们已经在第一篇博文中解释过。所以在这里,主要介绍一下透视投影。

         透视投影(perspective projection): 用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图。有一点像皮影戏。它符合人们心理习惯,即离视点近的物体大,离视点远的物体小,不平行于成像平面的平行线会相交于消隐点(vanish point)。

         啰嗦这么多,其实大家看看示意图,看看公式,秒懂。

  以图中B(XB,YB)点为例,在小孔成像摄像机模型下(几何分析的最常用模型)。这里的f为摄像机的焦距,其属于摄像机的内参数(intrinsic parameter)。其在成像平面上的投影点b(xb,yb)的坐标利用简单的相似三角形比例关系很容易求出:

上面两式也阐明了摄像机坐标与图像坐标之间的透视投影关系。

            好吧,现在玉米已经把图像坐标与世界坐标之间的这场对话所需经历的三个波折的过程加以了解释。即:刚体变换、透视投影、(x,y)换(u,v)(ps.这个在上一篇博文中讲过)。接下来玉米用一张图把三个过程连接起来。实现从世界坐标(X,Y,Z)到(u,v)之间的转换。让图像坐标与世界坐标直接对话。

         下图中的转换关系,都是用齐次坐标表达的,大家会发现这样的表达非常整洁。

         其实这张图显示的过程还有一个名字:摄像机模型(camera model)。其实也就是摄像机的几何模型了。

         将三者相乘,可以把这三个过程和在一起,写成一个矩阵:

P就是世界坐标到图像坐标的直接联系人,P就表示了一个投影相机,有下面公式:

注意在表示齐次坐标时,需要在符号上面加个小帽子。除去齐次坐标控制位P23,P具有11个自由度。

       摄像机模型及其中涉及的坐标系等,是弄清3D重建几何框架的基础。可以把它们视为基本运算关系。后面对于三维重建几何框架的推导,都是要用到三个基本坐标系和摄像机模型的。

        坐标点和像素点之间的区别:它们所描述的对象不同,坐标点是对物理空间中某个点的抽象描述,它通常与具体的尺寸无关。而像素点则是对图像上某个最小单元的描述,它通常与显示设备的分辨率有关,决定了图像的清晰度和精度

        坐标点的取值范围通常是以图像的左上角为原点,向右为正方向增加x坐标,向下为正方向增加y坐标。因此,x_min和x_max的取值范围通常是从 0到图像的宽度,而y_min和y_max的取值范围通常是从 0到图像的高度。而像素点的取值最大值是 宽度-1,高度 -1

在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是图像坐标系相机坐标系之间的转换参数。在实际应用,可以根据相机标定结果计算得到。 这样,我们就完成了世界坐标系到图像坐标系的转换。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值