目录
前言
课题背景和意义
实现技术思路
一、图像三维重构体系结构及关键技术分析
二、特征提取与立体匹配
三、基于OpenCV的立体匹配及三维重建
编辑编辑
代码部分
实现效果图样例
最后
大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
对毕设有任何疑问都可以问学长哦!
选题指导: https://blog.csdn.net/qq_37340229/article/details/128243277
大家好,这里是海浪学长毕设专题,本次分享的课题是
基于机器视觉的双目立体视觉系统定标与三维重构技术研究- OpenCV
人类对其周边环境信息的判断主要依靠视觉,通过人眼与大脑的协调工作,人类实现了对环境信息的识别和判断。计算机视觉是机器设备对生物视觉系统的模仿,其工作目的是将机器视觉中的图片和视频等信息恢复为三维场景信息,并由此重建和识别物体"。从尽可能多的实现仿生和实用的观点来看,双目视觉最能够实现机器视觉向人类视觉的仿生。我们身处于一个具有三维立体结构的世界中,视觉功能可以帮助我们对周边环境中所有物体的三维结构加以辨识,然而大多数的摄像机其获取的仅仅只是物体的表象信息。计算机视觉的主旨工作就是对终像、视频等二维信息进行分析和理解,从而使机器能够像人类一样可以识别三维结构的物体。计算机识别三维结构物体的关键问题就是终像的三维重建,而研究如何能够恢复一维表象信息的三维场景坐标便是实现三维重建的重中之重。纵观该领域的研究现状,人们已经提出如结构光视觉、光度立体视觉以及双目视觉等多种三维重建方法。然而众多重建算法中,人们发现双目视觉更接近人类视觉的工作模式,它可以在多种情境下获取景物的深度信息,与其他机器视觉方法相比其优点是显而易见的。所谓双目立体视觉就是利用摄像机从不同位置采集同一场景的双目图像,通过三维重构过程,还原物体的三维信息,从而使人感到真实三维场景的立体感。
1)边缘检测
图像边缘是图像极其重要的特征之一。由干图像的边缘是图像特征中极其具有代表性和重
要意义的一部分信息,相对于整个图像冗杂的信息来说,图像的边缘用极少的数据量反映出极其重要的图像信息,这些正符合特征提取对选取特征提取对象的要求。从提取精度的要求上来说,
通常使用二者的绝对值之和来近似的表示求解梯度时的平方和和开方计算;
Sobel梯度算子首先做成加权平均,其次进行微分,最后求梯度,即:
Sobel算子完成与图像中每一个像素点的卷积运算的途径是在图像中移动两个3x3的卷积核,因此实现该算法的核心是这两个3x3的卷积核。
cvSobel函数只适用对单通道图像的变换,如果需要对彩色图像进行evSobel处理,则可以RGB通道的图像分别进行cvSobe1处理,而后转化为彩色图像。下图中,(a)为lena的彩色图像,终b)是该图的灰度图像,图(c)为图(b)经过Sobel算子处理后的效果图。
①Laplace算子
Laplace算子是一个能够进行各项同性运算的二阶微分标量算子,它的一个重要的性质就是具有各向同性。定义一个具有连续区域的图像函数 f(x.v)的边缘拉普拉斯算子如式所示:
LOG边缘检测方法是为了针对解决在具有明显噪声的图像中Laplace算子的实现,该检测算法通过用Laplace算子对经过高斯处理后的图像进行运算来实现。图(a)所示是原始图像的灰度图,图4(b)是经过Laplace算子处理后的结果图。
2)角点检测方法
任何一个物体都具有许多特征,其中比较明显的特征有对比度、交汇特征、方向等,物体的诸多可用信息都可以经由它们来提取。
为了能够更好地检测到物体的基本特征,也可以使用圆形的标记点,而提取的主要目标就是圆的圆心。Hough变换就是常见的以圆形作为特征标记点的检测方法。
3)特征提取效果对比分析
使用Canny边缘检测算子和Harris及SUSAN角检测算子对课题实现过程中使用的图像进行特征提取,以选取最合适的检测算子进行特征提取。三种算子特征提取到的结果分别如图所示:
采用 S U S AN 算 子提取 到 的 特征:
Canny 篇子提取到的特征:
立体匹配
立体匹配是三维重构中极其重要同时也是实现难度最大的一步,当其他的因素已经确定的前提下,实现三维重构的重构精度及效果与立体几配的结果是息息相关的。
1)基于区域的立体匹配算法
基干区域相关匹配的核心思想是:把待匹配图像中的一点作为基准点构建出一个窗口窗口的模板为基准点的邻域灰度值,当另一幅图像中有一点与其具有相同或者相近的灰度值分布则二者构成一个匹配点对。
2)基于特征的立体匹配算法
该算法的设计思想是:对能够反映景物固有信息的特征点(角点、边缘、轮廓点等)进行针对性的匹配,由于基于特征的匹配算法更关注的是物体的本质结松信息,所以可以较好的对误匹配的问题进行克服。
与之前所述的匹配方法相比,基于相位的匹配算法其选取的匹配基元本身就是信号固有的结
构信息,因而其低通特性对图像的高频噪声有极大的抑制作用。除此之外,该算法还具有视差精度较高、稳定性好、可以并行计算等优点。
基于特征的立体匹配算法
与基于区域的匹配算法不同,该算法的设计思想是:对能够反映景物固有信息的特征点(角点、边缘、轮廓点等)进行针对性的匹配,由于基于特征的匹配算法更关注的是物体的本质结松信息,所以可以较好的对误匹配的问题进行克服。该方法评判是否匹配的主要依据是通过对特征
基于OpenCV的特征点匹配原理
特征点优配是双目视觉系统的核心环节同时也是需要重点进行研究的领域,该阶段是为了在
双目图像中尽最大可能寻找匹配点对。
1)特征点匹配简介
为了有效地实现特征匹配,学者们阐述了多种多样的匹配算法,然而纵观这些匹配算法,主要可以分为两种,即稀疏点几配和密集点匹配。
2)基于窗口的灰度匹配原则
由于一幅场景是由材质各异的物体综合构成的,因此整个场景对光的反射特性也相对复杂,定义纯漫反射表面为在光线下灰度值均为一致的表面,该表面也称作Lamberl表面:还有的物体能够实现对光源的镜面反射,将这一类表面定义为镜面表面;然而客观世界中的物体表面是以上两种表面特性的综合体。
向量v与v的夹角大小是判断匹配度的度量标注,p和p的匹配度越高,夹角就越小,相反亦然。也可以用两个向量的夹角进行计算:
其中,θ为两向量的夹角。当cos0=1时,向量v与v的匹配最佳,反之,若cos0=0则向量v与v,匹配最差,如图:
3)基于窗口的稀疏点匹配
基于稀疏点的匹配选取能够明显反映图像本质属性的特征点作为匹配对象,特征点的数量越多,匹配的结果就越可靠其精度也就越高,因此可靠地特征点的数量对匹配效果具有决定作用。匹配效果是通过视差图来体现的。视差图为单通道灰度图,首先初始化图像上的所有像素为黑色,即将其灰度值设定为0,下一步,将左视图作为基准图像,p=(xy1)为左视图中的已匹配点,其视差为d。d 是左视图内全部匹配点的最大视差,d 是左视图内全部匹配点的最小视差。那么视差图内的对应点,即p=(x y1)的灰度值为:
4)基于窗口的密集点匹配
为了缩短匹配耗时,需要在对图像进行密集点匹配之前,对图像进行一定的预处理。
基于OpenCV的双目图像三维信息重构
1)重构系统简述
假定空间任意点P的世界坐标为:(XY,Z),点P在两幅图像上的像点分别为P和P,P和 P在像素坐标系中的坐标分别为:(u,v)和(uv),由相机的成像模型可以得到:
将式联立组成方程组,消去z和z,可以求得空间点P的坐标(XY.Z),从而确定空间点的位置,就可由空间点的几何关系获取物体的三维信息,重建三维场景。
2)重构效果和分析
为实现对双目图像的三维信息重构,需要先对双目摄像机进行标定,以获取其内部参数及畸变系数。基于CVUT的摄像机标定方法,标定结果如表所示,由标定结果可以看出由于选用同一型号的摄像机,双目摄像机参数虽有差异但差别不大基本可以满足视觉系统进一步研究的需要。
在使用cvCanny函数对轮廓进行提取时,需要进行多次试验以确定参数中需要输入的阈值,从而达到最好的效果。在得到轮廓图后,为达到更好的效果,还要对图像进行一定的预处理(膨胀后进行腐蚀),方能得到图所示的轮廓效果图。
经多次试验验证,设置canny算子的第一阈值为16,第二阈值为26,Sobe1算子内核为3。从下图可以看出,尽管检测的轮廓图边缘还存在一些噪声信息。
函数cvcanny采用Canny算法将图像的边缘选取为特征进行特征提取。函数中的threshold1和threshold2两个参数中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。
函数cvDilate对输入图像使用指定的结构元素进行膨胀,膨胀可以重复进行。函数cvErode对输入图像使用指定的结构元素进行腐蚀,腐蚀也可以重复进行。
从下图得到的轮廓深度图可以看出,该系统可以比较好的恢复二维图像的深度信息,
图所得到的三角剖分效果图可以看出,剖分显示部分的效果比较完整,实验验证了该系统可以有效实现对双目图像三维信息的重构。
重构部分代码:
pls = [np.array(i) for i in cal_data.imgpoints_l]
prs = [np.array(i) for i in cal_data.imgpoints_r]
# 取一对图像的二维坐标点
ptl, ptr = pls[0], prs[0]
P1 = rectify_model.get('P1')
P2 = rectify_model.get('P2')
points = cv2.triangulatePoints(P1,P2,ptl,ptr)
coodinates_x = points[0] / points[-1]
coodinates_y = points[1] / points[-1]
coodinates_z = points[2] / points[-1]
# 转换成三维坐标的形式,直接reshape结果不对
coodinates = np.array([[i,j,k] for i,j,k in zip(coodinates_x, coodinates_y, coodinates_z)])
fig = plt.figure(figsize=(12,12))
ax = fig.add_subplot(111, projection='3d')
plt.cla()
coodinates_x, coodinates_y, coodinates_z
ax.scatter(coodinates[:, 0], coodinates[:, 1], coodinates[:, 2], color='red')
plt.draw()
plt.show()
双目立体视觉:
我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。
毕设帮助,疑难解答,欢迎打扰!