File size: 4,568 Bytes
c29de8d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8b8d7b17-af50-42cd-b531-ef61c49c9e61",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set the work directory to the imaginaire root.\n",
    "import os, sys, time\n",
    "import pathlib\n",
    "root_dir = pathlib.Path().absolute().parents[2]\n",
    "os.chdir(root_dir)\n",
    "print(f\"Root Directory Path: {root_dir}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2b5b9e2f-841c-4815-92e0-0c76ed46da62",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Import Python libraries.\n",
    "import numpy as np\n",
    "import torch\n",
    "import k3d\n",
    "import json\n",
    "from collections import OrderedDict\n",
    "# Import imaginaire modules.\n",
    "from projects.nerf.utils import camera, visualize\n",
    "from third_party.colmap.scripts.python.read_write_model import read_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "76033016-2d92-4a5d-9e50-3978553e8df4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Read the COLMAP data.\n",
    "colmap_path = \"datasets/iphone/climbingnet_skip12\"\n",
    "cameras, images, points_3D = read_model(path=f\"{colmap_path}/dense/sparse\", ext=\".bin\")\n",
    "# Convert camera poses.\n",
    "images = OrderedDict(sorted(images.items()))\n",
    "qvecs = torch.from_numpy(np.stack([image.qvec for image in images.values()]))\n",
    "tvecs = torch.from_numpy(np.stack([image.tvec for image in images.values()]))\n",
    "Rs = camera.quaternion.q_to_R(qvecs)\n",
    "poses = torch.cat([Rs, tvecs[..., None]], dim=-1)  # [N,3,4]\n",
    "print(f\"# images: {len(poses)}\")\n",
    "# Get the sparse 3D points and the colors.\n",
    "xyzs = torch.from_numpy(np.stack([point.xyz for point in points_3D.values()]))\n",
    "rgbs = np.stack([point.rgb for point in points_3D.values()])\n",
    "rgbs = (rgbs[:, 0] * 2**16 + rgbs[:, 1] * 2**8 + rgbs[:, 2]).astype(np.uint32)\n",
    "print(f\"# points: {len(xyzs)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b6cf60ec-fe6a-43ba-9aaf-e3c7afd88208",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Visualize the bounding sphere.\n",
    "json_fname = f\"{colmap_path}/dense/transforms.json\"\n",
    "with open(json_fname) as file:\n",
    "    meta = json.load(file)\n",
    "center = meta[\"sphere_center\"]\n",
    "radius = meta[\"sphere_radius\"]\n",
    "# ------------------------------------------------------------------------------------\n",
    "# These variables can be adjusted to make the bounding sphere fit the region of interest.\n",
    "# The adjusted values can then be set in the config as data.readjust.center and data.readjust.scale\n",
    "readjust_center = np.array([0., 0., 0.])\n",
    "readjust_scale = 0.25\n",
    "# ------------------------------------------------------------------------------------\n",
    "center += readjust_center\n",
    "radius *= readjust_scale\n",
    "# Make some points to hallucinate a bounding sphere.\n",
    "sphere_points = np.random.randn(100000, 3)\n",
    "sphere_points = sphere_points / np.linalg.norm(sphere_points, axis=-1, keepdims=True)\n",
    "sphere_points = sphere_points * radius + center"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fdde170b-4546-4617-9162-a9fcb936347d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Visualize with K3D.\n",
    "vis_scale = 0.5\n",
    "plot = visualize.k3d_visualize_pose(poses,\n",
    "                                    vis_depth=(0.5 * vis_scale),\n",
    "                                    xyz_length=(0.1 * vis_scale),\n",
    "                                    center_size=(0.05 * vis_scale),\n",
    "                                    xyz_width=(0.02 * vis_scale))\n",
    "plot += k3d.points(xyzs, colors=rgbs, point_size=(0.05 * vis_scale), shader=\"flat\")\n",
    "plot += k3d.points(sphere_points, color=0x4488ff, point_size=0.02, shader=\"flat\")\n",
    "plot.display()\n",
    "plot.camera_fov = 30.0"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}