| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import argparse |
| import numpy as np |
| import os |
| import struct |
|
|
|
|
| def read_array(path): |
| with open(path, "rb") as fid: |
| width, height, channels = np.genfromtxt(fid, delimiter="&", max_rows=1, |
| usecols=(0, 1, 2), dtype=int) |
| fid.seek(0) |
| num_delimiter = 0 |
| byte = fid.read(1) |
| while True: |
| if byte == b"&": |
| num_delimiter += 1 |
| if num_delimiter >= 3: |
| break |
| byte = fid.read(1) |
| array = np.fromfile(fid, np.float32) |
| array = array.reshape((width, height, channels), order="F") |
| return np.transpose(array, (1, 0, 2)).squeeze() |
|
|
|
|
| def write_array(array, path): |
| """ |
| see: src/mvs/mat.h |
| void Mat<T>::Write(const std::string& path) |
| """ |
| assert array.dtype == np.float32 |
| if len(array.shape) == 2: |
| height, width = array.shape |
| channels = 1 |
| elif len(array.shape) == 3: |
| height, width, channels = array.shape |
| else: |
| assert False |
|
|
| with open(path, "w") as fid: |
| fid.write(str(width) + "&" + str(height) + "&" + str(channels) + "&") |
|
|
| with open(path, "ab") as fid: |
| if len(array.shape) == 2: |
| array_trans = np.transpose(array, (1, 0)) |
| elif len(array.shape) == 3: |
| array_trans = np.transpose(array, (1, 0, 2)) |
| else: |
| assert False |
| data_1d = array_trans.reshape(-1, order="F") |
| data_list = data_1d.tolist() |
| endian_character = "<" |
| format_char_sequence = "".join(["f"] * len(data_list)) |
| byte_data = struct.pack(endian_character + format_char_sequence, *data_list) |
| fid.write(byte_data) |
|
|
|
|
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("-d", "--depth_map", |
| help="path to depth map", type=str, required=True) |
| parser.add_argument("-n", "--normal_map", |
| help="path to normal map", type=str, required=True) |
| parser.add_argument("--min_depth_percentile", |
| help="minimum visualization depth percentile", |
| type=float, default=5) |
| parser.add_argument("--max_depth_percentile", |
| help="maximum visualization depth percentile", |
| type=float, default=95) |
| args = parser.parse_args() |
| return args |
|
|
|
|
| def main(): |
| args = parse_args() |
|
|
| if args.min_depth_percentile > args.max_depth_percentile: |
| raise ValueError("min_depth_percentile should be less than or equal " |
| "to the max_depth_perceintile.") |
|
|
| |
| if not os.path.exists(args.depth_map): |
| raise FileNotFoundError("File not found: {}".format(args.depth_map)) |
|
|
| if not os.path.exists(args.normal_map): |
| raise FileNotFoundError("File not found: {}".format(args.normal_map)) |
|
|
| depth_map = read_array(args.depth_map) |
| normal_map = read_array(args.normal_map) |
|
|
| min_depth, max_depth = np.percentile( |
| depth_map, [args.min_depth_percentile, args.max_depth_percentile]) |
| depth_map[depth_map < min_depth] = min_depth |
| depth_map[depth_map > max_depth] = max_depth |
|
|
| import pylab as plt |
|
|
| |
| plt.figure() |
| plt.imshow(depth_map) |
| plt.title("depth map") |
|
|
| |
| plt.figure() |
| plt.imshow(normal_map) |
| plt.title("normal map") |
|
|
| plt.show() |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|