Сохранение KeyPoint в виде строки и преобразование обратно в KeyPoint - PullRequest
1 голос
/ 23 мая 2019

Я хотел бы кэшировать KeyPoint в файл JSON, а затем получить их позже для использования в FlannBasedMatcher. Есть ли способ преобразовать KeyPoint во что-то вроде массива строк или чисел с плавающей запятой, которые можно сохранить, а затем извлечь из файла JSON? Я думаю, что это должно быть хорошо для дескрипторов, так как они просто выглядят как массив целых чисел.

ВЫЧИСЛИТЕЛЬНЫЕ КЛАВИШИ

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

Сличитель

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

1 Ответ

1 голос
/ 23 мая 2019

Вы можете сохранить 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)

Сохранить в data.txt в формате json:

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

Преобразование обратно в KeyPoint из файлаФайл JSON необходимо изменить на класс 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()
...