Python基于OpenCV的双目视觉深度图算法(源码&教程)

1.研究背景

对于双目视觉立体匹配算法,先验的视差范围估计是影响算法匹配效果和运行时间的重要因素。在双目视觉系统的实际应用中,匹配视图之间的视差范围通常随场景的变化而不断改变,因此需要对视图间的视差范围进行有效的自动估计。针对此问题,开发了一种双模相机,可分时采集场景的灰度图像和深度图像,该深度图像与灰度图像有相同的空间分辨力。在双目视图匹配过程中,通过引入深度图的信息,可约束每一个待匹配像素的视差范围。对于实验室内采集的普通视图对,本文方法相较参考的博客的方法视图间视差最大、最小值为约束的方法,匹配速度提高3倍以上,匹配误差减少2%,有效提高了匹配的可靠性和普适性。

2.图片展示

5.png
7.png

8.png

output.png

3.视频演示

Python基于OpenCV的双目视觉深度图算法(源码&教程)_哔哩哔哩_bilibili

4.视差的概念

是指从两个不同位置观察同一个物体时,此物体在视野中的位置变化与差异。从两个观察点看目标,两条视线之间的夹角叫做这两个点的视差角,两点之间的距离称作视差基线。

为什么单目摄像机不能测深度?

下图从物理原理上展示了为什么单目相机不能测量深度值而双目可以。我们看到红色线条上三个不同远近的黑色的点在下方相机上投影在同一个位置,因此单目相机无法分辨成的像到底是远的那个还是近的那个。
image.png
双目立体视觉深度相机测距流程:
(1)需要对双目相机进行标定,得到两个相机的内外参数、单应矩阵。
(2) 根据标定结果对原始图像进行校正,校正后的两张图像位于同一平面且互相平行。
(3)对校正后的两张图像进行像素点匹配。
(4)根据匹配结果计算每个像素的深度,从而获得深度图

理想双目相机成像模型:
首先我们从理想的情况开始分析:假设左右两个相机位于同一平面(光轴平行),且相机参数(焦距f)一致。那么深度值的推到原理和公式如下:
image.png
根据上述推导,空间点p离相机的距离(深度)z=f*b/d,可以发现如果要计算深度z,必须要知道:
(1)相机焦距f,左右相机基线b。这些参数可以通过先验信息或者相机标定得到。
(2)视差b。需要知道左相机的每个像素点(Xl, Yl)和右相机中对应点(Xr,Yr)的对应关系。这是双目视觉的核心问题。
极限约束
那么问题来了,对于左图中的一个像素点,如何确定该点在右图中的位置,可以通过极限约束。
什么是极线呢?如下图所示,C1,C2是两个相机,p是空间中一点,P和两个相机中心点C1、C2形成了三维空间中的一个平面PC1C2,称为极平面。极平面和两幅图像相交于两条直线,这两条直线为极线。p在相机C1中的成像点是P1,在相机C2中的成像点是P2,但p的位置事先是未知的。
我们的目标是:对于左图中的P1点,寻找它在右图中的对应点P2,这样就能确定P点的空间位置,也就是我们想要的空间物体和相机的距离。

所谓极线约束,就是指当同一个空间点在两幅图像上分别成像时,已知左图投影点P1,那么对应右图投影点P2一定在相对于P1的极线上,这样可以极大的缩小匹配范围。
image.png

细心的朋友会发现上述过程考虑的情况(两相机共面且光轴平行,参数相同)非常理想,相机C1、C2如果不在同一直线上怎么办?

非理想双目相机成像模型

事实上,这种情况非常常见,因为有些场景下两个相机需要独立固定,很难保证光心C1、C2完全水平,即使是固定在同一基板上也会因为装配的原因导致光心不水平。
image.png
我们先来看看这种情况下拍摄的两张左右图片,左图中三个十字标志的点,在右图中对应的极线是右图中的三条白线,也就是对应的搜索区域。我们看到这三条线并不是水平的,如果进行逐点搜索效率非常低。
怎么办呢?
把不理想的转化为理想情况就好了。这就是图像矫正技术。
图像校正技术是通过分别对两张图片用单应矩阵变换得到的,目的就是把两个不同方向的图下个平面重新投影到同一平面且光周相互平行,下图中的黄色平面,这样就可以用前面理想情况下的模型了,两个相机的极线也变成水平的了。
image.png

5.代码实现


