def bbox_rotatedtight2rotatedloose(bbox_in, angle_in_degree, debug=True): ''' transfer the rotated bbox with tight version to loose version, both contains only two points (top left and bottom right) only a single box is feeded into ''' if debug: assert isnparray(bbox_in) and bbox_in.size == 4, 'box is not correct' pts_tl = np.array([bbox_in[0], bbox_in[1]]) pts_br = np.array([bbox_in[2], bbox_in[3]]) line1 = get_2Dline_from_pts_slope(imagecoor2cartesian(pts_tl), angle_in_degree + 90.00) line2 = get_2Dline_from_pts_slope(imagecoor2cartesian(pts_br), angle_in_degree) pts_bl = cartesian2imagecoor(get_2dpts_from_lines(line1, line2)) pts_tr = cartesian2imagecoor( get_2dpts_from_lines( get_2Dline_from_pts_slope(imagecoor2cartesian(pts_tl), angle_in_degree), get_2Dline_from_pts_slope(imagecoor2cartesian(pts_br), angle_in_degree + 90.00))) # assert_almost_equal(np.dot(pts_bl - pts_br, pts_bl - pts_tl), 0, err_msg='The intersection points are wrong') # assert_almost_equal(np.dot(pts_tr - pts_br, pts_tr - pts_tl), 0, err_msg='The intersection points are wrong') pts_tl_final = np.zeros((2), dtype=np.float32) pts_br_final = np.zeros((2), dtype=np.float32) pts_tl_final[0] = min({pts_tl[0], pts_br[0], pts_bl[0], pts_tr[0]}) pts_tl_final[1] = min({pts_tl[1], pts_br[1], pts_bl[1], pts_tr[1]}) pts_br_final[0] = max({pts_tl[0], pts_br[0], pts_bl[0], pts_tr[0]}) pts_br_final[1] = max({pts_tl[1], pts_br[1], pts_bl[1], pts_tr[1]}) # print(pts_tl_final) # print(pts_br_final) test = np.hstack((pts_tl_final, pts_br_final)) return test
def apply_rotation_tight(bbox_in, angle_in_degree, im_shape, debug=True): ''' return 4 points clockwise ''' if debug: assert isnparray(bbox_in) and bbox_in.size == 4, 'box is not correct' bbox_in = np.reshape(bbox_in, (4, )) bbox_tight = bbox_rotation_inv(bbox_in, angle_in_degree, im_shape, debug=debug) # get top left and bottom right coordinate of the rotated bbox in the image coordinate # print('bbox after inverse the rotation') # print(bbox_tight) pts_total = np.zeros((4, 2), dtype=np.int) pts_tl = np.array([bbox_tight[0], bbox_tight[1]]) pts_br = np.array([bbox_tight[2], bbox_tight[3]]) line1 = get_2dline_from_pts_slope(imagecoor2cartesian(pts_tl, debug=debug), angle_in_degree + 90.00, debug=debug) line2 = get_2dline_from_pts_slope(imagecoor2cartesian(pts_br, debug=debug), angle_in_degree, debug=debug) pts_bl = cartesian2imagecoor(get_2dpts_from_lines(line1, line2, debug=debug), debug=debug) pts_tr = cartesian2imagecoor(get_2dpts_from_lines(get_2dline_from_pts_slope(imagecoor2cartesian(pts_tl, debug=debug), angle_in_degree, debug=debug), get_2dline_from_pts_slope(imagecoor2cartesian(pts_br, debug=debug), angle_in_degree + 90.00, debug=debug), debug=debug), debug=debug) # print np.reshape(pts_tl, (1, 2)).shape # print pts_total[0, :].shape pts_total[0, :] = np.reshape(pts_tl, (1, 2)) pts_total[1, :] = np.reshape(pts_tr, (1, 2)) pts_total[2, :] = np.reshape(pts_br, (1, 2)) pts_total[3, :] = np.reshape(pts_bl, (1, 2)) return pts_total
def test_get_2dpts_from_lines(): print('check normal point') line1 = [1, 1, -2] line2 = [1, -1, 0] pts = get_2dpts_from_lines(line1, line2) assert CHECK_EQ_NUMPY(pts, np.array([-2, -2, -2]).reshape((3, 1))) print('check vertical and horizontal line') line1 = [1, 0, -1] line2 = [0, 1, -1] pts = get_2dpts_from_lines(line1, line2) assert CHECK_EQ_NUMPY(pts, np.array([1, 1, 1]).reshape((3, 1))) print('\n\nDONE! SUCCESSFUL!!\n')