""" # -*- coding: utf-8 -*- ----------------------------------------------------------------------------------- # Author: Nguyen Mau Dung # DoC: 2020.08.09 # email: nguyenmaudung93.kstn@gmail.com ----------------------------------------------------------------------------------- # Description: The utils of the kitti dataset """ from __future__ import print_function import os import sys import numpy as np import cv2 src_dir = os.path.dirname(os.path.realpath(__file__)) # while not src_dir.endswith("sfa"): # src_dir = os.path.dirname(src_dir) if src_dir not in sys.path: sys.path.append(src_dir) import config.kitti_config as cnf def roty(angle): # Rotation about the y-axis. c = np.cos(angle) s = np.sin(angle) return np.array([[c, 0, s], [0, 1, 0], [-s, 0, c]]) def compute_box_3d(dim, location, ry): # dim: 3 # location: 3 # ry: 1 # return: 8 x 3 R = roty(ry) h, w, l = dim x_corners = [l / 2, l / 2, -l / 2, -l / 2, l / 2, l / 2, -l / 2, -l / 2] y_corners = [0, 0, 0, 0, -h, -h, -h, -h] z_corners = [w / 2, -w / 2, -w / 2, w / 2, w / 2, -w / 2, -w / 2, w / 2] corners = np.array([x_corners, y_corners, z_corners], dtype=np.float32) corners_3d = np.dot(R, corners) corners_3d = corners_3d + np.array(location, dtype=np.float32).reshape(3, 1) return corners_3d.transpose(1, 0) def project_to_image(pts_3d, P): # pts_3d: n x 3 # P: 3 x 4 # return: n x 2 pts_3d_homo = np.concatenate([pts_3d, np.ones((pts_3d.shape[0], 1), dtype=np.float32)], axis=1) pts_2d = np.dot(P, pts_3d_homo.transpose(1, 0)).transpose(1, 0) pts_2d = pts_2d[:, :2] / pts_2d[:, 2:] return pts_2d.astype(np.int) def draw_box_3d_v2(image, qs, color=(255, 0, 255), thickness=2): ''' Draw 3d bounding box in image qs: (8,3) array of vertices for the 3d box in following order: 1 -------- 0 /| /| 2 -------- 3 . | | | | . 5 -------- 4 |/ |/ 6 -------- 7 ''' qs = qs.astype(np.int32) for k in range(0, 4): # Ref: http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html i, j = k, (k + 1) % 4 # use LINE_AA for opencv3 cv2.line(image, (qs[i, 0], qs[i, 1]), (qs[j, 0], qs[j, 1]), color, thickness) i, j = k + 4, (k + 1) % 4 + 4 cv2.line(image, (qs[i, 0], qs[i, 1]), (qs[j, 0], qs[j, 1]), color, thickness) i, j = k, k + 4 cv2.line(image, (qs[i, 0], qs[i, 1]), (qs[j, 0], qs[j, 1]), color, thickness) return image def draw_box_3d(image, corners, color=(0, 0, 255)): ''' Draw 3d bounding box in image corners: (8,3) array of vertices for the 3d box in following order: 1 -------- 0 /| /| 2 -------- 3 . | | | | . 5 -------- 4 |/ |/ 6 -------- 7 ''' face_idx = [[0, 1, 5, 4], [1, 2, 6, 5], [2, 3, 7, 6], [3, 0, 4, 7]] for ind_f in range(3, -1, -1): f = face_idx[ind_f] for j in range(4): cv2.line(image, (corners[f[j], 0], corners[f[j], 1]), (corners[f[(j + 1) % 4], 0], corners[f[(j + 1) % 4], 1]), color, 2, lineType=cv2.LINE_AA) if ind_f == 0: cv2.line(image, (corners[f[0], 0], corners[f[0], 1]), (corners[f[2], 0], corners[f[2], 1]), color, 1, lineType=cv2.LINE_AA) cv2.line(image, (corners[f[1], 0], corners[f[1], 1]), (corners[f[3], 0], corners[f[3], 1]), color, 1, lineType=cv2.LINE_AA) return image def show_rgb_image_with_boxes(img, labels, calib): for box_idx, label in enumerate(labels): cls_id, location, dim, ry = label[0], label[1:4], label[4:7], label[7] if location[2] < 2.0: # The object is too close to the camera, ignore it during visualization continue if cls_id < 0: continue corners_3d = compute_box_3d(dim, location, ry) corners_2d = project_to_image(corners_3d, calib.P2) img = draw_box_3d(img, corners_2d, color=cnf.colors[int(cls_id)]) return img def merge_rgb_to_bev(img_rgb, img_bev, output_width): img_rgb_h, img_rgb_w = img_rgb.shape[:2] ratio_rgb = output_width / img_rgb_w output_rgb_h = int(ratio_rgb * img_rgb_h) ret_img_rgb = cv2.resize(img_rgb, (output_width, output_rgb_h)) img_bev_h, img_bev_w = img_bev.shape[:2] ratio_bev = output_width / img_bev_w output_bev_h = int(ratio_bev * img_bev_h) ret_img_bev = cv2.resize(img_bev, (output_width, output_bev_h)) out_img = np.zeros((output_rgb_h + output_bev_h, output_width, 3), dtype=np.uint8) # Upper: RGB --> BEV out_img[:output_rgb_h, ...] = ret_img_rgb out_img[output_rgb_h:, ...] = ret_img_bev return out_img