|
import os |
|
import cv2 |
|
import numpy as np |
|
from tqdm import tqdm |
|
import matplotlib.pyplot as plt |
|
|
|
def _sort_points(points): |
|
sort_xy = np.array(sorted(points , key=lambda k: [k[0], k[1]])) |
|
left_top, left_bottom = (sort_xy[0],sort_xy[1]) if sort_xy[0][1] < sort_xy[1][1] else (sort_xy[1],sort_xy[0]) |
|
right_top, right_bottom = (sort_xy[2],sort_xy[3]) if sort_xy[2][1] < sort_xy[3][1] else (sort_xy[3],sort_xy[2]) |
|
|
|
return(np.array([left_top,left_bottom,right_top,right_bottom])) |
|
|
|
|
|
def _clip_and_mapped_points(corners,x1,y1,x2,y2): |
|
origin = (x1,y1) |
|
clip_x = np.clip(corners[:,0],x1,x2) |
|
clip_y = np.clip(corners[:,1],y1,y2) |
|
cleft_top,cleft_bottom,cright_top,cright_bottom = np.array(list((zip(clip_x,clip_y)))) |
|
|
|
Tleft_top = np.subtract(cleft_top,origin) |
|
Tleft_bottom = np.subtract(cleft_bottom,origin) |
|
Tright_top = np.subtract(cright_top,origin) |
|
Tright_bottom = np.subtract(cright_bottom,origin) |
|
|
|
return np.array([Tleft_top,Tleft_bottom,Tright_top,Tright_bottom],dtype=np.float32) |
|
|
|
|
|
def perspective_transform(obb_pred, dst_width=300, dst_height=80, plot=False): |
|
crops = [] |
|
transformed = [] |
|
|
|
for res in obb_pred[0]: |
|
x1,y1,x2,y2 = np.array(res.obb.xyxy.cpu().numpy()[0], dtype=np.int32) |
|
obb_points = res.obb.xyxyxyxy.cpu().numpy() |
|
|
|
sorted_corners = _sort_points(obb_points.reshape(4,2)) |
|
mapped_points = _clip_and_mapped_points(sorted_corners,x1,y1,x2,y2) |
|
|
|
org_img = res.orig_img |
|
crop_lp = org_img[y1:y2,x1:x2,:] |
|
crops.append(crop_lp) |
|
|
|
homography = cv2.getPerspectiveTransform(mapped_points, np.float32([[0,0],[0,dst_height],[dst_width,0],[dst_width,dst_height]])) |
|
transformed_lp = cv2.warpPerspective(crop_lp, np.float32(homography), (dst_width, dst_height), flags=cv2.INTER_LINEAR) |
|
transformed.append(transformed_lp) |
|
|
|
if plot: |
|
fig, axes = plt.subplots(len(crops), 2, figsize=(6, 2*len(crops))) |
|
for i,(crop, transformed) in enumerate(zip(crops, transformed)): |
|
axes[i, 0].imshow(crop) |
|
axes[i, 0].set_title(f'cropped {i + 1}') |
|
|
|
axes[i, 1].imshow(transformed) |
|
axes[i, 1].set_title('Transformed') |
|
|
|
for ax in axes.flatten(): |
|
ax.axis('off') |
|
|
|
plt.tight_layout() |
|
plt.show() |
|
|
|
return crops , transformed |
|
|