单目相机重建场景的若干问题

本文主要讨论下本人对单摄像机是否能重建三维目标场景的理解,不足之处请赐教之。

首先,简单讨论下双目测距的原理。如下图:


模型俯视图


模型立体视图


测距的公式:


从公式看,想要得到Z值,需要知道f,T,和xl-xr,分别是焦距,光心距离和视差。

焦距可以通过标定的方法得到或者直接用图像的ExiF信息,光心距离是放置摄像机时确定的,视差可以通过匹配获得。如果用上面的模型拍摄了两幅图像,我们直接得到的是f和T,当然,如果不是得到绝对的位置,这两个值就是个定值,对重建三维目标没有影响。重要的是得到视差值,图像点的匹配可以由多种匹配算法获取,大多数匹配算法匹配的是稀疏点,重建的目标必须是稠密的,因此这里分为两条路:1、稠密匹配得到两幅图的稠密是视差图;2、由稀疏匹配估计稠密视差图,这可以找些论文看看怎么做的。比较单目,双目测距(重建)相对容易,实际操作还是需要解决不少问题。

接下来讨论下单目如何测距。之前必须明白一点,就是单目单视图是没法得到实际深度的,这就和常说的,单只眼睛看到的都是2维的,两只眼睛看到的才是3维的,才是有立体的感觉,这种立体实际就是深度。可能有人认为自己一个眼睛能看到目标都是有深度的,这依赖于两个方面:1、人本身对看到的目标的理解,比如球,桌子,在人的理解中,它们的形状是在大脑中有储备的,也就是先验知识,因此人能识别出看到的东西是什么形状的;2、单只眼睛运动过程能够产生目标的深度信息,这也就是基于图像序列的三维重建,也是本文将讨论的主体内容。

在讨论单目重建的问题之前,有必要先了解下摄像机模型,就是摄像机如何拍摄场景的,这里讨论针孔相机模型。


针孔摄像机模型

其中Oc是相机光心,且是摄像机坐标的原点,xc,yc,zc是3个摄像机坐标轴;平面PI是图像平面,p是zc和PI的角交点,是图像坐标原点,x,y是图像坐标轴,f是焦距,空间有一点Xc,交PI于m。这里涉及到3个坐标系:图像坐标系、摄像机坐标系和世界坐标系。其中摄像机坐标系和世界坐标系是同一坐标系,图像坐标系的原点是光轴与图像平面的原点,至于x,y方向可以自己决定,这里向右为x方向,向下为y方向,和摄像机坐标系保持一致。

控件有一点Xc,投影到图像平面m,这里的Xc是三维向量(x,y,z),投影的m坐标是二维向量,也就是三维到二维的投影,由高等代数知识,可以知道,空间同构的充要条件是维数相同,故这种投影是不可逆的。

,摄像机的投影矩阵可以写成:


这里,我们可以看出,如果Xc的每个分量都增加k倍,得到的m的坐标不会变化。也就是说在摄像机光心和m点的连线上的任何点都会投影到图像的m点上来,反过来讲,知道图像中的m点坐标,只能知道空间点在这条射线上,仅从m点坐标和摄像机参数是得不到空间点的实际坐标的。

实际应用中,光轴与图像的交点不一定是图像的中心,因此中间存在偏移量(x0,y0),此时的投影公式写成:


了解了摄像机模型后,来讨论下单相机两视图三维重建的一些问题。两视图三维重建的目的是重建出相同目标中的场景相对深度信息,即重建三维点云。如果知道摄像机矩阵P1,P2,图像中匹配点的深度信息可以线性求解,因此,三维重建的问题转化为如何求解两个相机矩阵P1P2。求解摄像机矩阵需要解两个部分:内参数和外参数,内参数中的焦距可以读取图像的exif信息得到,如果没有exif信息,在相差一个尺度下,焦距也是确定;外参数中的R,t需要用到标定的方法获取或者通过本质矩阵来得到相对的R,t,这里的两个相机的R,T是没法得到绝对的值的,但是在相差一个射影变换下R,T是确定的,这部分可以参考多视图几何一书。连接两个摄像机矩阵的关系是本质矩阵或者基本矩阵,本质矩阵是在归一化坐标下的基本矩阵,本质矩阵比基本矩阵拥有更多的摄像机信息,在知道相机内参数下,基本矩阵和本质矩阵是可以相互计算的:E=K1TFK2,其中K1T是相机1的内参矩阵的转置,K2是相机2的内参矩阵。基本矩阵的计算方法主要有8点算法和7点算法,计算本质矩阵算法是5点算法。由本质矩阵利用SVD分解可以求解两个摄像机矩阵,这两摄像机矩阵一定是在某一个射影变换下的,实际上相机的相对位置是不变的,重建出来的空间三维目标在展示时的位置不同而已。本质矩阵推倒出两个相机的相对运动关系,即R,T。如果第一个相机的矩阵为P1=K1[I,0],则第二个相机的矩阵为P2=K2[R,T]。在满足相差一个射影变换的前提下,两相机的矩阵是确定的,单目图像序列的内参矩阵是一样的,因此,重建过程可以无需过多考虑内参数的精度,因为这并不是测量。实际的应用中,相机的位置越规则越好,目前的相机,无论是手机或是单反,拍摄的图像基本都有exif信息,因而内参矩阵可以算是已知的了,减少了摄像机标定的工作(一般exif信息中的焦距单位是mm,转换成像素的关系式为:像素数/DPI*25.4=毫米数,DPI也是可以从exif信息中读取到的)。这样就已知了相机矩阵,对于图像的一对匹配点是可以计算出空间位置的了,接下来就是Bundle Adjustment的事情了。






  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
单目相机的三维重建通常涉及到计算机视觉中的结构光、特征匹配和投影几何等技术。以下是一个简单的概述: 1. **图像采集**:使用单目相机拍摄物体或场景的照片。这些照片包含了场景的投影信息。 2. **特征检测**:从图像中提取关键点(features),如SIFT、SURF、ORB等算法,用于后续匹配。 3. **特征匹配**:将不同视角下的相同特征点进行配对,构建视图间的对应关系。这一步可能需要考虑光照变化、噪声等因素。 4. **投影模型**:利用单应性矩阵(homography)或基本矩阵(essential matrix)来描述两个视图之间的几何关系。 5. **三角化**:通过特征匹配确定的对应关系,应用三角公式计算出每个特征点在三维空间的坐标。 6. **深度估计**:基于稠密像素级别的匹配,可以通过光束法平差(Bundle Adjustment)来优化重建结果,提高深度精度。 7. **重建结果**:生成一个3D点云模型或者网格模型,这通常是通过后处理步骤,如表面采样、滤波等。 **代码示例**(以Python的OpenCV库为例): ```python import cv2 import numpy as np # ... (特征检测和匹配) features, matches = ... # 初始化单应性矩阵 good_matches = ratio_test(matches, threshold=0.8) # 计算单应性矩阵 if len(good_matches) > MIN_MATCHES: src_pts = np.float32([features[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) dst_pts = np.float32([features[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) # 使用RANSAC进行单应性矩阵估计并剔除异常值 M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) matches_mask = mask.ravel().tolist() # ... (三角化,深度估计,重建) else: print("Not enough matches are found - %d/%d" % (len(good_matches), MIN_MATCHES)) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值