OpenCV学习笔记(18)双目测距与三维重建的OpenCV实现问题集锦(三)立体匹配与视差计算

合集下载

opencv双目视觉三维重建代码

opencv双目视觉三维重建代码

一、概述双目视觉是一种通过两个摄像头拍摄同一场景来获取深度信息的技术,它在计算机视觉领域有着广泛的应用。

在双目视觉中,图像识别、匹配和三维重建是其中的关键环节。

OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。

本文将介绍使用OpenCV实现双目视觉三维重建的代码,帮助读者快速上手这一技术。

二、环境准备在开始编写双目视觉三维重建代码之前,我们需要准备好相应的开发环境。

首先确保已经安装了OpenCV库,可以通过冠方全球信息站或者包管理工具进行安装。

需要准备两个摄像头,保证两个摄像头的焦距、畸变参数等校准信息。

确保安装了C++或者Python的开发环境,以便编写和运行代码。

三、双目视觉图像获取1. 初始化摄像头在代码中需要初始化两个相机,并设置相应的参数,例如分辨率、曝光时间、白平衡等。

可以使用OpenCV提供的方法来实现这一步骤。

2. 同步获取图像由于双目视觉需要同时获取两个摄像头的图像,所以我们需要确保两个摄像头的图像获取是同步的。

可以通过多线程或者硬件同步的方式来实现图像的同步获取。

四、双目视觉图像预处理1. 图像校准由于摄像头的畸变等因素会影响后续的视图匹配和三维重建结果,因此需要对图像进行校准。

可以使用OpenCV提供的摄像头校准工具来获取相机的内参和外参,通过这些参数对图像进行去畸变处理。

2. 图像匹配在获取到双目图像之后,需要对这两个图像进行特征提取和匹配。

可以使用SIFT、SURF等特征提取算法来提取图像的关键点,并使用特征匹配算法(例如FLANN或者暴力匹配)来进行图像匹配。

五、立体匹配1. 视差计算在进行图像匹配之后,我们可以通过计算视差来获取场景中不同物体的深度信息。

OpenCV提供了多种视差计算算法,例如BM、SGBM 等,可以根据实际情况选择适合的算法。

2. 深度图生成通过视差计算得到的视差图可以进一步转换为深度图,从而得到场景中每个像素点的深度信息。

基于深度学习的双目视觉三维重建

基于深度学习的双目视觉三维重建

中文摘要中文摘要随着工业自动化的高速发展,机器人等智能设备在工业生产中的应用日渐广泛。

对周边环境的感知是设备智能化的一项重要研究内容,目前,获取周边三维环境信息的主要技术途径以激光雷达和双目相机为主,与超声波传感器、激光雷达相比,双目相机具有获取信息丰富,价格低廉,精度高的特点,通常应用于实时测距、三维形貌恢复、缺陷诊断等领域。

智能设备在实际作业时,对周围的三维环境进行精确的三维重建有助于实际作业的安全有效进行,本文基于深度学习算法,对双目视觉系统的三维重建进行研究。

本文的主要研究内容有:(1)研究了当前摄像头标定的主流方法,对其具体算法实现进行了分析,通过对双目相机进行标定得到相机的内参数和外参数,基于相机的内外参数实现图像矫正、三维重建工作。

(2)对相机的成像和畸变原理进行分析和研究,对采集图像进行滤波、自适应伽马变换与去畸变处理,提高双目相机采集图像的质量。

(3)对双目视觉中最关键的算法——立体匹配算法进行研究,为了解决传统立体匹配算法匹配精度较低,误匹配区域较大的问题,本文基于深度学习算法,利用2D卷积神经网络对双目相机获取的左、右图进行匹配代价提取,并利用3D卷积神经网络对聚合后的匹配代价进行特征总结和匹配差异学习。

将立体匹配问题转化为一个有监督的机器学习问题,在KIIT2015数据集上训练一个端到端的神经网络模型,该卷积神经网络直接使用双目相机获取的左右两图作输入,直接输出预测的视差图。

