相机成像---世界坐标系、相机坐标系、图像坐标系和像素坐标系之间的转换关系

本文详细介绍了双目立体视觉深度相机的工作原理,包括相机标定、图像校正、像素点匹配及深度计算过程。通过理解世界坐标系、相机坐标系、图像坐标系和像素坐标系间的转换,阐述了从3D到2D的投影变换。同时,提到了双目视觉的核心——视差计算,并概述了后续的相机标定内容。
摘要由CSDN通过智能技术生成

       新学期第一天开始写的这篇文章,看看我啥时候能把他发出去。假期当然是啥也没干了,之前还信誓旦旦说回家一定能学习,学个毛线。开始学习啦,去年年末把环境配置好了之后,实验发现他不准,用的D435i摄像头是红外的,在水里误差太大,所以最终目地的话就是要给他整准,这脑子一天天啥也不记得,真想去测一个记忆力,看看是不是有问题...首先的话学习一下基础的摄像头的成像原理~

双目立体视觉深度相机的深度测量过程,如下:

1、标定:首先需要对双目相机进行标定,得到两个相机的内外参数、单应矩阵。

2)校正:根据标定结果对原始图像校正,校正后的两张图像位于同一平面且互相平行。

3)找像素点:对校正后的两张图像进行像素点匹配。

4)深度:根据匹配结果计算每个像素的深度,从而获得深度图。

目录

一、理想双目相机成像模型

二、相机成像原理

2.1世界坐标系和相机坐标系之间的转换(刚体变换:物体不会发生形变,只需要进行旋转和平移)

2.2相机坐标系(Oc)与图像坐标系(Ox-y)之间的转换(透视投影:从3D转换到2D)

2.3图像坐标系(Ox-y)与像素坐标系(Ou-v)(仿射变换)

三、总结一下下


一、理想双目相机成像模型

c1、c2是左右两个双目相机(位置对齐)。相机焦距f,相机之间距离为b,右上角为目标位置P(x,y),目标的水平坐标为x,相机离目标垂直距离(所求目标距离相机的深度)为z。

如果要计算深度z,必须要知道:

(1)相机焦距f,左右相机之间距离b。这些参数可以通过先验信息或者相机标定得到。

(2)视差d。需要知道左相机的每个像素点(xl, yl)和右相机中对应点(xr, yr)的对应关系。这是双目视觉的核心问题。

二、相机成像原理

想标定得先成像,所以先来搞清楚相机是如何成像滴

相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。

世界坐标系:描述目标物体在真实世界的位置而引入的三维世界坐标系。

相机坐标系:以相机为中心,从相机角度描述物体位置,作为像素坐标系—世界坐标系的桥梁。

图像坐标系:描述真实物体在相机焦距处成像的坐标系,用来连接相机坐标系与像素坐标系。

像素坐标系:描述物体在照片上数字图像的位置而引入的一种数字坐标系。

 从一个坐标系到另一个坐标系,物体之间的坐标系变换都可以表示坐标系的旋转变换加上平移变换。

 为啥向上面那样写呢:以绕Z轴旋转\theta为例

 如下图,绕Z转,Z不变,我们把三维转为二维,根据几何关系就可以得到,其他两个也一样。

原理知道了以后,我们看这四个坐标系如何变换,由现实中的物体最后在图像中成像

世界坐标系\rightarrow相机坐标系\rightarrow图像坐标系\rightarrow像素坐标系

2.1世界坐标系和相机坐标系之间的转换(刚体变换:物体不会发生形变,只需要进行旋转和平移)

如下图,R表示旋转矩阵,T表示偏移变量

2.2相机坐标系(Oc)与图像坐标系(Ox-y)之间的转换(透视投影:从3D转换到2D)

         说白了就是用X{c},Y{c},Z{c}来表示x,y,下图为理想的图像坐标系,实际会产生畸变,需要矫正。

2.3图像坐标系(Ox-y)与像素坐标系(Ou-v)(仿射变换)

像素坐标系和图像坐标系都在成像平面上,但是原点所在位置不同,单位不同。图像坐标系的原点为相机光轴与成像平面的交点(上图点o),通常情况下是成像平面的中点,图像坐标系的单位是mm,而像素坐标系的原点在图像左上角(本文第三张图上有画),单位是pixel。

2.3.1两坐标轴都为直角坐标系(uv垂直)

图像上的每点坐标 (u,v) 分别表示每一帧采集的图像在系统中的存储的数组的列数与行数,坐标 (u,v) 所对应的值就是该点的灰度信息。设点o在图像像素坐标系中记为 (u0,v0) ,每个像素沿 x 轴的实际物理尺寸大小是 dx,沿 y 轴的实际物理尺寸大小是dy ,单位值mm,即1pixel=dx mm。则能得到两个坐标系间的关系式 。

2.3.2两坐标轴有一个轴平行,一个轴不平行

三、总结一下下

三个穿起来就变成了:

其中,Xw,Yw,Zw为在世界坐标系下一点的物理坐标,u,v为该点对应的在像素坐标系下的像素坐标,Zc为尺度因子。最右边等式的第一个是相机的内参,内参矩阵取决于相机的内部参数。其中, f为像距,dx,dy分别表示X,Y方向上的一个像素在相机感光板上的物理长度(即一个像素在感光板上是多少毫米),u0,v0分别表示相机感光板中心在像素坐标系下的坐标,\theta表示感光板的横边和纵边之间的角度(90度表示无误差)。第二是相机的外参,外参矩阵取决于相机坐标系和世界坐标系的相对位置,R表示旋转矩阵,T表示平移矢量。

