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

Python 将提取的SURF描述符和关键点存储在*.npy文件中,python,opencv,Python,Opencv,我不熟悉Python和opencv。我设法获取描述符,并在图像上绘制关键点,但我需要知道如何存储它以备将来比较。您可能会遵循。我个人使用以下代码来加载和保存冲浪描述符 def read_features_from_file(filename): """ Read feature properties and return in matrix form. """ if os.path.getsize(filename) <= 0: return np.arra

我不熟悉Python和opencv。我设法获取描述符,并在图像上绘制关键点,但我需要知道如何存储它以备将来比较。

您可能会遵循。我个人使用以下代码来加载和保存冲浪描述符

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)))
这对我很有用:

# 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))

谢谢@skyuuka的回复,你提供的代码不是python的,对吗?我会试着转换它。给出的链接显示他们使用pickle来存储,但是我是否可以单独用numpy来实现呢?是的,它是用Python实现的。上述代码的唯一要求是
import numpy as np
import os
。默认情况下,
np.save
/
np.load
*.npy
格式。您还可以使用
np.savetxt
/
np.loadtxt
在文本文件中保存/加载。这意味着提取的描述符和关键点是自np.save(文件名,数组)以来的数组@skyuuka@CY91:是,OpenCV(cv2)正在使用
numpy
。关键点和描述符是numpy数组格式。@CY91:对不起,我刚刚意识到我在复制以前的代码时遗漏了一些内容。现在我已经做了编辑,使它更完整。我已经编写了一个单独的
pack\u keypoint
unpack\u keypoint
来将数组转换为numpy矩阵。
# 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))