def depth_map(imgL, imgR, sigma=1.3):
    """ Depth map calculation. Works with SGBM and WLS. Need rectified images, returns depth map ( left to right disparity ) """
    # SGBM Parameters -----------------
    window_size = 3  # wsize default 3; 5; 7 for SGBM reduced size image; 15 for SGBM full size image (1300px and above); 5 Works nicely

    left_matcher = cv2.StereoSGBM_create(
        minDisparity=-1,
        numDisparities=5*16,  # max_disp has to be dividable by 16 f. E. HH 192, 256
        blockSize=window_size,
        P1=8 * 3 * window_size,
        # wsize default 3; 5; 7 for SGBM reduced size image; 15 for SGBM full size image (1300px and above); 5 Works nicely
        P2=32 * 3 * window_size,
        disp12MaxDiff=12,
        uniquenessRatio=10,
        speckleWindowSize=50,
        speckleRange=32,
        preFilterCap=63,
        mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY
    )
    right_matcher = cv2.ximgproc.createRightMatcher(left_matcher) ##Block matching disparity map calculation
    # FILTER Parameters
    lmbda = 80000
    visual_multiplier = 6

    wls_filter = cv2.ximgproc.createDisparityWLSFilter(matcher_left=left_matcher)
    wls_filter.setLambda(lmbda)

    wls_filter.setSigmaColor(sigma)
    displ = left_matcher.compute(imgL, imgR)  # .astype(np.float32)/16
    dispr = right_matcher.compute(imgR, imgL)  # .astype(np.float32)/16
    displ = np.int16(displ)
    dispr = np.int16(dispr)

    return filteredImg

6.系统整合

下图源码&环境部署视频教程&自定义UI界面
3.png
参考博客《Python基于OpenCV的双目视觉深度图算法(源码&教程)》

7.参考文献