(4)通过相机内外参数及立体匹配视差图得到周围环境的三维点云信息,并通过阈值分割算法提取特定工作范围内的稠密点云数据。

(5)搭建了综合实验平台,与其它算法的立体匹配效果进行对比,并对比标准雷达测距数据计算本文算法的精确度,验证了本文算法的有效性。

关键词:双目视觉;立体匹配;深度学习;三维重建I基于深度学习的双目视觉三维重建IIABSTRACTABSTRACTWith the rapid development of industrial automation,smart devices such as robots are increasingly used in industrial production.Perception of the surrounding environment is an important research content of device intelligence.At present,we mainly obtain three-dimensional information of the surrounding environment through lidar and binocular pared with ultrasonic sensors and lidar,binocular cameras obtain It is more abundant,the price is lower,and the accuracy is higher.It is usually used in real-time ranging, three-dimensional shape restoration,defect diagnosis and other fields.During the actual operation of the smart device,accurate3D reconstruction of the surrounding3D environment is helpful for the safe and effective operation of the actual operation.Based on the deep learning algorithm,this paper studies the3D reconstruction of the binocular vision system. The main research contents of this article are:(1)This paper studies the current mainstream camera calibration methods,analyzes its specific algorithm implementation,obtains the camera's internal and external parameters by calibrating the binocular camera,and implements image correction and3D reconstruction based on the camera's internal and external parameters.(2)This paper analyzes and studies the imaging and distortion principles of the camera, and filters,adaptive gamma transforms,and distorts the collected images to improve the quality of the images captured by the binocular camera.(3)This paper studies the most critical algorithm in binocular vision-stereo matching algorithm.In order to solve the problems of low matching accuracy and large mismatching area of traditional stereo matching algorithms,this paper uses a2D convolution neural network to extract the matching cost of the left and right images obtained by the binocular camera based on deep learning algorithms,and uses3D The product neural network performs feature summarization and matching difference learning on the aggregated matching costs. Turn the stereo matching problem into a supervised machine learning problem.Train an end-to-end neural network model on the KIIT2015dataset.The convolutional neural network directly uses the left and right images obtained by the binocular camera as input,and directly output the predicted Disparity map.(4)Obtain the three-dimensional point cloud information of the surrounding environmentIII基于深度学习的双目视觉三维重建through the internal and external parameters of the camera and the stereo matching disparity map,and extract the dense point cloud data within a specific working range through the threshold segmentation algorithm.(5)A comprehensive experimental platform was built to compare the stereo matching effect with other algorithms,and to compare the accuracy of the algorithm in this paper with standard radar ranging data to verify the effectiveness of the algorithm in this paper.Key words:Binocular vision;stereo matching;deep learning;3D reconstructionIV目录目录第一章绪论 (1)1.1课题的研究背景及意义 (1)1.2国内外研究现状 (1)1.3论文主要内容及工作 (5)第二章相机标定及图像预处理 (7)2.1单目相机数学模型 (7)2.2双目相机数学模型 (9)2.3双目相机的标定 (11)2.3.1张正友标定法 (11)2.3.2立体标定 (13)2.3.2畸变参数估计 (14)2.4双目极线矫正 (15)2.5图像预处理 (17)2.5.1图像去噪 (18)2.5.1伽马变换 (18)2.6本章小结 (20)第三章基于深度学习的立体匹配 (21)3.1传统立体匹配算法的基本理论 (21)3.2基于深度学习的立体匹配发展 (23)3.2.1深度学习的基本原理 (23)3.2.2mc-cnn与GC-net (27)3.3基于W-net的立体匹配 (29)3.3.1残差结构与通道注意模块介绍 (29)3.3.2W-ne2D模块(2D卷积网络部分) (31)3.3.3Cost Value模块(代价聚合部分) (33)3.3.4W-net3D模块(3D卷积网络部分) (34)3.3.5Prob模块(视差预测部分) (36)3.3.6数据集的选择 (37)3.3.7损失函数的选择 (37)V基于深度学习的双目视觉三维重建3.3.8权值初始化及优化算法 (38)3.3.9网络结构说明 (39)3.4本章小结 (40)第四章基于视差图的三维重建 (41)4.1整体视差图的三维点云 (41)4.2视差图处理 (44)4.3点云滤波处理 (47)4.4本章小结 (48)第五章基于双目相机的三维点云重建算法与平台的实现 (49)5.1Pytorch、Opencv、Qt简介 (49)5.2平台开发环境 (49)5.3算法流程与实验结果分析 (50)5.4本章小结 (58)第六章总结与展望 (59)参考文献 (61)致谢 (65)附录 (67)VI第一章绪论第一章绪论1.1课题的研究背景及意义计算机视觉的任务是赋予计算机“自然视觉”的能力,使计算机对输入的图像(视频)进行处理,实现对图像中内容的表达和理解。