下一篇我们就看一下啥叫标定。

 

 

  • 51
    点赞
  • 270
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: Python是一种面向对象编程语言,其具有强大的编程能力和丰富的第三方库支持。其中,OpenCV是一种开源计算机视觉库,广泛应用于图像处理和计算机视觉领域。在Python中,利用OpenCV计算图像中两个中心点之间的距离可以通过以下几个步骤实现: 1. 导入必要的库及图像。 ``` python import cv2 import numpy as np image = cv2.imread("image.jpg") ``` 2. 确定需要计算距离的两个中心点及其横纵坐标。 ``` python center1 = (x1, y1) center2 = (x2, y2) ``` 3. 计算中心点之间的欧几里得距离。 ``` python distance = np.sqrt((center1[0]-center2[0])**2 + (center1[1]-center2[1])**2) ``` 4. 输出距离值或可视化显示距离。 ``` python print("两个中心点之间的距离为:", distance) cv2.line(image, center1, center2, (0, 255, 0), thickness=2) cv2.imshow("Image", image) cv2.waitKey(0) ``` 以上就是利用Python和OpenCV计算图像中两个中心点之间距离的简单方法,通过像素坐标计算距离。需要注意的是,在实际使用中,还需考虑图像分辨率、拍摄角度、畸变校正、相机标定等因素的影响,才能得到更准确的距离计算结果。 ### 回答2: Python的OpenCV是图像处理领域最常用的库之一,可以方便地使用它来计算图像中任意两个中心点之间的距离。以下是实现步骤: 1.导入必要的库 这里需要导入的库包括OpenCV、numpy等。 2.读取图像 使用OpenCV读取要处理的图像。 3.获取中心点 使用Python的绘图库,可以很容易地获取图像中心点的坐标。这里可以利用OpenCV提供的函数,比如cv2.findContours()和cv2.minEnclosingCircle()。 4.计算两点之间的距离 根据两点的坐标,可以求它们之间的距离。可以使用Python的math库中提供的欧式距离公式来计算距离。 下面是代码示例: import cv2 import numpy as np import math # 读取图像 img = cv2.imread('image.jpg') # 获取中心点 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(gray, 127, 255, 0) contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnt = contours[0] (x,y),radius = cv2.minEnclosingCircle(cnt) center = (int(x),int(y)) cv2.circle(img,center,int(radius),(0,255,0),2) # 两点坐标 point1 = (100, 100) point2 = center # 计算距离 distance = math.sqrt((point1[0]-point2[0])**2 + (point1[1]-point2[1])**2) print('两点之间的距离: ', distance) cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() 以上步骤可以实现计算图像中两个中心点之间的距离。需要注意的是,在实际应用中,需要针对具体的场景进行调整和优化,以获得更好的效果。 ### 回答3: Python是一种高级编程语言,可用于开发各种类型的应用程序,包括计算机视觉应用程序。计算机视觉领域的一个重要应用程序就是图像处理,其中OpenCV是一个非常流行的工具包。OpenCV是计算机视觉领域中的开源计算机视觉库,可用于实现各种计算机视觉应用程序。 对于计算机视觉应用程序,常常需要计算图像中两个中心点之间的距离。Python结合OpenCV可以很轻松地实现这一功能。下面我们来介绍如何使用Python和OpenCV计算图像中两个中心点之间的距离。 1. 安装OpenCV库:在Python中使用OpenCV库需要先安装这个开源计算机视觉库。在运行Python代码之前,首先在计算机上安装OpenCV库。可以使用下面的命令来安装OpenCV库: pip install opencv-python 2. 加载图像:接下来,需要加载要处理的图像。可以使用cv2.imread函数来加载图像。例如,可以使用以下代码来加载一个名为“image.jpg”的图像: import cv2 img = cv2.imread('image.jpg') 3. 计算两个中心点之间的距离:一旦图像被加载,需要提取两个对象的中心点,并计算它们之间的距离。可以使用cv2.minAreaRect函数来计算对象的边界框,然后使用矩形的中心坐标来计算中心点。例如,可以使用以下代码来计算对象的中心点: contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in contours: rect = cv2.minAreaRect(c) center = rect[0] 接下来,可以使用一些公式来计算两个中心点之间的距离。可以使用欧几里德距离公式来计算两个点之间的距离。例如,可以使用以下代码来计算两个中心点之间的距离: distance = ((center1[0]-center2[0])**2 + (center1[1]-center2[1])**2)**0.5 4. 显示结果:最后,需要将计算结果显示在图像上。可以使用cv2.putText功能来将计算结果显示在图像的顶部。例如,可以使用以下代码将计算结果显示在图像的顶部: font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img, 'Distance:' + str(distance), (10, 30), font, 1, (255, 255, 255), 2, cv2.LINE_AA) 5. 完整代码: import cv2 img = cv2.imread('image.jpg') contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in contours: rect = cv2.minAreaRect(c) center = rect[0] center1 = center #第一个中心点 # 计算第二个中心点 # 计算两个中心点之间的距离 distance = ((center1[0]-center2[0])**2 + (center1[1]-center2[1])**2)**0.5 font = cv2.FONT_HERSHEY_SIMPLEX cv2.putText(img, 'Distance:' + str(distance), (10, 30), font, 1, (255, 255, 255), 2, cv2.LINE_AA) cv2.imshow('Image', img) cv2.waitKey(0) cv2.destroyAllWindows() 通过这些步骤,就可以很容易地使用Python和OpenCV计算图像中两个中心点之间的距离。这对于各种计算机视觉应用程序非常有用,例如目标跟踪、目标定位等。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值