如何使用Python创建SIFT的描述符数据库?

时间:2013-12-05 00:04:37

标签: python opencv numpy svm sift

如何创建SIFT描述符数据库(图像)?我在Pyhton 2.7中使用OpenCV,我的目的是在支持向量机上实现一个监督的训练集。

到目前为止,我的代码是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()

我在保存包含kypoint矢量的矩阵des时遇到了麻烦,而且我仍然不知道将算法自动化为每个周期多于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 个答案:

答案 0 :(得分:1)

SIFT可以采用一个参数来说明要保留的最佳功能的数量

当你实例化SIFT时,你应该这样做

sift = cv2.SIFT(n)

参考 http://docs.opencv.org/trunk/modules/nonfree/doc/feature_detection.html