学习笔记:使用opencv做双目测距(相机标定+立体匹配+测距).

学习笔记:使用opencv做双目测距(相机标定+立体匹配+测距).

学习笔记:使⽤opencv做双⽬测距(相机标定+⽴体匹配+测距).最近在做双⽬测距,觉得有必要记录点东西,所以我的第⼀篇博客就这么诞⽣啦~双⽬测距属于⽴体视觉这⼀块,我觉得应该有很多⼈踩过这个坑了,但⽹上的资料依旧是云⾥雾⾥的,要么是理论讲⼀⼤堆,最后发现还不知道怎么做,要么就是直接代码⼀贴,让你懵逼。

所以今天我想做的,是尽量给⼤家⼀个明确的阐述,并且能够上⼿做出来。

⼀、标定⾸先我们要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这⾥顺带提⼀句,这本书虽然确实⽼,但有些理论、算法类的东西⾥⾯还是讲的很不错的,必要的时候可以去看看。

Q1:为什么要做摄像头标定?A: 标定的⽬的是为了消除畸变以及得到内外参数矩阵,内参数矩阵可以理解为焦距相关,它是⼀个从平⾯到像素的转换,焦距不变它就不变,所以确定以后就可以重复使⽤,⽽外参数矩阵反映的是摄像机坐标系与世界坐标系的转换,⾄于畸变参数,⼀般也包含在内参数矩阵中。

从作⽤上来看,内参数矩阵是为了得到镜头的信息,并消除畸变,使得到的图像更为准确,外参数矩阵是为了得到相机相对于世界坐标的联系,是为了最终的测距。

ps1:关于畸变,⼤家可以看到⾃⼰摄像头的拍摄的画⾯,在看矩形物体的时候,边⾓处会有明显的畸变现象,⽽矫正的⽬的就是修复这个。

ps2:我们知道双⽬测距的时候两个相机需要平⾏放置,但事实上这个是很难做到的,所以就需要⽴体校正得到两个相机之间的旋转平移矩阵,也就是外参数矩阵。

Q2:如何做摄像头的标定?A:这⾥可以直接⽤opencv⾥⾯的sample,在opencv/sources/sample/cpp⾥⾯,有个calibration.cpp的⽂件,这是单⽬的标定,是可以直接编译使⽤的,这⾥要注意⼏点:1.棋盘棋盘也就是标定板是要预先打印好的,你打印的棋盘的样式决定了后⾯参数的填写,具体要求也不是很严谨,清晰能⽤就⾏。

之所⽤棋盘是因为他检测⾓点很⽅便,and..你没得选。

opencv的双目立体校正函数 -回复

opencv的双目立体校正函数 -回复

opencv的双目立体校正函数-回复OpenCV(开源计算机视觉库)提供了一系列功能强大的函数,用于处理双目立体视觉任务。

其中一个关键函数是双目立体校正函数(stereoRectify),它在立体视觉中用于消除摄像机畸变并将两个摄像机的图像校正到一个共同的平面上。

本文将从头开始一步一步解释这个函数的操作。

第一步:导入必要的库和模块首先,需要导入OpenCV库和其他需要的库和模块。

