5-3-使用特征點從圖像中檢測目標(2個)_第1頁
5-3-使用特征點從圖像中檢測目標(2個)_第2頁
5-3-使用特征點從圖像中檢測目標(2個)_第3頁
5-3-使用特征點從圖像中檢測目標(2個)_第4頁
5-3-使用特征點從圖像中檢測目標(2個)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

目標檢測使用特征點從圖像中檢測目標目錄CONTENTS圖像特征特征點提取Brute-Force特征點匹配FLANN特征匹配01圖像特征圖像特征圖像特征人對相同圖像進行匹配的過程,即使不同視角、不同光照下的圖像,我們還是能夠找到對應的目標,這就是人能夠很輕松的找到圖像中最重要的特征。按照這種思路,要想讓計算機找到對應的目標,也需要找到圖形中的最重要的特征點,這些特征點稱為關鍵點,一般使用角點(Conorpoint)作為關鍵點。02特征點提取特征點提取特征點提取對一幅圖像進行特征提取包括關鍵點提取和關鍵點的描述子計算兩種。常用的特征有SIFT特征、ORB特征、SURF特征。在圖像分類中介紹了特征提取03Brute-Force特征點匹配Brute-Force特征點匹配(1)Brute-Force匹配器用于匹配兩組特征中的關鍵點,獲取第一組中一個特征的描述符,并通過一些距離計算與第二組中的所有其它特征匹配,最接近的一個被返回。Brute-Force特征點匹配(2)創(chuàng)建Brute-Force匹配器:bf=cv2.BFMatcher(cv2.NORM_HAMMING)參數(shù)cv2.NORM_HAMMING表示使用Hamming距離對描述子進行匹配。Brute-Force特征點匹配(3)匹配結果創(chuàng)建匹配器之后,調用match方法對兩組特征進行匹配:matches=bf.match(des1,des2)參數(shù)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]#創(chuàng)建輸出圖像

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

#創(chuàng)建特征點檢測檢測器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特征點匹配#創(chuàng)建特征點匹配器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,它是目前最完整的(近似)最近鄰開源庫。不但實現(xiàn)了一系列查找算法,還包含了一種自動選取最快算法的機制。使用FLANN的搜索,整體來說分為兩步,一是建立索引,二是搜索。FLANN特征匹配(2)指定index_params參數(shù)創(chuàng)建匹配器需要設置參數(shù),需要兩個字典類型參數(shù)。第一個參數(shù)表示要使用的算法,第二個參數(shù)表示迭代次數(shù)。index_params用于指定索引樹的算法類型和數(shù)量??梢允褂玫乃惴ㄈ缦拢篎LANN_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參數(shù)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參數(shù)searchParams用于指定索引樹的遍歷次數(shù),遍歷次數(shù)越多,匹配結果越精確,通常設置為50即可。searchParams=dict(check=50)FLANN特征匹配(4)創(chuàng)建匹配器在創(chuàng)建匹配器的時候,把indexParams和searchParams作為參數(shù):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)#創(chuàng)建SIFT檢測器

sift=cv2.xfeatures2d.SIFT_create()

#檢測兩張圖片F(xiàn)LANN特征匹配

kp1,des1=sift.detectAndCompute(queryImage,None)kp2,des2=sift.detectAndCompute(trainingImage,None)#FLANN匹配參數(shù),定義FLANN匹配器,使用KNN算法實現(xiàn)匹配

#這里使用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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論