2012-09-27 7 views
4

У меня есть два изображения, которые я хочу сравнить с помощью python и opencv.Как сравнить функции серфинга в python opencv2.4

Я понял, как извлечь функции для серфинга из одного изображения из этой книги: Программирование Vision Vision с помощью 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

Существует реализация FLANN для Python OpenCV, я использовал ее сам, и она работает очень хорошо. Первоначально было нелегко выяснить, но 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) 

Perform ближайший поиск соседей:

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

используя это мой код с двумя изображения, где один st то же изображение масштабируется, я получил до результата следующее сообщение: Warning: недопустимое значение, обнаруженное в divide – user601836

+0

Да, это просто ошибка времени выполнения, я вижу это сам время от времени. Я не понимал, что это происходит для масштабированных версий изображения. Когда у меня будет какое-то время, я углубись в нее. Однако до сих пор это не приводило к каким-либо проблемам для меня. – casper

1

Соответствующие дескрипторы SURF обычно выполняются с использованием k-ближайших соседей (с k = 2). Конечно, для C++ OpenCV имеет для этого встроенный класс - быстрый приближенный дескриптор ближайшего соседа (FLANN_matcher), хотя я не могу найти никаких документов для версий Python. Может быть, выкопайте, посмотрите, сможете ли вы его найти?

Если вам нужно сделать это с нуля, this post имеет хороший пример кода, используя cv2.KNearest, который определенно находится в версии Python.

Смежные вопросы