在Python中,可以使用以下代码导入这些库:pythonimport cv2import numpy as np第二步:定义相机参数和视差参数在进行双目立体校正之前,需要定义每个摄像机的参数和视差参数。

这些参数包括相机内参、相机畸变系数、旋转矩阵和投影矩阵等。

为了简化说明,我们这里使用一个简化的示例参数:python# 相机内参cameraMatrix1 = np.eye(3)cameraMatrix2 = np.eye(3)# 相机畸变系数distCoeffs1 = np.zeros((5, 1))distCoeffs2 = np.zeros((5, 1))# 至关重要的矩阵R = np.eye(3)T = np.zeros((3, 1))这些参数是根据相机特性和摄像机标定过程获得的。

在实际应用中,应根据具体情况相应地设置这些参数。

第三步:计算校正变换矩阵通过使用上述相机参数和视差参数,可以计算出双目立体校正所需的校正变换矩阵。

校正变换矩阵将两个摄像机的图像校正到一个共同的平面上。

在OpenCV中,可以使用以下代码计算校正变换矩阵:python# 计算校正变换矩阵及其逆矩阵rectifyScale = 1 # 校正后图像的缩放因子R1, R2, P1, P2, Q, validPixROI1, validPixROI2 =cv2.stereoRectify(cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, imageSize, R, T, rectifyScale)在上述代码中,imageSize是输入图像的大小。

基于双目线结构光的三维重建及其关键技术研究

基于双目线结构光的三维重建及其关键技术研究

基于双目线结构光的三维重建及其关键技术研究基于双目线结构光的三维重建是一种常见的三维重建方法,在计算机视觉和图像处理领域有广泛应用。

本文将探讨双目线结构光三维重建的基本原理和关键技术。

一、基本原理双目线结构光的三维重建基于以下原理:通过投射具有特定空间编码的光线,利用摄像机捕捉图像,并对图像进行处理和分析,可以推断出场景中物体的三维形状和深度信息。

二、关键技术1. 双目成像双目成像是双目线结构光重建的基础。

通过使用两个物理上分开的相机,可以获取场景的不同视角,从而获得更多的信息,提高重建的精度和稳定性。

2. 线结构光投影线结构光投影是双目线结构光重建的核心技术。

通过投射特定编码的结构光,可以在场景中形成一系列光条或光带,从而在摄像机中产生对应的图像。

这样,可以通过分析图像中结构光的失真或形状变化,来推断物体表面的深度信息。

3. 结构光编码结构光编码是双目线结构光重建的重要组成部分。

通过在结构光中引入编码,可以增加光条或光带的区分度,从而提高重建的精度。

常见的编码方法包括灰度编码、正弦编码、校正编码等。

4. 影像获取与处理双目线结构光重建需要获取并处理图像数据。

影像获取涉及到摄像机的标定、同步和触发等技术,以确保双目系统的准确性和稳定性。

影像处理包括去噪、校准、纹理映射等步骤,以提取出有效的结构光信息,并进行后续的三维重建处理。

5. 三维重建算法三维重建算法是双目线结构光重建的核心内容。

常见的算法包括三角测量、立体匹配、点云拼接等。

这些算法通过分析不同视角的结构光图像,通过匹配和计算来推断物体的三维形状和深度信息。

6. 点云处理与可视化三维重建通常最终呈现为点云模型。

点云处理涉及到点云滤波、配准、分割等技术,以去除噪声、合并重叠点云、提取物体表面等。

点云可视化则将点云数据以直观的形式呈现,便于人们观察和理解。

综上所述,基于双目线结构光的三维重建是一种常见的三维重建方法。

它利用投射特定编码的结构光,结合双目成像和影像处理技术,通过分析图像中的结构光信息,推断物体的三维形状和深度信息。

双目视觉的目标三维重建matlab

双目视觉的目标三维重建matlab

双目视觉的目标三维重建matlab
双目视觉的目标三维重建是一个复杂的过程,它涉及到许多步骤,包括相机标定、立体匹配、深度估计和三维重建。

