有做双目视觉差图片的吗,视差图受环境影响大吗? 国内有没有在这方面控制的不错的双目硬件推荐?

单目视觉“寡头林立” 这家初创公司如何玩转双目视觉
2017年3月,欧洲Euro-NCAP(安全评鉴协会)发布了新一系列包扩、丰田、等在内的车型的碰撞测试结果,其中路虎的发现车型获得了五星。获得五星的路虎车型,搭载的主动安全系统中,前向采用了双目摄像头的方案,而这个方案也成为了它能脱颖而出的关键。作为汽车主动安全系统的一个重要传感器,摄像头已经在业内成名许久。声明卓著的Mobileye用十余年的时间将单目的性能发挥到了极致,被英特尔153亿美金收购后更是成为了单目寡头。敢于同其直面竞争者寥寥无几,于是乎鲜有的几家初创公司,选择了从双目的方案开始切入。双目系统的原理跟单目完全不同,需要的技术积累和克服的难点也不同。在新的赛道上,同业者不多,国外博世、大陆等厂商虽早有发力,但性能一般,而国内更是屈指可数。成立于2017年的元橡科技,算是一家低调又少数的双目立体摄像头的软硬件一体方案商。公司团队虽小,但核心成员都有丰富的研发经验,产品性能优异。双目方案需要神同步2015年前后,国内ADAS市场迎来了一个高潮期,各种ADAS挂名的公司如雨后春笋般野蛮生长了起来。元橡科技创始人发现ADAS虽热,但核心的视觉传感器能力还是差强人意,于是便萌生了出来创业的念头。在计算机视觉领域摸爬滚打了十余年的元橡科技创业团队,对摄像头的软硬件技术都熟捻于心。他们认识到在单目摄像头的方案方面跟头部竞争者有太多距离,一时难以追赶。而在双目方面,由于技术路线的不同,还有较大机会和空间。至此,自创立之初,元橡科技团队就载着做双目视觉方案的世界佼佼者的愿景,顺着软硬件一体化的道路向前走。双目跟单目最大的区别是,前者需要软硬件的联合优化,这也是为什么公司要做软硬件一体的解决方案商。双目摄像头的方案,CMOS融合图像数据需要相匹配的ISP处理,现有的ISP方案都是针对单目的,不太适合做双目的处理,所以元橡科技从ISP这个硬骨头开始啃,争取在相机的每个处理单元做到最优。立体视觉的一个难点就是相机的同步问题。立体测量距离的基本原理是三角测量,用两个摄像头拍同一个景,通过图像的差异来测量距离。而为了达到这一效果,首先两个摄像头要做到同步。图像的每一帧本身会因为时间的变化和外部环境的变化存在差异,而双目测距的原理正是通过相同场景的不同视角来得出的,如果两个相机在拍摄的时候不能达到同步,那么就会造成测距的源参照物发生错位,造成的连锁误差也是不可逆的。利用双目摄像头测距的原理得出的结果,也就本质上错了。立体视觉的另外一个难点就是两个相机的一致性问题,就像天下没有两片相同的叶子,哪怕是工业流水线上生产出来的相机,也存在一定的差异性。因此,为了使得立体相机达到同步拍摄,系统的软件结构、运行机制都需要进行软硬件调整,才能达到统一性。市场上大部分宣传能够达到同步效果的,实际上还是用原有的ISP来做,但原来的ISP实际上是针对单目相机设计的,控制只能达到帧级别。元橡科技基于自身的技术,目前可以达到像素级别的对齐,这种技术在业内也属领先。用数据说话双目相机有一个非常关键的参数——Baseline,即两个摄像头之间的距离。距离越小,结构稳定性越好;但同时越小的间距,测量相同距离的难度也会越高。双目摄像头在汽车上使用的环境非常恶劣,不仅要承受巨大的温差变化,暴晒雨淋冰冻,还需要经受常年累月的颠簸。由于双目摄像头测距的原理是三角测距原理,因此作为三角测量标准尺的底边——摄像头之间的相对位置是不能发生改变的,否则结果将会是错的。产品结构的稳定性是随着摄像头间距的增大呈指数级别增加的,为此,保持双目摄像头结构的稳定性就成了顶要紧的事。而间距越小,准确测距的难度就越大。这对于双目摄像头的发展而言是一个矛盾的存在。元橡科技目前可以做到小于10cm的Baseline下,测距范围达到100米,精度达到95%以上,测距性能指标是业内其他已知竞争对手的两倍左右。高性能、小尺寸、低成本是公司产品的优势。正如之前《高工智能汽车》写的一篇文章中所述(点击浏览ADAS单目/双目/三目到底有什么区别?),双目测距的方案对于两个摄像头的一致性要求非常高。但元橡科技使用的镜头,只是一般的镜头,并没有采用很高的规格,国内舜宇,欧菲光生产的都可以使用。这是因为元橡科技通过自身的图像矫正算法,可以消除掉摄像头差异带来的问题。这种技术得益于他们在日企中工作的经验,日本在精密制造领域拥有相当的实力。在以往的工作经验中,并不会寻找品质最好的镜头,因为不利于大规模产品化,于是在通用的镜头中寻找一致性较好的两枚摄像头,然后通过软件算法的调教,消除差异。5%-10%的畸变误差都会刷掉大部分日本生产厂商。镜头的安装是一片片镜片层层叠加在一块,公司花了很大的精力去做非一致性的容忍。从30度到90度的镜头,都可以支持。另外广角的非球面镜片本身生产就有很大的难度,但团队现在的技术也已经可以达到要求。元橡科技核心人员透露,能攻克这些技术难关,需要耐心和静心,它是一个基础的研究,但国内的环境整体较为浮躁,个中不仅仅是后端算法的弥补,还需要硬件层面的调整,少有团队能沉下心来做事情。单双目的失真单目跟双目本身存在功能性上的不同,双目是用来测距,单目是用来识别。简而言之,双目是在单目的基础上加了一维深度信息。单目是2D的,真实的世界是3D的,因此单目拍出来的2D照片失去了现实世界一个维度的信息,这个缺失的信息对于车载又是至关重要的。为了接近真实环境,单目需要通过其他的信息来弥补缺失的另一维度的信息。这就是单目方案需要大量样本库的原因,单目需要首先识别物体,然后才能通过成像尺寸或者在图像中的位置信息得到距离信息。无论是深度学习,还是传统的方式,都是在补缺失去的信息。单目的工作原理造成它常常会存在漏检的情况,对于陌生的障碍物无法识别,这时候会直接导致事故。ADAS层级越高,视觉必须要得到距离来补充,才能得到一个完备的结果。而双目实际上是一个2.5D的传感器,摄像头拍摄的图像是2维的,双目测距获得的距离信息是一个0.5维度(无法获取障碍物背部的信息),因此通常将双目称为2.5维的传感器。双目做ADAS不需要样本库,测距直接通过简单的规则——将路面以及周围突出的物体都视为障碍物,整个算法是全白盒化的,不会存在识别不到的问题。而且一旦出现问题,就可以直接找到原因,不会像单目深度学习算法是黑盒的逻辑。当然双目能够得到这样的结果,一切都是建立在准确获取测距结果的基础上的。单目的核心是数据库和算法的,但双目是需要联合优化,立体匹配,两个相机的一致性,整个的优化流程都不一样。博世的长期研发的团队有数十人之多,但技术水平并没有提高太大。优化难度之所以较大,是因为双目的优化需要软硬件同时进行,而且本质上而言硬件的优化是重中之重。因此对于调校的工程师而言,需具备硬件工程师的思维,只有这样,才能让硬件发挥到极致性能。能达到这些要求的工程师,业内给了一个称号:全栈工程师,他们在国内非常稀少。这些人才需要在软硬件方面都具备一定的知识储备,在光学成像、软件算法、硬件电路方面都得有所涉足,因此人才较为稀缺。元橡科技的核心技术人员,已经有超过5年的团队工作经验,因此相互协调工作已经有了很大的默契。加上行业经验,才能迅速的将产品更完善的展现出来。元橡科技新招募的工程师很多都是从名校毕业的应届毕业生,学历至少为硕士。这些人才需要既懂硬件,又懂软件。他们大部分的背景是做视觉、芯片逻辑的,刚开始公司并不会急于员工进行开发,产生效益。而是会培养员工的各方面能力,只有这样,才会使得新来的员工在后续的研发过程中,自然而然的具备合适的思维模式。立体相机为何物?立体相机并不是形态上必须是双目或者多目,而是它所拍摄出来的图片一定要经过立体的匹配,点对点的匹配和优化,最终得到一个稠密的视差图,或者说深度图。整个过程需要性能强大的处理器完成,没有这个过程,是不能称之为立体相机的。三目的立体相机和三目成像相机也是有不同的。三个不同FOV的摄像头,没有立体匹配,就不能称之为立体相机。原来的车载摄像头分辨率有限,因此三目成像相机本质上是一个二维相机,跟单目原理一样,只是为了覆盖更远的距离,更广的角度。曾想通过三目立体相机的原理,测算出距离。就是通过不同视差角的摄像头拍摄图像的重叠区差异性,计算得出障碍物距离。但是这种技术本身存在一个较大的技术难点,就是不同广角的镜头拍照以及曝光的时间不同,两个摄像头拍照的时候成像的相同的位置时间是不一样的,很难保证同步。举例来说,摄像头长焦的和广角的某一行像素点是同时曝光的,但其中只有少数几个像素点能达到时间的绝对同步。剩下的大部分像素点曝光时间都不在一个时间点上。这种微小的差异在高速运动中就会被放大,也就造成了双目测距距离不远的原因。所谓差之毫厘谬以千里,说的就是这个道理。为了解决这个问题,在当前的技术条件下,除非CMOS厂家做一些工艺上的特殊处理,比如让人们可以控制每一个像素点的曝光时间,但实现的难度比较大。因为国际上知名的CMOS厂商都是巨头,如索尼、三星等,他们的业务在车载领域占比较小,而作为已经成熟的标准的工艺,是很难为一些企业做出调整、修改,明星如特斯拉都不行。因此现阶段而言,三目想要做成立体相机是很难的,短距离测距可能会有,但意义并不是很大。这也是特斯拉后来为什么放弃做三目摄像头(Mobileye提供技术支持)的主要原因。在现有的基础上,为了实现类似的三目效果,可行的方式是通过多个双目相机实现,比如现在元橡科技就在尝试做四目甚至六目的相机来实现不同测距范围的多角度覆盖,将双目当做单目来用。双目需要FPGA来做视觉方案不可避免的要用到高性能的处理器,但NVIDIA的三高处理器并不适合,FPGA的方案才是可取之道。一般算法验证会在PC上用GPU来做,但做产品化并不会用GPU的方案。这与平台的适应性有关,一般来讲,端上智能更适合用FPGA、芯片的方式,它需要完成大量高速的重复运算,最好是用高计算能力的专用芯片完成。类似于NVIDIA的方案,实现一个通用计算平台,功耗大,即使是降到现在宣称的15W,如果没有主动散热系统,还是很难正常工作的。NVIDIA的方案,更适合多传感器融合、无人驾驶大脑的场景。之所以有些公司会尝试用GPU的方案,是因为GPU 的开发相对简单一些,大部分通过原有的C语言修改就可以使用。元橡科技的FPGA已经迭代了好几代,技术成熟需要走过无数的坑,没有谁可以轻松跨过。双目的摄像头是一个天然融合的传感器,它将深度学习和图像学习糅合,使得后续的处理速度会非常快。元橡科技使用FPGA的方式,将传感器深度图像生成的时间压缩到了毫秒级别,这意味着处理解析图像数据,得出结果几乎是实时的,给控制决策部分留下了非常充裕的时间。传统的GPU的方案,在处理图像前,首先得将图像缓存,这个时间大概会花费30ms左右的时间,之后完成图像的特征提取。因此纵使GPU的计算能力再强,但前面的缓存时间是没有办法忽略掉的。而用FPGA的方案,则用时会很少,当图片在从一个像素一个像素生成的过程中,就可以通过有限的几个像素点计算对比出差异,提交给处理器得出计算结果。整个过程是几乎实时完成的,为中央处理器做控制、决策留出了充沛的时间。这也是为什么在NCAP的评比中,路虎的双目方案可以获得满分的原因。这里面有一个核心的问题——系统的复杂性造成延时性不一样。双目的趋势2016年前只在S系的车型中试验了双目,但到了2017年的时候,其销量最广的E系列车型,都已经标配了双目。后来的5系也跟上了,而路虎走的更为激进。前视传感器中将雷达去掉,只用双目的方案(但是它还是凭借单一传感器拿到了N-CAP的第一名,英国当年的最佳安全车型奖)。双目能够取得很好的效果,已经得到了国外主流的一些主机厂的认可。包括一些知名的Tier-1,也在发展自己的双目能力,如博世、大陆等,Mobileye也在一直修炼内功。国内主机厂需要看到这个趋势。尽管双目拥有一定的技术优势,但由于供应商太少,整体声音较弱。国内无论主机厂还是市场对双目方案的认可度、信任度都比较低。只做高利润的Tier-2元橡科技的目标和定位都是做Tier-2,这不仅仅是因为想要快速占领市场,必须依赖Tier-1等巨头帮忙推进,另一方面,作为一个技术型的公司,拥有了一定的技术壁垒之后,只需要提供技术方案获取最高利润即可,并不需要去做生产制造。生产制造是一个繁复冗余的过程,需要完善的管理、精密的管控,一般Tier-1或者主机厂也会愿意指定一些拥有相应制造实力的公司。同时如果公司涉足了生产,就会潜在的成为原来一些有实力的制造商的竞争者,对于发展而言并不有利。因此元橡科技未来也不打算涉足生产制造环节,会像国外的科技公司一样只提供技术方案。目前元橡科技的人员有20余人,已经拿到了众多主机厂的合作订单,会在近期完成一轮融资。将核心研发人员扩充到40人,周边应用开发人员要达到20人,还要建立自己的FAE团队,用来培养Tier-1或者主机厂的工作人员。另外除了北京是核心研发的驻地外,元橡在上海也设立了产品应用的部门,用来服务长三角周边的大量主机厂客户。公司希望将来把产品做成一个标准件,然后批量给主机厂、公司使用,而不是忙不迭的做一个又一个的定制项目。同时,未来希望做全球顶级的双目视觉软硬件方案提供商。公司目前主要的合作伙伴将会是Tier-1、主机厂,自动驾驶相关的将会稍微偏弱,毕竟离应用太远。但也会做一些典型的CASE,用来培育市场(元橡科技在OpenSpace中可以达到几乎100%的可靠性,自动驾驶公司可以通过公司的方案来做路径规划)。除了在车载领域的应用,元橡还涉足了机器人、无人机等领域。计算机视觉的技术,原本就是相通的,如果能服务于车载领域,那么在消费领域和工业领域也顺理成章。
来源:高工智能汽车
本文地址:https://www.d1ev.com/news/shichang/64828
第三方登录
反馈和建议
第一电动网
Hello world!厚积而薄发
双目匹配与视差计算
立体匹配主要是通过找出每对图像间的对应关系,根据三角测量原理,得到视差图;在获得了视差信息后,根据投影模型很容易地可以得到原始图像的深度信息和三维信息。立体匹配技术被普遍认为是立体视觉中最困难也是最关键的问题,主要是以下因素的影响:
(1) 光学失真和噪声(亮度、色调、饱和度等失衡)
(2) 平滑表面的镜面反射
(3) 投影缩减(Foreshortening)
(4) 透视失真(Perspective distortions)
(5) 低纹理(Low texture)
(6) 重复纹理(Repetitive/ambiguous patterns)
(7) 透明物体
(8) 重叠和非连续
目前立体匹配是计算机视觉中的一个难点和热点,算法很多,但是一般的步骤是:
A、匹配代价计算
匹配代价计算是整个立体匹配算法的基础,实际是对不同视差下进行灰度相似性测量。常见的方法有灰度差的平方SD(squared intensity differences),灰度差的绝对值AD(absolute intensity differences)等。另外,在求原始匹配代价时可以设定一个上限值,来减弱叠加过程中的误匹配的影响。以AD法求匹配代价为例,可用下式进行计算,其中T为设定的阈值。
B、 匹配代价叠加
一般来说,全局算法基于原始匹配代价进行后续算法计算。而区域算法则需要通过窗口叠加来增强匹配代价的可靠性,根据原始匹配代价不同,可分为:
C、 视差获取
对于区域算法来说,在完成匹配代价的叠加以后,视差的获取就很容易了,只需在一定范围内选取叠加匹配代价最优的点(SAD和SSD取最小值,NCC取最大值)作为对应匹配点,如胜者为王算法WTA(Winner-take-all)。而全局算法则直接对原始匹配代价进行处理,一般会先给出一个能量评价函数,然后通过不同的优化算法来求得能量的最小值,同时每个点的视差值也就计算出来了。
D、视差细化(亚像素级)
大多数立体匹配算法计算出来的视差都是一些离散的特定整数值,可满足一般应用的精度要求。但在一些精度要求比较高的场合,如精确的三维重构中,就需要在初始视差获取后采用一些措施对视差进行细化,如匹配代价的曲线拟合、图像滤波、图像分割等。
有关立体匹配的介绍和常见匹配算法的比较,推荐大家看看 的讲义 ,190页的ppt,讲解得非常形象详尽。
1. opencv2.1和opencv2.0在做stereo vision方面有什么区别了?
2.1版增强了Stereo Vision方面的功能:
(1) 新增了 SGBM 立体匹配算法(源自Heiko Hirschmuller的《》),可以获得比 BM 算法物体轮廓更清晰的视差图(但低纹理区域容易出现横/斜纹路,在 GCstate-&fullDP 选项使能时可消减这种异常纹路,但对应区域视差变为0,且运行速度会有所下降),速度比 BM 稍慢, 352*288的帧处理速度大约是 5 帧/秒;
(2) 视差效果:BM & SGBM & GC;处理速度:BM & SGBM & GC ;
(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)彩色图像。所以在读入图像时,应该根据采用的算法来处理图像:
3. 怎样获取与原图像有效像素区域相同的视差图?
在OpenCV2.0及以前的版本中,所获取的视差图总是在左侧和右侧有明显的黑色区域,这些区域没有有效的视差数据。视差图有效像素区域与视差窗口(ndisp,一般取正值且能被16整除)和最小视差值(mindisp,一般取0或负值)相关,视差窗口越大,视差图左侧的黑色区域越大,最小视差值越小,视差图右侧的黑色区域越大。其原因是为了保证参考图像(一般是左视图)的像素点能在目标图像(右视图)中按照设定的视差匹配窗口匹配对应点,OpenCV 只从参考图像的第
(ndisp - 1 + mindisp) 列开始向右计算视差,第 0 列到第 (ndisp - 1 + mindisp) 列的区域视差统一设置为 (mindisp - 1) *16;视差计算到第 width + mindisp 列时停止,余下的右侧区域视差值也统一设置为 (mindisp - 1) *16。
这样的设置很明显是不符合实际应用的需求的,它相当于把摄像头的视场范围缩窄了。因此,OpenCV2.1 做了明显的改进,不再要求左右视图和视差图的大小(size)一致,允许对视差图进行左右边界延拓,这样,虽然计算视差时还是按上面的代码思路来处理左右边界,但是视差图的边界得到延拓后,有效视差的范围就能够与对应视图完全对应。具体的实现代码范例如下:
4. cvFindStereoCorrespondenceBM的输出结果好像不是以像素点为单位的视差?
“:在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 矩阵。
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
// SAD 参数
SADWindowSize:SAD窗口大小,容许范围是[5,255],一般应该在 5x5 至 21x21 之间,参数必须是奇数,int 型minDisparity:最小视差,默认值为 0, 可以是负值,int 型numberOfDisparities:视差窗口,即最大视差值与最小视差值之差, 窗口大小必须是 16 的整数倍,int 型
// 后处理参数
textureThreshold:低纹理区域的判断阈值。如果当前SAD窗口内所有邻居像素点的x导数绝对值之和小于指定阈值,则该窗口对应的像素点的视差值为 0(That is, if the sum of absolute values of x-derivatives computed over SADWindowSize by SADWindowSize pixel neighborhood is smaller than the parameter, no disparity
is computed at the pixel),该参数不能为负值,int 型uniquenessRatio:视差唯一性百分比, 视差窗口范围内最低代价是次低代价的(1 + uniquenessRatio/100)倍时,最低代价对应的视差值才是该像素点的视差,否则该像素点的视差为 0 (the minimum margin in percents between the best (minimum) cost function value and the second best value to accept the computed disparity,
that is, accept the computed disparity d^ only if SAD(d) &= SAD(d^) x (1 + uniquenessRatio/100.) for any d != d*+/-1 within the search range ),该参数不能为负值,一般5-15左右的值比较合适,int 型speckleWindowSize:检查视差连通区域变化度的窗口大小, 值为 0 时取消 speckle 检查,int 型speckleRange:视差变化阈值,当窗口内视差变化大于阈值时,该窗口内的视差清零,int 型
// OpenCV2.1 新增的状态参数
roi1, roi2:左右视图的有效像素区域,一般由双目校正阶段的 cvStereoRectify 函数传递,也可以自行设定。一旦在状态参数中设定了 roi1 和 roi2,OpenCV 会通过cvGetValidDisparityROI 函数计算出视差图的有效区域,在有效区域外的视差值将被清零。disp12MaxDiff:左视差图(直接计算得出)和右视差图(通过cvValidateDisparity计算得出)之间的最大容许差异。超过该阈值的视差值将被清零。该参数默认为 -1,即不执行左右视差检查。int 型。注意在程序调试阶段最好保持该值为 -1,以便查看不同视差窗口生成的视差效果。具体请参见《》一文中的讨论。
在上述参数中,对视差生成效果影响较大的主要参数是 SADWindowSize、numberOfDisparities 和 uniquenessRatio 三个,一般只需对这三个参数进行调整,其余参数按默认设置即可。
在OpenCV2.1中,BM算法有C和C++ 两种实现模块。
(2)StereoSGBMState
SGBM算法的状态参数大部分与BM算法的一致,下面只解释不同的部分:
SADWindowSize:SAD窗口大小,容许范围是[1,11],一般应该在 3x3 至 11x11 之间,参数必须是奇数,int 型P1, P2:控制视差变化平滑性的参数。P1、P2的值越大,视差越平滑。P1是相邻像素点视差增/减 1 时的惩罚系数;P2是相邻像素点视差变化值大于1时的惩罚系数。P2必须大于P1。OpenCV2.1提供的例程 stereo_match.cpp 给出了 P1 和 P2 比较合适的数值。fullDP:布尔值,当设置为 TRUE 时,运行双通道动态编程算法(full-scale 2-pass dynamic programming algorithm),会占用O(W*H*numDisparities)个字节,对于高分辨率图像将占用较大的内存空间。一般设置为 FALSE。
注意OpenCV2.1的SGBM算法是用C++ 语言编写的,没有C实现模块。与H. Hirschmuller提出的原算法相比,主要有如下变化:
算法默认运行单通道DP算法,只用了5个方向,而fullDP使能时则使用8个方向(可能需要占用大量内存)。算法在计算匹配代价函数时,采用块匹配方法而非像素匹配(不过SADWindowSize=1时就等于像素匹配了)。匹配代价的计算采用BT算法("" by S. Birchfield and C. Tomasi),并没有实现基于互熵信息的匹配代价计算。增加了一些BM算法中的预处理和后处理程序。
(3)StereoGCState
GC算法的状态参数只有两个:numberOfDisparities 和 maxIters ,并且只能通过 cvCreateStereoGCState 在创建算法状态结构体时一次性确定,不能在循环中更新状态信息。GC算法并不是一种实时算法,但可以得到物体轮廓清晰准确的视差图,适用于静态环境物体的深度重构。
注意GC算法只能在C语言模式下运行,并且不能对视差图进行预先的边界延拓,左右视图和左右视差矩阵的大小必须一致。
6. 如何实现视差图的伪彩色显示?
首先要将16位符号整形的视差矩阵转换为8位无符号整形矩阵,然后按照一定的变换关系进行伪彩色处理。我的实现代码如下:
灰度图转伪彩色图的代码,主要功能是使灰度图中 亮度越高的像素点,在伪彩色图中对应的点越趋向于 红色;亮度越低,则对应的伪彩色越趋向于 蓝色;总体上按照灰度值高低,由红渐变至蓝,中间色为绿色。其对应关系如下图所示:
7. 如何将视差数据保存为 txt 数据文件以便在 Matlab 中读取分析?
由于OpenCV本身只支持 xml、yml 的数据文件读写功能,并且其xml文件与构建网页数据所用的xml文件格式不一致,在Matlab中无法读取。我们可以通过以下方式将视差数据保存为txt文件,再导入到Matlab中。
相应的Matlab代码为:
显示效果如下
没有更多推荐了,

我要回帖

更多关于 视觉差图片 的文章

 

随机推荐