将提取的SURF描述符和关键点存储在*.npy文件中。

4

我刚开始学习Python和OpenCV。我已经成功获取描述符并将关键点绘制到图像上,但我需要知道如何将其存储以便将来进行比较。

2个回答

7
您可以跟随此链接。我个人使用以下代码来加载和保存SURF描述符。
def read_features_from_file(filename):
    """ Read feature properties and return in matrix form. """
    if os.path.getsize(filename) <= 0:
        return np.array([]), np.array([])
    f = np.load(filename)
    if f.size == 0:
        return np.array([]), np.array([])
    f = np.atleast_2d(f)
    return f[:,:7], f[:,7:] # feature locations, descriptors

def write_features_to_file(filename, locs, desc):
    np.save(filename, np.hstack((locs,desc)))

[编辑]: 添加更多代码和使用示例:
def pack_keypoint(keypoints, descriptors):
    kpts = np.array([[kp.pt[0], kp.pt[1], kp.size,
                  kp.angle, kp.response, kp.octave,
                  kp.class_id]
                 for kp in keypoints])
    desc = np.array(descriptors)
    return kpts, desc

def unpack_keypoint(array):
    try:
        kpts = array[:,:7]
        desc = array[:,7:]
        keypoints = [cv2.KeyPoint(x, y, _size, _angle, _response, int(_octave), int(_class_id))
                 for x, y, _size, _angle, _response, _octave, _class_id in list(kpts)]
        return keypoints, np.array(desc)
    except(IndexError):
        return np.array([]), np.array([])

def process_image(imagename, resultname):
    img = cv2.imread(imagename, 0)
    k = surf.detect(img, None)
    if len(k) > 0:
        k, des = surf.compute(img, k)
    else:
        des = []
    k, des = pack_keypoint(k, des) #
    write_features_to_file(resultname, k, des)

谢谢您的回复@skyuuka,您提供的代码不是Python的对吧?我会尝试转换它。给出的链接显示他们使用pickle进行存储,但有没有办法仅使用numpy来完成呢? - CY91
是的,这是用 Python 编写的。上述代码的唯一要求是 import numpy as npimport os。默认情况下,np.save/np.load 使用 *.npy 格式。您还可以使用 np.savetxt/np.loadtxt 将其保存/加载到文本文件中。 - skyuuka
这意味着提取的描述符和关键点是数组,因为 np.save(filename, array)。@skyuuka - CY91
@CY91:是的,OpenCV(cv2)使用numpy。关键点和描述符以numpy数组格式存储。 - skyuuka
@CY91:抱歉,我刚意识到在复制之前的代码时漏掉了一些内容。现在我已经进行了编辑,使其更加完整。我编写了单独的 pack_keypointunpack_keypoint 函数来将数组转换为 numpy 矩阵。 - skyuuka
所以基本上我需要在一个新文件中编写上述代码,并将其放入库目录中?最终在主函数中调用它? - CY91

-1

这个对我有用:

# Initiate SURF detector
surf = cv2.xfeatures2d.SURF_create()
surf.setHessianThreshold(10000)

img1 = cv2.imread("images/85_hires.png", 4)
kp1, des1 = surf.detectAndCompute(img1, None)
img2 = cv2.imread("images/85_hires.png", 4)
kp2, des2 = surf.detectAndCompute(img2, None)

np.savetxt("test.txt", des2)

new = np.loadtxt("test.txt").astype('float32')
print(getImageScore(des1, des2))
print(getImageScore(des1, new))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接