以下是一个简化的双目视觉的目标三维重建的Matlab实现步骤:
1. 相机标定:首先,我们需要知道相机的内部参数(例如焦距和主点坐标)和外部参数(例如旋转矩阵和平移向量)。

这些参数通常通过标定过程获得。

在Matlab中,可以使用`calibrateCamera`函数进行相机标定。

2. 立体匹配:立体匹配是确定左右两幅图像中对应像素点的过程。

这可以通过使用诸如SGBM(Semi-Global Block Matching)等算法来完成。

在Matlab中,可以使用`stereoMatch`函数进行立体匹配。

3. 深度估计:一旦我们有了立体匹配的结果,就可以估计像素点的深度。

深度通常由视差和相机参数计算得出。

在Matlab中,可以使用
`depthFromDisparity`函数根据立体匹配结果计算深度。

4. 三维重建:最后,我们可以使用深度信息将像素点转换到三维空间中,从而得到目标的三维模型。

这通常涉及到一些几何变换和插值操作。

在Matlab中,可以使用`projective2DCoordinates`函数将像素坐标转换为三维空间中的坐标。

以上步骤只是一个基本的流程,实际应用中可能需要进行更复杂的处理,例如处理遮挡、噪声、光照变化等问题。

注意:以上步骤可能需要根据实际项目需求进行调整和优化,并且需要具备一定的计算机视觉和Matlab编程基础才能理解和实现。

双摄像头测距参考资料

双摄像头测距参考资料

虽然最近注意力已经不可遏制地被神经科学、大脑记忆机制和各种毕业活动吸引过去了,但是还是觉得有必要把这段时间双目视觉方面的进展总结一下。

毕竟从上一篇博文发表之后,很多同仁发E-mail来与我讨论,很多原来的疑团,也在讨论和一步步的试验中逐渐解决了。

开篇之前,首先要感谢maxwellsdemon和wobject,没有和你们的讨论,也就没有此篇的成文。

说到双摄像头测距,首先要复习一下测距原理,把Learning OpenCV翻到416和418页,可以看到下面两幅图图1. 双摄像头模型俯视图图2, 双摄像头模型立体视图图1解释了双摄像头测距的原理,书中Z的公式如下:在OpenCV中,f的量纲是像素点,Tx的量纲由定标棋盘格的实际尺寸和用户输入值确定,一般总是设成毫米,当然为了精度提高也可以设置为0.1毫米量级,d=xl-xr的量纲也是像素点。

因此分子分母约去,z的量纲与Tx相同图2解释了双摄像头获取空间中某点三维坐标的原理。

可以看到,实际的坐标计算利用的都是相似三角形的原理,其表达式就如同Q矩阵所示。

空间中某点的三维坐标就是(X/W, Y/W, Z/W)。

因此,为了精确地求得某个点在三维空间里的距离,我们需要获得的参数有焦距f、视差d、摄像头中心距Tx。

如果还需要获得X坐标和Y坐标的话,那么还需要额外知道左右像平面的坐标系与立体坐标系中原点的偏移cx 和cy。

其中f, Tx, cx和cy可以通过立体标定获得初始值,并通过立体校准优化,使得两个摄像头在数学上完全平行放置,并且左右摄像头的cx , cy和f相同(也就是实现图2中左右视图完全平行对准的理想形式)。

而立体匹配所做的工作,就是在之前的基础上,求取最后一个变量:视差d(这个d一般需要达到亚像素精度)。

从而最终完成求一个点三维坐标所需要的准备工作。

在清楚了上述原理之后,我们也就知道了,所有的这几步:标定、校准和匹配,都是围绕着如何更精确地获得f, d, Tx, cx 和cy而设计的。

基于双目视觉的三维重建

基于双目视觉的三维重建

