|
""" |
|
@Date: 2021/11/06 |
|
@description: |
|
""" |
|
import cv2 |
|
import numpy as np |
|
|
|
|
|
def xyz2json(xyz, ratio, camera_height=1.6): |
|
xyz = xyz * camera_height |
|
ceiling_height = camera_height * ratio |
|
layout_height = camera_height + ceiling_height |
|
data = { |
|
'cameraHeight': camera_height, |
|
'layoutHeight': layout_height, |
|
'cameraCeilingHeight': ceiling_height, |
|
'layoutObj2ds': { |
|
'num': 0, |
|
'obj2ds': [] |
|
}, |
|
'layoutPoints': { |
|
'num': xyz.shape[0], |
|
'points': [] |
|
}, |
|
'layoutWalls': { |
|
'num': xyz.shape[0], |
|
'walls': [] |
|
} |
|
} |
|
|
|
xyz = np.concatenate([xyz, xyz[0:1, :]], axis=0) |
|
R_180 = cv2.Rodrigues(np.array([0, -1 * np.pi, 0], np.float32))[0] |
|
for i in range(xyz.shape[0] - 1): |
|
a = np.dot(R_180, xyz[i, :]) |
|
a[0] *= -1 |
|
b = np.dot(R_180, xyz[i + 1, :]) |
|
b[0] *= -1 |
|
c = a.copy() |
|
c[1] = 0 |
|
normal = np.cross(a - b, a - c) |
|
normal /= np.linalg.norm(normal) |
|
d = -np.sum(normal * a) |
|
plane = np.asarray([normal[0], normal[1], normal[2], d]) |
|
|
|
data['layoutPoints']['points'].append({'xyz': a.tolist(), 'id': i}) |
|
|
|
next_i = 0 if i + 1 >= (xyz.shape[0] - 1) else i + 1 |
|
tmp = { |
|
'normal': normal.tolist(), |
|
'planeEquation': plane.tolist(), |
|
'pointsIdx': [i, next_i] |
|
} |
|
data['layoutWalls']['walls'].append(tmp) |
|
|
|
return data |
|
|
|
|