1

我想缓存KeyPoint在 JSON 文件中,然后稍后检索它们以用于FlannBasedMatcher. 有没有办法将其转换为KeyPoint可以存储然后从 JSON 文件中检索的字符串或浮点数组之类的东西?我认为这对于描述符来说应该没问题,因为它们看起来就像一个整数数组。

计算关键点

kp2, des2 = brisk.detectAndCompute(img2, None)

匹配器

matches = flann.knnMatch(des1,des2,k=2)
4

1 回答 1

2

您可以将 KeyPoint 直接以字符串类型保存到 JSON 文件中:

import json
def save_2_jason(arr):
        data = {}  
        cnt = 0
        for i in arr:
            data['KeyPoint_%d'%cnt] = []  
            data['KeyPoint_%d'%cnt].append({'x': i.pt[0]})
            data['KeyPoint_%d'%cnt].append({'y': i.pt[1]})
            data['KeyPoint_%d'%cnt].append({'size': i.size})
            cnt+=1
        with open('data.txt', 'w') as outfile:  
            json.dump(data, outfile)

以 json 格式保存到 data.txt:

(kpt, desc) = brisk.detectAndCompute(img, None)
save_2_jason(kpt)

从 JSON 文件转换回 KeyPoint 需要将其更改为 cv2.KeyPoint 类:

import json
def read_from_jason():
        result = []    
        with open('data.txt') as json_file:  
            data = json.load(json_file)
            cnt = 0
            while(data.__contains__('KeyPoint_%d'%cnt)):
                pt = cv2.KeyPoint(x=data['KeyPoint_%d'%cnt][0]['x'],y=data['KeyPoint_%d'%cnt][1]['y'], _size=data['KeyPoint_%d'%cnt][2]['size'])
                result.append(pt)
                cnt+=1
        return result

从您保存的 data.txt 中读取:

kpt_read_from_jason = read_from_jason()
于 2019-05-23T06:53:04.523 回答