Cogs.Core
cubemap_from_equiangular.py
1import os
2
3os.environ["OPENCV_IO_MAX_IMAGE_PIXELS"] = pow(2,40).__str__() # Might be needed when loading really big images
4#os.environ["OPENCV_IO_ENABLE_OPENEXR"]="1"
5
6
7import numpy as np
8import cv2
9from collections import namedtuple
10
11vec3 = namedtuple('vec3', 'x y z')
12
13def normalize(v):
14 s = 1.0/np.sqrt(v.x*v.x + v.y*v.y + v.z*v.z)
15 return vec3(s*v.x, s*v.y, s*v.z)
16
17
18img = cv2.imread("Q:\\360\\starmap_2020_64k.png")
19
20basises = [
21 # [1, V, U]
22 [[ 0.0, 0.0, -1.0],
23 [ 0.0, 1.0, 0.0],
24 [ 1.0, 0.0, 0.0]],
25
26 # [-1, V, U]
27 [[ 0.0, 0.0, 1.0],
28 [ 0.0, 1.0, 0.0],
29 [-1.0, 0.0, 0.0]],
30
31 # [U, 1, -V]
32 [[ 1.0, 0.0, 0.0],
33 [ 0.0, 0.0, -1.0],
34 [ 0.0, 1.0, 0.0]],
35
36 # [U, -1, V]
37 [[ 1.0, 0.0, 0.0],
38 [ 0.0, 0.0, 1.0],
39 [ 0.0, -1.0, 0.0]],
40
41 # [U, V, 1]
42 [[ 1.0, 0.0, 0.0],
43 [ 0.0, 1.0, 0.0],
44 [ 0.0, 0.0, 1.0]],
45
46 # [-U, V, -1]
47 [[-1.0, 0.0, 0.0],
48 [ 0.0, 1.0, 0.0],
49 [ 0.0, 0.0, -1.0]]
50]
51
52s = 16384
53#s = 2*16384
54t = vec3(( 2.0/s)*(np.outer(np.ones(s),np.arange(s))+0.5) - 1.0,
55 ( 2.0/s)*(np.outer(np.arange(s),np.ones(s))+0.5) - 1.0,
56 -np.outer(np.ones(s),np.ones(s)))
57
58
59print("s={}".format(s))
60for f in range(6):
61 basis = basises[f]
62 d = vec3(basis[0][0]*t.x + basis[0][1]*t.y + basis[0][2]*t.z,
63 basis[1][0]*t.x + basis[1][1]*t.y + basis[1][2]*t.z,
64 basis[2][0]*t.x + basis[2][1]*t.y + basis[2][2]*t.z)
65 d = normalize(d)
66
67 u = (img.shape[1]*((0.5/np.pi)*(np.arctan2(d.y, d.x)+np.pi))).astype(int)
68 v = (img.shape[0]*((1.0/np.pi)*np.arccos(d.z))).astype(int)
69
70 resample = img[v,u];
71
72
73 path = "Q:\\360\\moo\\out{}.png".format(f)
74 cv2.imwrite(path, resample)
75 print("Wrote {}".format(path))