| | |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | import argparse |
| | import os |
| |
|
| | import numpy as np |
| | import json |
| | import sys |
| | import math |
| | import cv2 |
| | import glob |
| |
|
| | def parse_args(): |
| | parser = argparse.ArgumentParser(description="convert a dataset from the nsvf paper format to nerf format transforms.json") |
| |
|
| | parser.add_argument("--aabb_scale", default=1, help="large scene scale factor") |
| | parser.add_argument("--white_transparent", action="store_true", help="White is transparent") |
| | parser.add_argument("--black_transparent", action="store_true", help="White is transparent") |
| | args = parser.parse_args() |
| | return args |
| |
|
| | def variance_of_laplacian(image): |
| | return cv2.Laplacian(image, cv2.CV_64F).var() |
| |
|
| | def sharpness(imagePath): |
| | image = cv2.imread(imagePath) |
| | gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) |
| | fm = variance_of_laplacian(gray) |
| | return fm |
| |
|
| | if __name__ == "__main__": |
| | args = parse_args() |
| | AABB_SCALE = int(args.aabb_scale) |
| | SKIP_EARLY = 0 |
| | IMAGE_FOLDER = "." |
| | img_files = [[],[],[]] |
| | img_files[0] = sorted(glob.glob(os.path.join(IMAGE_FOLDER, "rgb", f"0_*.png"))) |
| | img_files[1] = sorted(glob.glob(os.path.join(IMAGE_FOLDER, "rgb", f"1_*.png"))) |
| | img_files[2] = sorted(glob.glob(os.path.join(IMAGE_FOLDER, "rgb", f"2_*.png"))) |
| | xx = open("bbox.txt").readline().strip().split(" ") |
| | xx = [x for x in xx if x] |
| | bbox = tuple(map(float,xx)) |
| |
|
| | image = cv2.imread(img_files[0][0],cv2.IMREAD_UNCHANGED) |
| | w = image.shape[1] |
| | h = image.shape[0] |
| | if (image.shape[2] == 3 or (image.shape[2] == 4 and image[0][0][3] != 0)): |
| | x = w-1 |
| | if (image[0][0][0] == 0 and image[0][0][1] == 0 and image[0][0][2] == 0): |
| | print("black opaque background detected") |
| | args.black_transparent=True |
| | elif (image[0][0][0] == 255 and image[0][0][1] == 255 and image[0][0][2] == 255): |
| | print("white opaque background detected") |
| | args.white_transparent=True |
| | elif (image[0][x][0] == 0 and image[0][x][1] == 0 and image[0][x][2] == 0): |
| | print("black opaque background detected") |
| | args.black_transparent=True |
| | elif (image[0][x][0] == 255 and image[0][x][1] == 255 and image[0][x][2] == 255): |
| | print("white opaque background detected") |
| | args.white_transparent=True |
| | else: |
| | print("cant detect background") |
| | exit() |
| | elif (image.shape[2] == 4): |
| | print("transparent alpha channel detected, first pixel alpha = ", image[0][0][3]) |
| |
|
| | lines = map(str.strip,open("intrinsics.txt","r").readlines()) |
| | els = tuple(map(float, " ".join(lines).split(" "))) |
| | print(els) |
| | if len(els) == 11: |
| | fl_x = els[0] |
| | fl_y = els[0] |
| | cx = els[1] |
| | cy = els[2] |
| | elif len(els) == 16: |
| | angle_x=math.pi/2 |
| | fl_x = els[0] |
| | fl_y = els[5] |
| | cx = els[2] |
| | cy = els[6] |
| | else: |
| | print("dont understand intrinsics file", els) |
| | exit() |
| | |
| | angle_x = math.atan(w/(fl_x*2))*2 |
| | angle_y = math.atan(h/(fl_y*2))*2 |
| | fovx = angle_x*180/math.pi |
| | fovy = angle_y*180/math.pi |
| | k1 = 0 |
| | k2 = 0 |
| | p1 = 0 |
| | p2 = 0 |
| |
|
| | print(f"camera:\n\tres={w,h}\n\tcenter={cx,cy}\n\tfocal={fl_x,fl_y}\n\tfov={fovx,fovy}\n\tk={k1,k2} p={p1,p2}") |
| | centroid = [(bbox[0]+bbox[3])*0.5,(bbox[1]+bbox[4])*0.5,(bbox[2]+bbox[5])*0.5] |
| | print("bbox is ", bbox) |
| | print("centroid is ", centroid) |
| | radius = [(bbox[3]-bbox[0])*0.5,(bbox[4]-bbox[1])*0.5,(bbox[5]-bbox[2])*0.5] |
| | scale = 0.5/np.max(radius) |
| | print("radius is ", np.max(radius)) |
| |
|
| | for itype in [0,1,2]: |
| | if (img_files[2]): |
| | OUT_PATH = ["transforms_train.json", "transforms_val.json", "transforms_test.json"][itype] |
| | else: |
| | OUT_PATH = ["transforms_train.json", "transforms_test.json", ""][itype] |
| | if OUT_PATH == "": |
| | break |
| | out = { |
| | "camera_angle_x": angle_x, |
| | "camera_angle_y": angle_y, |
| | "fl_x": fl_x, |
| | "fl_y": fl_y, |
| | "k1": k1, |
| | "k2": k2, |
| | "p1": p1, |
| | "p2": p2, |
| | "cx": cx, |
| | "cy": cy, |
| | "w": w, |
| | "h": h, |
| | "scale": 1, |
| | "white_transparent": args.white_transparent, |
| | "black_transparent": args.black_transparent, |
| | "aabb_scale": AABB_SCALE,"frames":[] |
| | } |
| | for img_f in img_files[itype]: |
| | pose_f = os.path.join(IMAGE_FOLDER,"pose",os.path.splitext(os.path.basename(img_f))[0]+".txt") |
| | elems = tuple(map(float," ".join(open(pose_f).readlines()).split(" "))) |
| | name = img_f |
| | m = np.array(elems).reshape(4,4) |
| | b = sharpness(name) |
| | |
| | c2w = m |
| | c2w[0:3,3] -= centroid |
| | c2w[0:3,3] *= scale |
| | |
| | c2w[0:3,2] *= -1 |
| | c2w[0:3,1] *= -1 |
| | c2w = c2w[[0,2,1,3],:] |
| | c2w[2,:] *= -1 |
| |
|
| | frame = {"file_path": name, "sharpness": b, "transform_matrix": c2w} |
| | out["frames"].append(frame) |
| |
|
| | nframes = len(out["frames"]) |
| |
|
| |
|
| | for f in out["frames"]: |
| | f["transform_matrix"] = f["transform_matrix"].tolist() |
| | print(nframes,"frames") |
| | print(f"writing {OUT_PATH}...") |
| | with open(OUT_PATH, "w") as outfile: |
| | json.dump(out, outfile, indent=2) |
| |
|