【opencv】利用opencv進行圖像識別與定位


SIFT檢測方法

SIFT算法就是把圖像的特征檢測出來,通過這些特征可以在眾多的圖片中找到相應的圖片

import cv2
#讀取圖片,以1.png為例
img=cv2.imread('1.png')
#檢測關鍵點並計算描述
sift=cv2.xfeatures2d.SIFT_create()
#描述符是對關鍵點的描述,可用於圖片匹配
keypoints,descriptor=sift.detectAndCompute(img,None)
#將關鍵點勾畫到圖片上
flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT
color=(0,255,0)

#參數image代表原始圖片
#參數outImage是指輸出在哪張圖片上
#參數keypoints代表圖片的關鍵點
#參數flags代表關鍵點的勾畫方式
#參數color代表勾畫的色彩模式
img=cv2.drawKeypoints(image=img,outImage=img,keypoints=keypoints,flags=flags,color=color)

#顯示圖片
cv2.imshow('sift_keypoints',img)
cv2.waitKey()

將上圖處理過后,就變為了如下所示

 

 

 

下面圖像特征檢測選擇SIFT算法,圖像匹配算法選擇FLANN算法,:

用此圖像2.png與下圖1.png進行匹配

 

import cv2
img1=cv2.imread('1.png')
img2=cv2.imread('2.png')
#使用SIFT算法獲取圖像特征的關鍵點和描述符
sift=cv2.xfeatures2d.SIFT_create()
kp1,des1=sift.detectAndCompute(img1,None)
kp2,des2=sift.detectAndCompute(img2,None)

#定義FLANN匹配器
indexParams=dict(algorithm=0,trees=10)
searchParams=dict(checks=50)
flann=cv2.FlannBasedMatcher(indexParams,searchParams)
#使用KNN算法實現圖像匹配,並對匹配結果排序
matches=flann.knnMatch(des1,des2,k=2)
matches=sorted(matches,key=lambda x:x[0].distance)

#去除錯誤匹配,0.5是系數,系數大小不同,匹配的結果頁不同
goodMatches=[]
for m,n in matches:
    if m.distance<0.5*n.distance:
        goodMatches.append(m)

#獲取某個點的坐標位置
#index是獲取匹配結果的中位數
index=int(len(goodMatches)/2)
#queryIdx是目標圖像的描述符索引
x,y=kp1[goodMatches[index].queryIdx].pt
#將坐標位置勾畫在2.png圖片上,並顯示
cv2.rectangle(img1,(int(x),int(y)),int(x)+5,int(y)+5),(0,255,0),2)
cv2.imshow('baofeng',img1)
cv2.waitKey()

匹配完畢,迷你特工隊封面圖上紅色的特工下巴那里出現了一個綠點,若無法匹配則會報錯

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM