我使用ORB/FLANN来比较图像,并希望将FLANN中的图像描述符保存/加载到一个文件中,以便以后可以读取它们与另一个图像进行比较。
import numpy as np
import os
import cv2
# read in two images and identify their keypoints and descriptors using ORB
first_image = cv2.imread('firstimage.jpg', 0)
second_image = cv2.imread('secondimage.jpg', 0)
detector = cv2.ORB_create(500)
kp1, des1 = detector.detectAndCompute(first_image, None)
kp2, des2 = detector.detectAndCompute(second_image, None)
# Match images using FLANN
FLANN_INDEX_LSH = 6
index_params= dict(algorithm = FLANN_INDEX_LSH, table_number = 6,
key_size = 12, multi_probe_level = 1)
search_params = dict()
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1, des2, k=2)
# determine how many good matches there are between these images
goodmatches = 0
for m, n in matches:
if m.distance < 0.7*n.distance:
goodmatches += 1
print("Number of good matches before save of descriptors =", goodmatches)
np.save('descfile', des2)
desc2 = np.load('descfile.npy')
matches = flann.knnMatch(des1, des2, k=2)
# determine how many good matches there are between these images after save/load
goodmatches = 0
for m, n in matches:
if m.distance < 0.7*n.distance:
goodmatches += 1
print("Number of good matches after reading in descriptors from file=", goodmatches)
很明显,我不了解描述符或描述符的保存/加载过程,因为我希望这两个打印语句在图像之间产生相同数量的良好匹配,但事实并非如此。
任何想法都将不胜感激。
【添加】
也许在上面的代码中对我正在做的事情进行的这个较小的描述会有所帮助:
- 识别两个不同图像的图像描述符
- 比较它们以确定它们的匹配程度,从而得出这些图像的相似程度的匹配分数
- 然后将第二个图像的描述符保存到文件中
- 然后从该文件加载第二个图像的描述符
- 将第一个图像的描述符与第二个图像的文件中加载的描述符进行比较,生成这些图像相似程度的匹配分数
在将第二个图像的描述符加载/保存到文件后,我没有得到与保存/加载前比较第一个和第二个映像相同的匹配分数。
为什么???
好的,经过多次搜索,我找到了自己问题的答案。描述符的加载和保存在上面运行良好。匹配完全相同的描述符的结果产生不同结果的原因是,knnMatch((函数的匹配算法具有随机特性,这意味着即使连续两次使用完全相同的参数调用它,每次都会得到至少略有不同的结果。
导入泡菜
用于保存
with open(self.modelDir + "\SiftDescriptors.pkl", 'wb') as f:
pickle.dump(self.sampleImgDescriptors, f)
用于装载
with open(self.modelDir + "\SiftDescriptors.pkl", 'rb') as f:
descriptors = pickle.load(f)