Как создать базу данных дескрипторов SIFT [с Python]?

Как мне создать базу данных дескрипторов SIFT (изображений)? Я использую OpenCV в Pyhton 2.7, и я намерен внедрить обучающий набор под наблюдением на машине опорных векторов.

Вот мой код для 1 изображения

import cv2
import numpy as np

img = cv2.imread('C:\Python27\.Clocktower1.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

sift = cv2.SIFT()
kp = sift.detect(gray,None)

img=cv2.drawKeypoints(gray,kp)

cv2.imwrite('sift_keypoints.jpg',img)

kp, des = sift.detectAndCompute(gray,None)

cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27:        
    cv2.destroyAllWindows()
elif k == ord('s'): 
    cv2.destroyAllWindows()

a = np.arange(127*127).reshape(127, 127)
np.set_printoptions(edgeitems=127)

f = open('file.txt','w')
f.write('answer:'+str(des))
f.close()

У меня возникли проблемы с сохранением матрицы des, которая содержит векторы kypoint, и я до сих пор не знаю функции, позволяющей автоматизировать алгоритм для получения более 1 изображения за цикл.

Благодарю вас

Редактировать:

вывод в виде:

answer:[[   5.    1.    0.    7.   14.    1.    3.    8.    2.    1.    0.    0.
     0.    3.   12.    8.    0.    7.   14.    3.    2.    4.    3.    1.
     1.    1.    6.    6.   17.    3.    0.    1.   29.   32.    4.   10.
    29.   77.   22.   14.   98.   31.    1.    0.    4.   41.   84.   76.
    13.   14.   38.   10.   59.  115.   53.   22.   16.    4.   21.   13.
    56.   90.   72.   31.   45.   19.    7.    3.   10.   89.   85.   46.
   115.   12.    2.    6.   16.   27.  115.  103.   55.    3.    4.   20.
   115.  101.   15.   29.  113.    8.   16.   40.   33.   53.   61.   47.
    65.   16.    0.    0.    5.   24.   90.   86.    8.    0.    8.   47.
    63.   33.   67.   51.    6.    1.   19.   64.   89.   73.   36.   18.
    21.    8.   60.  115.   31.   58.   11.    8.] ...
(other 128-numbers vectors)

Мне нужно выбрать n лучших дескрипторов, чтобы ограничить количество ключевых точек, которые я получаю в выводе; есть ли реализация к этому?

1 ответ

SIFT может принимать параметр, который указывает количество лучших функций для сохранения

Когда вы создаете экземпляр SIFT, вы должны сделать это следующим образом

sift = cv2.SIFT(n)

См. http://docs.opencv.org/trunk/modules/nonfree/doc/feature_detection.html

Другие вопросы по тегам