Python 将提取的SURF描述符和关键点存储在*.npy文件中
我不熟悉Python和opencv。我设法获取描述符,并在图像上绘制关键点,但我需要知道如何存储它以备将来比较。您可能会遵循。我个人使用以下代码来加载和保存冲浪描述符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
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))