无法加载已保存的 FLANN 索引
Can't load a saved FLANN index
将所有描述符添加到 FLANN 索引后,我使用以下代码保存它:
flann = cv2.flann.Index()
for index, filename in enumerate(os.listdir('images')):
img2 = cv2.imread('images/' + filename, 0)
kp2, des2 = surf.detectAndCompute(img2, None)
des_all = np.concatenate((des_all, des2))
print "Training..."
flann.build(des_all, index_params)
print "Saving..."
flann.save('saved_index')
这正确地创建了一个包含所有信息的二进制文件。
但是,我很难加载 同一个文件。即使我提供了正确的参数来加载其内容:
flann = cv2.flann.Index()
des_all = np.empty((281578, 64), dtype=np.float32)
flann.load(des_all, 'saved_index')
我尝试用 np.zeros
切换 np.empty
并使用 des_all.flags.writeable = True
手动设置数组可写,但仍然没有。
Numpy 数组的形状和类型是正确的,同样适用于文件路径:如果我尝试使用一些错误的值,我会在控制台中收到警告。
无论如何,我的 des_all
数组总是用零填充,并且对该索引的任何搜索总是 return 没有。
有什么建议吗?
折腾了很久,终于找到了解决办法。
文档帮助不大,所以我不得不做很多试验和错误。
据我所知,整个搜索过程分为两部分:
- 实际数据
- 快速处理索引
这意味着当我尝试恢复以前的状态时,我必须向 FLANN 索引提供相同的数据,然后我才能加载保存的数据。
否则索引指向无效位置,导致空结果。
您可以使用 Numpy 内置函数轻松存储原始数据。
将所有描述符添加到 FLANN 索引后,我使用以下代码保存它:
flann = cv2.flann.Index()
for index, filename in enumerate(os.listdir('images')):
img2 = cv2.imread('images/' + filename, 0)
kp2, des2 = surf.detectAndCompute(img2, None)
des_all = np.concatenate((des_all, des2))
print "Training..."
flann.build(des_all, index_params)
print "Saving..."
flann.save('saved_index')
这正确地创建了一个包含所有信息的二进制文件。
但是,我很难加载 同一个文件。即使我提供了正确的参数来加载其内容:
flann = cv2.flann.Index()
des_all = np.empty((281578, 64), dtype=np.float32)
flann.load(des_all, 'saved_index')
我尝试用 np.zeros
切换 np.empty
并使用 des_all.flags.writeable = True
手动设置数组可写,但仍然没有。
Numpy 数组的形状和类型是正确的,同样适用于文件路径:如果我尝试使用一些错误的值,我会在控制台中收到警告。
无论如何,我的 des_all
数组总是用零填充,并且对该索引的任何搜索总是 return 没有。
有什么建议吗?
折腾了很久,终于找到了解决办法。
文档帮助不大,所以我不得不做很多试验和错误。
据我所知,整个搜索过程分为两部分:
- 实际数据
- 快速处理索引
这意味着当我尝试恢复以前的状态时,我必须向 FLANN 索引提供相同的数据,然后我才能加载保存的数据。
否则索引指向无效位置,导致空结果。
您可以使用 Numpy 内置函数轻松存储原始数据。