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