[1]Ke Zhang,Jiangbo Lu,Lafruit, G…Cross-Based Local Stereo Matching Using Orthogonal Integral Images[J].IEEE Transactions on Circuits and Systems for Video Technology.2009,19(7).1073-1079.
[2]Yan Huimin,Zhang Xiuda,Jiang Yanbing.Pulse-shape-free method for long-range three-dimensional active imaging with high linear accuracy[J].Optics Letters.2008,33(11).
[3]Zhang, Z…A flexible new technique for camera calibration[J].Pattern Analysis & Machine Intelligence, IEEE Transactions on.2000,22(11).1330-1334.

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
课程目的:OpenCV是应用非常广泛的开源视觉处理库,在图像处理、计算机视觉和自动驾驶中有着非常重要的作用。课程设计特色:(课程当前为第一期)1、C++与Python双语教学Python语言是在计算机视觉中应用最多的一种语言,在工作中,深度学习模型的训练基本上都是使用Python语言编写的训练代码。OpenCV在这个过程中用于图像的预处理(例如图像读取、数据增强)和后处理,还可以用于显示处理的结果,功能强大,使用方便。但是在功能的部署的时候,不管是部署在服务端还是PC端,开发语言基本上用的是C++,所以如何有效的使用OpenCV进行模型或者功能的部署尤为重要。C++语言应用的好坏,在面试中可以看出一个面试者的工程实践能力的强弱,两种语言的开发掌握好了可以使工作如虎添翼。2、全模块讲解我出版了一本图书《学习OpenCV4:基于Python算法实战》,虽然这本书是写的基于Python算法实战,但是实际上这本书有详细的介绍算法的C++接口,还有一些C++方向的案例,是以Python为主。图书出版的时候就想双语写作,只是限于篇幅没有成行。本课程不仅采用双语教学,更是对C++的每个模块都做讲解,我们知道,很多的书其实只讲imgproc,如果你翻开一本书图像的形态学运算和图像滤波都是作为独立章节讲解的,那么这本书基本上就可以确定是只是讲解了imgproc模块,但是其他的模块在工作中也有很重要的作用。例如:core模块定义了C++的基本数据结构和基本运算(如四则运算);highgui模块是可视化与交互的模块;feature2d是特征点与特征匹配相关算法所在的模块;ml是机器学习相关的模块;dnn是深度学习相关的模块,可以使用OpenCV进行深度学习模型的部署。这些是很多的书和课程都不会讲的。3、讲解细致本课程会从环境搭建开始讲解,环境搭建尤为重要。从我多年的授课经验总结来看,如果只是给了代码,很多的入门用户环境问题处理不好的话,后面的学习很难进行下去,甚至会丧失学习的信心。4、会讲解C++和Python的开发语法问题是入门用户的一大难关,特别是C++语言。大学只是教授了C语言相关的内容,C++很多同学只懂一点皮毛,所以写代码步履维艰,我们在讲解代码的过程中会顺带讲解C++和Python的内容。我们还会讲解编译相关知识,还有库的装载与链接,这些是学校里不会教的,目前也几乎没有课程讲解。5、讲师经验丰富我讲解过C++和OpenCV的多个课程,广受学员好评。我出版过两本图书《深度学习计算机视觉实战》和《学习OpenCV4》,两本书都是细致入微的讲解,主要针对的就是初学者,所以能够很好的处理课程的难易程度。6、讲义准备充分讲义准备的充分细致,标识清楚明确,重点和疑难点突出。
### 回答1: Python基于OpenCV的人脸表情识别系统是一种基于计算机视觉技术的应用,能够自动识别人脸表情并输出对应的情感,具有非常广泛的应用前景。 该系统的核心代码基于Python编程语言,并利用OpenCV图像处理库来实现人脸识别和表情识别的功能。实现流程包括人脸检测、关键点检测、表情分类和输出等步骤。 具体实现过程包括:首先通过OpenCV中的Haar级联检测算法来进行人脸检测,然后利用dlib库中的68点关键点检测方法,精确地获取人脸中的关键特征点,包括眼睛、鼻子、嘴巴等位置。接下来,使用基于支持向量机(SVM)分类器的机器学习算法,对获取到的人脸表情数据进行训练,比如快乐、悲伤、惊讶等表情。最后,根据输入的图像和识别结果,将对应的情感输出给使用者。 该系统的源码很复杂,需要先熟悉Python编程语言、OpenCV图像处理等技术,才能进行有效的开发和维护。此外,由于人脸的复杂性和表情多样性,该系统还需要定期进行模型训练、算法调优和数据更新等工作。 总之,Python基于OpenCV的人脸表情识别系统是一项非常有技术含量和实用价值的应用,能够为很多场景提供智能化解决方案。 ### 回答2: Python基于OpenCV的人脸表情识别系统源码是用于人脸表情识别的程序代码。该程序使用Python编程语言和OpenCV计算机视觉库来构建,可以运行在Windows、Mac OS和Linux等操作系统上。 该程序先通过OpenCV库中的人脸检测算法,以及Haar特征进行人脸检测,然后将检测到的人脸图像进行处理,提取出图像中的特征点。随后采用深度学习技术中的卷积神经网络(CNN)进行表情分类,将信息传递到卷积神经网络中,由CNN分类器对表情进行判断,并将预测结果进行输出。 该程序源码包括多个文件,其中主要的源码文件是用于实现人脸表情识别的图像处理和分类器模型的文件。同时,还包括一些辅助性文件,用于读取图像、显示结果、测试模型精度等。 该程序可作为实际项目的基础,可以为人脸识别应用提供支持,让系统更加人性化,并且能够识别人脸的情感状态,用户体验更佳。同时,也有助于人工智能领域的深度学习网络的训练和推广,逐步完善人脸识别领域的表情识别技术。 ### 回答3: Python基于OpenCV的人脸表情识别系统是一个非常有用的项目,高度参与人们在现代世界中表达自己的情感,非常适合当前社交媒体以及各种在线活动。这个项目的主要功能是对人脸的表情进行识别和分类,帮助用户了解被拍摄者的情感状态。 从技术角度来说,这个项目主要依靠OpenCV这个强大的开源计算机视觉库。它提供了很多人脸识别以及情感识别的算法和模型,使得这个项目的功能十分强大。用户可通过使用系统的GUI界面,使用电脑自带的摄像头,拍摄照片后可以马上得出照片中的人的表情状态以及预测可能的下一秒表情等。 在实现这个项目之前,需要熟悉Python语言以及 OpenCV库的基本用法。还要具备一定的机器学习和模式识别知识。将各个算法和模型组合在一起,满足各种不同的情况,进行快速且准确的表情识别。最终目的是提供一个高效的、精确率较高的表情识别系统,以支持广大人们的日常活动。 总而言之,Python基于OpenCV的人脸表情识别系统是一个非常有用的项目,它提供的高效、准确、精细的表情识别功能,将深刻影响我们的日常活动。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值