Vincentqyw
update: features and matchers
a80d6bb
raw
history blame
2.17 kB
import os
import re
import cv2
import numpy as np
from ..utils.common import Notify
def read_list(list_path):
"""Read list."""
if list_path is None or not os.path.exists(list_path):
print(Notify.FAIL, 'Not exist', list_path, Notify.ENDC)
exit(-1)
content = open(list_path).read().splitlines()
return content
def load_pfm(pfm_path):
with open(pfm_path, 'rb') as fin:
color = None
width = None
height = None
scale = None
data_type = None
header = str(fin.readline().decode('UTF-8')).rstrip()
if header == 'PF':
color = True
elif header == 'Pf':
color = False
else:
raise Exception('Not a PFM file.')
dim_match = re.match(r'^(\d+)\s(\d+)\s$',
fin.readline().decode('UTF-8'))
if dim_match:
width, height = map(int, dim_match.groups())
else:
raise Exception('Malformed PFM header.')
scale = float((fin.readline().decode('UTF-8')).rstrip())
if scale < 0: # little-endian
data_type = '<f'
else:
data_type = '>f' # big-endian
data_string = fin.read()
data = np.fromstring(data_string, data_type)
shape = (height, width, 3) if color else (height, width)
data = np.reshape(data, shape)
data = np.flip(data, 0)
return data
def _parse_img(img_paths, idx, config):
img_path = img_paths[idx]
img = cv2.imread(img_path)[:, :, ::-1]
if config['resize'] > 0:
img = cv2.resize(
img, (config['resize'], config['resize']))
return img
def _parse_depth(depth_paths, idx, config):
depth = load_pfm(depth_paths[idx])
if config['resize'] > 0:
target_size = config['resize']
if config['input_type'] == 'raw':
depth = cv2.resize(depth, (int(target_size/2), int(target_size/2)))
else:
depth = cv2.resize(depth, (target_size, target_size))
return depth
def _parse_kpts(kpts_paths, idx, config):
kpts = np.load(kpts_paths[idx])['pts']
# output: [N, 2] (W first H last)
return kpts