(3)根据曲面拓扑形式的不同可以将曲面重建方法分为两大类: 基于矩形域曲面的方法和基于三角域曲面的方法。基于矩形域的曲 面建模主要面向有序数据点云,而基于三角域的曲面建模则是面向 散乱数据点云。这样,经过曲面重建算法,可以得到三维模型的可 见外壳
2.5纹理映射
2.5.1纹理映射定义 在计算机图形学中,为了使模型具有视觉上的真实感,常常预先定义
(3)常见算法:
a、区域匹配; b、相位匹配; c、特征点匹配;
图 特征匹配结果
2.3三维空间点定位
如图,m是提取的图像特征点,通过特征匹配得到其在另一平面的
匹配点为m’。由摄像机标定得知投影矩阵P和P’,故可以得到这对匹配
点(m,m’)的反投影的两条射线。当匹配点满足对极几何约束时,
反投影射线会在空间中相交,交点M的坐标即为三维空间坐标。 M yw zw xw
l m
I
e o
l' m
I
e' o
R,T 图 三维空间点定位
通常情况下,像点坐标都存在测量误差,使得对极几何约束得不到 满足,无法使用反投影交点的方法得到三维空间坐标。因此,需要计 算出三维空间坐标的最佳估计值,这个过程称为三维空间点定位。
可用最小二乘法求取坐标,或者用最大似然估计法最小化投影误差。
zc
yu
0
1 0
0 f 0
0 0 1
0 0 0
xc
yc
zc
1
最终得到
u 1/ dx 0 u0 f
zc
v
0
1/ dy
v0
0
1 0 0 1 0
0 f 0
0 0
0 1
0 0
R o3T
x
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3. 怎样获取与原图像有效像素区域相同的视差图?
在 OpenCV2.0 及以前的版本中,所获取的视差图总是在左侧和右侧有明显的黑色区域,这些区域没 有有效的视差数据。视差图有效像素区域与视差窗口(ndisp,一般取正值且能被 16 整除)和最小 视差值(mindisp,一般取 0 或负值)相关,视差窗口越大,视差图左侧的黑色区域越大,最小视差 值越小,视差图右侧的黑色区域越大。其原因是为了保证参考图像(一般是左视图)的像素点能在目 标图像(右视图)中按照设定的视差匹配窗口匹配对应点,OpenCV 只从参考图像的第 (ndisp - 1 + mindisp) 列开始向右计算视差,第 0 列到第 (ndisp - 1 + mindisp) 列的区域视差统一设置为 (mindisp - 1) *16;视差计算到第 width + mindisp 列时停止,余下的右侧区域视差值也统一设 置为 (mindisp - 1) *16。
(3) BM 算法比 2.0 版性能有所提升, 其状态参数新增了对左右视图感兴趣区域 ROI 的支持 (roi1 和 roi2,由 stereoRectify 函数产生); (4) BM 算法和 GC 算法的核心代码改动不大, 主要是面向多线程运算方面的 (由 OpenMP 转向 Intel TBB); (5) cvFindStereoCorrespondenceBM 函数的 disparity 参数的数据格式新增了 CV_32F 的支持,这 种格式的数据给出实际视差,而 2.0 版只支持 CV_16S,需要除以 16.0 才能得到实际的视差数值。
2. 用于立体匹配的图像可以是彩色的吗?
在 OpenCV2.1 中, BM 和 GC 算法只能对 8 位灰度图像计算视差, SGBM 算法则可以处理 24 位 (8bits*3) 彩色图像。所以在读入图像时,应该根据采用的算法来处理图像:
int color_mode = alg == STEREO_SGBM ? 1 : 0; ////////////////////////////////////////////////////////////////////////// // 载入图像 cvGrabFrame( lfCam ); cvGrabFrame( riCam ); frame1 = cvRetrieveFrame( lfCam ); frame2 = cvRetrieveFrame( riCam ); if(frame1.empty()) break; resize(frame1, img1, img_size, 0, 0); resize(frame2, img2, img_size, 0, 0); // 选择彩色或灰度格式作为双目匹配的处理图像 if (!color_mode && cn>1) { cvtColor(img1, img1gray, CV_BGR2GRAY); cvtColor(img2, img2gray, CV_BGR2GRAY); img1p = img1gray; img2p = img2gray; } else { img1p = img1; img2p = img2; }
图 18 B、 匹配代价叠加 一般来说, 全局算法基于原始匹配代价进行后续算法计算。而区域算法则需要通过窗口叠加来增强匹 配代价的可靠性,根据原始匹配代价不同,可分为:
图 19 C、 视差获取 对于区域算法来说,在完成匹配代价的叠加以后,视差的获取就很容易了,只需在一定范围内选取叠 加匹配代价最优的点(SAD 和 SSD 取最小值,NCC 取最大值)作为对应匹配点,如胜者为王算法 WTA (Winner-take-all)。而全局算法则直接对原始匹配代价进行处理,一般会先给出一个能量评 价函 数,然后通过不同的优化算法来求得能量的最小值,同时每个点的视差值也就计算出来了。 D、视差细化(亚像素级) 大多数立体匹配算法计算出来的视差都是一些离散的特定整数值,可满足一般应用的精度要求。但在 一些精度要求比较高的场合, 如精确的三维重构中,就需要在初始视差获取后采用一些措施对视差进 行细化,如匹配代价的曲线拟合、图像滤波、图像分割等。 有关立体匹配的介绍和常见匹配算法的比较,推荐大家看看 Stefano Mattoccia 的讲义 Stereo Vision: algorithms and applications,190 页的 ppt,讲解得非常形象详尽。
4. cvFindStereoCorrespondenceBM 的输出结果好像不是以像素点为单位的视差?
“@scyscyao:在 OpenCV2.0 中,BM 函数得出的结果是以 16 位符号数的形式的存储的,出于精度需 要,所有的视差在输出时都扩大了 16 倍(2^4)。其具体代码表示如下: dptr[y*dstep] = (short)(((ndisp - mind - 1 + mindisp)*256 + (d != 0 ? (p-n)*128/d : 0) + 15) >> 4); 可以看到,原始视差在左移 8 位(256)并且加上一个修正值之后又右移了 4 位,最终的结果就是左移 4 位。 因此,在实际求距离时,cvReprojectTo3D 出来的 X/W,Y/W,Z/W 都要乘以 16 (也就是 W 除以 16),才 能得到正确的三维坐标信息。” 在 OpenCV2.1 中,BM 算法可以用 CV_16S 或者 CV_32F 的方式输出视差数据,使用 32 位 float 格式 可以得到真实的视差值, 而 CV_16S 格式得到的视差矩阵则需要 除以 16 才能得到正确的视差。 另外, OpenCV2.1 另外两种立体匹配算法 SGBM 和 GC 只支持 CV_16S 格式的 disparity 矩阵。
(2) 平滑表面的镜面反射
(3) 投影缩减(Foreshortபைடு நூலகம்ning)
(4) 透视失真(Perspective distortions)
(5) 低纹理(Low texture)
(6) 重复纹理(Repetitive/ambiguous patterns)
(7) 透明物体
(8) 重叠和非连续
目前立体匹配算法是计算机视觉中的一个难点和热点,算法很多,但是一般的步骤是: A、匹配代价计算 匹配代价计算是整个立体匹配算法的基础,实际是对不同视差下进行灰度相似性测量。常见的方法有 灰度差的平方 SD(squared intensity differences),灰度差的绝对值 AD(absolute intensity differences)等。另外,在求原始匹配代价时可以设定一个上限值,来减弱叠加过程中的误匹配的 影响。以 AD 法求匹配代价为例,可用下式进行计 算,其中 T 为设定的阈值。
OpenCV 学习笔记(18)双目测距与三维重建的 OpenCV 实现问题集锦(三)立体 匹配与视差计算
四、双目匹配与视差计算
立体匹配主要是通过找出每对图像间的对应关系,根据三角测量原理,得到视差图;在获得了视差信 息后, 根据投影模型很容易地可以得到原始图像的深度信息和三维信息。立体匹配技术被普遍认为是 立体视觉中最困难也是最关键的问题,主要是以下因素的影响: (1) 光学失真和噪声(亮度、色调、饱和度等失衡)
5. 如何设置 BM、SGBM 和 GC 算法的状态参数?
(1)StereoBMState // 预处理滤波参数


