5-3-使用特征点从图像中检测目标(2个)_第1页
5-3-使用特征点从图像中检测目标(2个)_第2页
5-3-使用特征点从图像中检测目标(2个)_第3页
5-3-使用特征点从图像中检测目标(2个)_第4页
5-3-使用特征点从图像中检测目标(2个)_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目标检测使用特征点从图像中检测目标目录CONTENTS图像特征特征点提取Brute-Force特征点匹配FLANN特征匹配01图像特征图像特征图像特征人对相同图像进行匹配的过程,即使不同视角、不同光照下的图像,我们还是能够找到对应的目标,这就是人能够很轻松的找到图像中最重要的特征。按照这种思路,要想让计算机找到对应的目标,也需要找到图形中的最重要的特征点,这些特征点称为关键点,一般使用角点(Conorpoint)作为关键点。02特征点提取特征点提取特征点提取对一幅图像进行特征提取包括关键点提取和关键点的描述子计算两种。常用的特征有SIFT特征、ORB特征、SURF特征。在图像分类中介绍了特征提取03Brute-Force特征点匹配Brute-Force特征点匹配(1)Brute-Force匹配器用于匹配两组特征中的关键点,获取第一组中一个特征的描述符,并通过一些距离计算与第二组中的所有其它特征匹配,最接近的一个被返回。Brute-Force特征点匹配(2)创建Brute-Force匹配器:bf=cv2.BFMatcher(cv2.NORM_HAMMING)参数cv2.NORM_HAMMING表示使用Hamming距离对描述子进行匹配。Brute-Force特征点匹配(3)匹配结果创建匹配器之后,调用match方法对两组特征进行匹配:matches=bf.match(des1,des2)参数des1和des2是两组要匹配的特征,返回值是匹配上的点。Brute-Force特征点匹配(4)筛选匹配点对匹配点进行筛选,先找出这些匹配点中的最小值和最大值:min_distance=matches[0].distancemax_distance=matches[0].distanceforxinmatches:ifx.distance<min_distance:min_distance=x.distanceifx.distance>max_distance:max_distance=x.distanceBrute-Force特征点匹配(4)筛选匹配点当描述子之间的距离大于两倍的最小距离时,认为匹配有误。但有时候最小距离会非常小,所以设置一个经验值30作为下限。good_match=[]forxinmatches:ifx.distance<=max(2*min_distance,30):good_match.append(x)Brute-Force特征点匹配(5)显示匹配结果defdraw_match(img1,img2,kp1,kp2,match)其中img1和img2表示两个要匹配的图像,kp1和kp2是两个图像的特征点,match表示匹配情况。outimage=cv.drawMatches(img1,kp1,img2,kp2,match,outImg=None)Brute-Force特征点匹配#引入库importnumpyasnpimportcv2#读取图片img1=cv2.imread("images/detect/book1.jpg",0)img2=cv2.imread("images/detect/book1.jpg",0)#匹配defdrawMatches(img1,kp1,img2,kp2,matches):#图片1的行列

rows1=img1.shape[0]cols1=img1.shape[1]Brute-Force特征点匹配#图片2的行列

rows2=img2.shape[0]cols2=img2.shape[1]#创建输出图像

out=np.zeros((max([rows1,rows2]),cols1+cols2,3),dtype='uint8')

#拼接图像

out[:rows1,:cols1]=np.dstack([img1,img1,img1])out[:rows2,cols1:]=np.dstack([img2,img2,img2])

#遍历匹配点

formatinmatches:Brute-Force特征点匹配#匹配点的对应的索引号

img1_idx=mat.queryIdximg2_idx=mat.trainIdx

#匹配点的坐标

(x1,y1)=kp1[img1_idx].pt(x2,y2)=kp2[img2_idx].pt

#绘制匹配点

cv2.circle(out,(int(x1),int(y1)),4,(255,255,0),1)cv2.circle(out,(int(x2)+cols1,int(y2)),4,(0,255,255),1)

#连线

cv2.line(out,(int(x1),int(y1)),(int(x2)+cols1,int(y2)),(255,0,0),1)Brute-Force特征点匹配returnout

