| """ | |
| @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 | |