|
import os
|
|
import sys
|
|
import cv2
|
|
import numpy as np
|
|
|
|
class Equirectangular:
|
|
def __init__(self, img_name, text2light=False):
|
|
if isinstance(img_name, str):
|
|
self._img = cv2.imread(img_name, cv2.IMREAD_COLOR)
|
|
else:
|
|
self._img = img_name
|
|
if text2light:
|
|
self._img = np.roll(self._img, -60, axis=0)
|
|
|
|
[self._height, self._width, _] = self._img.shape
|
|
|
|
|
|
def GetPerspective(self, FOV, THETA, PHI, height, width):
|
|
|
|
|
|
|
|
|
|
equ_h = self._height
|
|
equ_w = self._width
|
|
equ_cx = (equ_w - 1) / 2.0
|
|
equ_cy = (equ_h - 1) / 2.0
|
|
|
|
wFOV = FOV
|
|
hFOV = float(height) / width * wFOV
|
|
|
|
w_len = np.tan(np.radians(wFOV / 2.0))
|
|
h_len = np.tan(np.radians(hFOV / 2.0))
|
|
|
|
|
|
x_map = np.ones([height, width], np.float32)
|
|
y_map = np.tile(np.linspace(-w_len, w_len,width), [height,1])
|
|
z_map = -np.tile(np.linspace(-h_len, h_len,height), [width,1]).T
|
|
|
|
D = np.sqrt(x_map**2 + y_map**2 + z_map**2)
|
|
xyz = np.stack((x_map,y_map,z_map),axis=2)/np.repeat(D[:, :, np.newaxis], 3, axis=2)
|
|
|
|
y_axis = np.array([0.0, 1.0, 0.0], np.float32)
|
|
z_axis = np.array([0.0, 0.0, 1.0], np.float32)
|
|
[R1, _] = cv2.Rodrigues(z_axis * np.radians(THETA))
|
|
[R2, _] = cv2.Rodrigues(np.dot(R1, y_axis) * np.radians(-PHI))
|
|
|
|
xyz = xyz.reshape([height * width, 3]).T
|
|
xyz = np.dot(R1, xyz)
|
|
xyz = np.dot(R2, xyz).T
|
|
lat = np.arcsin(xyz[:, 2])
|
|
lon = np.arctan2(xyz[:, 1] , xyz[:, 0])
|
|
|
|
lon = lon.reshape([height, width]) / np.pi * 180
|
|
lat = -lat.reshape([height, width]) / np.pi * 180
|
|
|
|
lon = lon / 180 * equ_cx + equ_cx
|
|
lat = lat / 90 * equ_cy + equ_cy
|
|
|
|
|
|
|
|
persp = cv2.remap(self._img, lon.astype(np.float32), lat.astype(np.float32), cv2.INTER_CUBIC, borderMode=cv2.BORDER_WRAP)
|
|
return persp
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|