#创建特征点检测检测器detector=cv2.ORB_create()#检测图像1kp1=detector.detect(img1,None)#检测图像2kp2=detector.detect(img2,None)#处理检测结果1kp1,des1=pute(img1,kp1)#处理检测结果2kp2,des2=pute(img2,kp2)Brute-Force特征点匹配#创建特征点匹配器bf=cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck=True)#特征点匹配matches=bf.match(des1,des2)#画出匹配情况img3=drawMatches(img1,kp1,img2,kp2,matches[:50])#img3=cv2.drawKeypoints(img1,kp,None,color=(0,255,0),flags=0)#先睡结果#cv2.imwrite("orbTest.jpg",img3)cv2.imshow('orbTest',img3)Brute-Force特征点匹配#关闭窗口cv2.waitKey(0)cv2.destroyAllWindows()04FLANN特征匹配FLANN特征匹配(1)简介FLANN库全称是FastLibraryforApproximateNearestNeighbors,它是目前最完整的(近似)最近邻开源库。不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制。使用FLANN的搜索,整体来说分为两步,一是建立索引,二是搜索。FLANN特征匹配(2)指定index_params参数创建匹配器需要设置参数,需要两个字典类型参数。第一个参数表示要使用的算法,第二个参数表示迭代次数。index_params用于指定索引树的算法类型和数量。可以使用的算法如下:FLANN_INDEX_LINEAR=0FLANN_INDEX_KDTREE=1FLANN_INDEX_KMEANS=2FLANN_INDEX_COMPOSITE=3FLANN_INDEX_KDTREE_SINGLE=4FLANN_INDEX_HIERARCHICAL=5FLANN_INDEX_LSH=6FLANN_INDEX_SAVED=254FLANN_INDEX_AUTOTUNED=255FLANN特征匹配(2)指定index_params参数SIFT和SURF可使用下面的代码来设置:FLANN_INDEX_KDTREE=1indexParams=dict(algorithm=1,trees=5)ORB算法可使用下面代码来设置:FLANN_INDEX_LSH=6indexParams=dict(algorithm=6,table_number=6,key_size=5,muti_probe_level=1)FLANN特征匹配(3)指定searchParams参数searchParams用于指定索引树的遍历次数,遍历次数越多,匹配结果越精确,通常设置为50即可。searchParams=dict(check=50)FLANN特征匹配(4)创建匹配器在创建匹配器的时候,把indexParams和searchParams作为参数:flann=cv2.FlannBasedMatcher(indexParams,searchParams)FLANN特征匹配(5)匹配使用knnMatch匹配处理,并返回匹配结果:matches=flann.knnMatch(featuresA,featuresB,k=2)FLANN特征匹配(6)处理匹配结果根据matches生成相同长度的matchesMask列表,列表元素为[0,0]matchesMask=[[0,0]foriinrange(len(matches))]遍历匹配结果,去除错误匹配,比值检测认为第一个匹配和第二个匹配的比值小于一个给定的值(一般是0.5)fori,(m,n)inenumerate(matches):ifm.distance<0.5*n.distance:matchesMask[i]=[1,0]FLANN特征匹配(7)显示结果将图像显示,mathColor是两图的匹配连接线,连接线与matchesMask相关,singlePointColor是勾画关键点的颜色:drawParams=dict(matchColor=(0,255,0),singlePointColor=(255,0,0),matchesMask=matchesMask,flags=0)resultImage=cv2.drawMatchesKnn(queryImage,kp1,trainingImage,kp2,matches,None,**drawParams)FLANN特征匹配#引入库importcv2frommatplotlibimportpyplotaspltdefFLANN():#读取两张照片

queryImage=cv2.imread('images/detect/book1.jpg',0)trainingImage=cv2.imread('images/detect/book2.jpg',0)#创建SIFT检测器

sift=cv2.xfeatures2d.SIFT_create()

#检测两张图片FLANN特征匹配

kp1,des1=sift.detectAndCompute(queryImage,None)kp2,des2=sift.detectAndCompute(trainingImage,None)#FLANN匹配参数,定义FLANN匹配器,使用KNN算法实现匹配

#这里使用FLANN_INDEX_KDTREE,5kd-trees和50checks迭代

#indexParams=dict(algorithm=1,trees=5)indexParams=dict(algorithm=6,table_number=6,key_size=5,muti_probe_level=1)searchParams=dict(check=100)#匹配

flann=cv2.FlannBasedMatcher(indexParams,searchParams)matches=flann.knnMatch(des1,des2,k=2)FLANN特征匹配#根据matches生成相同长度的matchesMask列表,列表元素为[0,0]matchesMask=[[0,0]foriinrange(len(matches))]#去除错误匹配

#比值检测认为第一个匹配和第二个匹配的比值小于一个给定的值(一般是0.5)

fori,(m,n)inenumerate(matches):ifm.distance<0.5*n.dista

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论