2012-09-27 34 views
4

我有兩個圖像,我想用python和opencv進行比較。如何比較python中的衝浪功能opencv2.4

我明白如何從本書的單個圖像中提取衝浪特徵:用Python編程計算機視覺。

我提取有如下特點:

import cv2 
from numpy import * 

# read image 
im = cv2.imread('empire.jpg') 

# downsample 
im_lowres = cv2.pyrDown(im) 

# convert to grayscale 
gray = cv2.cvtColor(im_lowres,cv2.COLOR_RGB2GRAY) 

# detect feature points 
s = cv2.SURF() 
mask = uint8(ones(gray.shape)) 

keypoints = s.detect(gray,mask) 

# show image and points 
vis = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR) 
for k in keypoints[::10]: 
    cv2.circle(vis,(int(k.pt[0]),int(k.pt[1])),2,(0,255,0),-1) 
    cv2.circle(vis,(int(k.pt[0]),int(k.pt[1])),int(k.size),(0,255,0),2) 

cv2.imshow('local descriptors',vis) 
cv2.waitKey() 

現在我怎麼能我比較關鍵點與另一組關鍵點的其中來自使用參考圖像?

回答

6

Python OpenCV有一個FLANN實現,我自己使用它,它工作得很好。最初它不容易弄清楚,但this question幫助了我很多,請參閱Esteban Angee's答案。

你也可以看看我的回答this question,我很快就解釋了代碼。我在這裏重複說明。

r_threshold = 0.6 
FLANN_INDEX_KDTREE = 1 # bug: flann enums are missing 

構建您的參數字典:

flann_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 4) 
flann = cv2.flann_Index(desc2, flann_params) 

執行最鄰近搜索:

idx2, dist = flann.knnSearch(desc1, 2, params = {}) # bug: need to provide empty dict 
mask = dist[:,0]/dist[:,1] < r_threshold 
idx1 = np.arange(len(desc1)) 
pairs = np.int32(zip(idx1, idx2[:,0])) 

返回相匹配的描述:使用這是我的代碼有兩個

return pairs[mask] 
+0

圖像,其中一個是ju st同樣的圖像縮放我得到之前結果以下消息:警告:在除法中遇到無效值 – user601836

+0

是的,這只是一個運行時錯誤,我不時看到它自己。我沒有意識到它發生在圖像的縮放版本中。當我有一段時間時,我會更仔細地研究它。但是,到目前爲止,它並沒有給我帶來任何問題。 – casper

1

匹配SURF描述符通常使用k最近鄰(k = 2)完成。當然,對於C++ OpenCV有一個內置的類來做到這一點 - 快速近似最近鄰描述符匹配器(FLANN_matcher),儘管我似乎無法找到Python版本的任何文檔。也許有一個挖掘周圍,看看你能找到它嗎?

如果最終需要從頭開始,this post有一個很好的代碼示例,使用cv2.KNearest,它肯定是在Python版本中。