|
import cv2 |
|
import numpy as np |
|
|
|
def filter_mask(output, image): |
|
image_h, image_w = image.shape[:2] |
|
|
|
predict_mask = (output.squeeze().cpu().numpy().round()) |
|
predict_mask = predict_mask.astype('uint8')*255 |
|
predict_mask = cv2.resize( predict_mask, (image_w, image_h) ) |
|
|
|
ret, thresh = cv2.threshold(predict_mask, 127, 255, 0) |
|
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) |
|
points = contours[0] |
|
|
|
rect = cv2.minAreaRect(points) |
|
box = cv2.boxPoints(rect) |
|
box = np.int0(box) |
|
|
|
img_vis = cv2.drawContours(image.copy(),[box],0,(255,0,0), 6) |
|
|
|
(cX, cY), (w, h), angle = rect |
|
|
|
if w<h: |
|
angle -= 90 |
|
|
|
|
|
|
|
M = cv2.getRotationMatrix2D((cX, cY), angle, 1.0) |
|
rotated = cv2.warpAffine(image, M, (round(image_w), round(image_h))) |
|
|
|
ones = np.ones(shape=(len(points), 1)) |
|
points = np.squeeze(points) |
|
points_ones = np.hstack([points, ones]) |
|
points_rotate = M.dot(points_ones.T).T |
|
|
|
(cX, cY), (w, h), angle = cv2.minAreaRect(points_rotate.round().astype(int)) |
|
|
|
if angle < 45 : |
|
crop_img = rotated[round(cY-h//2):round(cY+h//2), round(cX - w//2):round(cX + w//2)] |
|
else: |
|
crop_img = rotated[round(cY-w//2):round(cY+w//2), round(cX - h//2):round(cX + h//2)] |
|
return crop_img, img_vis |