preFilterType:预处理滤波器的类型,主要是用于降低亮度失真(photometric distortions) 、消除噪声和增强 纹理等, 有两种可选类型:CV_STEREO_BM_NORMALIZED_RESPONSE(归一化响应) 或者 CV_STEREO_BM_XSOBEL(水平方向 Sobel 算子,默认类型), 该参数为 int 型; preFilterSize:预处理滤波器窗口大小,容许范围是[5,255],一般应该在 5x5..21x21 之间,参数必须为奇数 值, int 型 preFilterCap:预处理滤波器的截断值,预处理的输出值仅保留[-preFilterCap, preFilterCap]范围内的值,参数 范围:1 - 31(文档中是 31,但代码中是 63), int
1. opencv2.1 和 opencv2.0 在做 stereo vision 方面有什么区别了?
2.1 版增强了 Stereo Vision 方面的功能: (1) 新增了 SGBM 立体匹配算法(源自 Heiko Hirschmuller 的《Stereo Processing by Semi-global Matching and Mutual Information》), 可以获得比 BM 算法物体轮廓更清晰的视差图(但低纹理 区域容易出现横/斜纹路, 在 GCstate->fullDP 选项使能时可消减这种异常纹路,但对应区域视差变 为 0,且运行速度会有所下降),速度比 BM 稍慢, 352*288 的帧处理速度大约是 5 帧/秒; (2) 视差效果:BM < SGBM < GC;处理速度:BM > SGBM > GC ;
00177 static const int DISPARITY_SHIFT = 4; „ 00411 int ndisp = state->numberOfDisparities; 00412 int mindisp = state->minDisparity; 00413 int lofs = MAX(ndisp - 1 + mindisp, 0); 00414 int rofs = -MIN(ndisp - 1 + mindisp, 0); 00415 int width = left->cols, height = left->rows; 00416 int width1 = width - rofs - ndisp + 1; „ 00420 short FILTERED = (short)((mindisp - 1) << DISPARITY_SHIFT); „ 00466 // initialize the left and right borders of the disparity map 00467 for( y = 0; y < height; y++ ) 00468 { 00469 for( x = 0; x < lofs; x++ ) 00470 dptr[y*dstep + x] = FILTERED; 00471 for( x = lofs + width1; x < width; x++ ) 00472 dptr[y*dstep + x] = FILTERED; 00473 } 00474 dptr += lofs; 00475 00476 for( x = 0; x < width1; x++, dptr++ ) „ 这样的设置很明显是不符合实际应用的需求的,它相当于把摄像头的视场范围缩窄了。因此, OpenCV2.1 做了明显的改进,不再要求左右视图和视差图的大小(size)一致,允许对视差图进行左 右边界延拓,这样,虽然计算视差时还是按上面的代码思路来处理左右边界,但是视差图的边界得到 延拓后,有效视差的范围就能够与对应视图完全对应。具体的实现代码范例如下: ////////////////////////////////////////////////////////////////////////// // 对左右视图的左边进行边界延拓,以获取与原始视图相同大小的有效视差区域 copyMakeBorder(img1r, img1b, 0, 0, m_nMaxDisp, 0, IPL_BORDER_REPLICATE); copyMakeBorder(img2r, img2b, 0, 0, m_nMaxDisp, 0, IPL_BORDER_REPLICATE); ////////////////////////////////////////////////////////////////////////// // 计算视差 if( alg == STEREO_BM ) { bm(img1b, img2b, dispb); // 截取与原始画面对应的视差区域(舍去加宽的部分) displf = dispb.colRange(m_nMaxDisp, img1b.cols); } else if(alg == STEREO_SGBM) { sgbm(img1b, img2b, dispb); displf = dispb.colRange(m_nMaxDisp, img1b.cols); }
相关文档
最新文档