117 lines
3.6 KiB
Python
117 lines
3.6 KiB
Python
|
|
import logging
|
||
|
|
|
||
|
|
import numpy as np
|
||
|
|
import cv2
|
||
|
|
from matplotlib import pyplot as plt
|
||
|
|
|
||
|
|
from PIL import Image
|
||
|
|
|
||
|
|
|
||
|
|
def show(img, win_name="temp"):
|
||
|
|
cv2.imshow(win_name, img)
|
||
|
|
cv2.waitKey(0)
|
||
|
|
|
||
|
|
|
||
|
|
def crop(img):
|
||
|
|
mid_point_h, mid_point_w = int(img.shape[0] / 2 + 30), int(img.shape[1] / 2)
|
||
|
|
img_roi = img[mid_point_h - 520: mid_point_h + 520, mid_point_w - 340: mid_point_w + 340]
|
||
|
|
return img_roi
|
||
|
|
|
||
|
|
|
||
|
|
class Layer(object):
|
||
|
|
def __init__(self):
|
||
|
|
self._layer = []
|
||
|
|
|
||
|
|
@property
|
||
|
|
def layer(self):
|
||
|
|
return self._layer
|
||
|
|
|
||
|
|
def insert(self, layer_instance):
|
||
|
|
if layer_instance['name'] == 'body':
|
||
|
|
self._body = layer_instance
|
||
|
|
self._layer.append(layer_instance)
|
||
|
|
|
||
|
|
def sort(self, priority):
|
||
|
|
self._layer.sort(key=lambda x: priority[x['name']])
|
||
|
|
|
||
|
|
# def merge(self, cfg):
|
||
|
|
# """
|
||
|
|
# opencv shape order (height, width, channel)
|
||
|
|
# image coordinate system:
|
||
|
|
# |------------->x (width)
|
||
|
|
# |
|
||
|
|
# |
|
||
|
|
# |
|
||
|
|
# y (height)
|
||
|
|
# Returns:
|
||
|
|
#
|
||
|
|
#
|
||
|
|
# """
|
||
|
|
# base_image = Image.new('RGBA', self._layer[1]['image'].size, (0, 0, 0, 0))
|
||
|
|
# for layer in self._layer:
|
||
|
|
# y, x = layer['position']
|
||
|
|
# base_image.paste(layer['image'], (x, y), layer['image'])
|
||
|
|
# # base_image.show()
|
||
|
|
#
|
||
|
|
# for x in self._layer:
|
||
|
|
# if np.all(x['mask'] == 0):
|
||
|
|
# continue
|
||
|
|
# # obtain region of interest about roi(roi) and item-image(roi_image, roi_mask)
|
||
|
|
# roi, roi_mask, roi_image, signal = self.get_roi(dst=dst, image=x)
|
||
|
|
# temp_bg = np.expand_dims(cv2.bitwise_not(roi_mask), axis=2).repeat(3, axis=2)
|
||
|
|
# tmp1 = (roi * (temp_bg / 255)).astype(np.uint8)
|
||
|
|
# temp_fg = np.expand_dims(roi_mask, axis=2).repeat(3, axis=2)
|
||
|
|
# tmp2 = (roi_image * (temp_fg / 255)).astype(np.uint8)
|
||
|
|
#
|
||
|
|
# roi[:] = cv2.add(tmp1, tmp2)
|
||
|
|
# # show(cv2.resize(dst, (int(dst.shape[1] * 0.5), int(dst.shape[0] * 0.5)), interpolation=cv2.INTER_AREA),
|
||
|
|
# # win_name=x.get('name'))
|
||
|
|
# # crop image and get the central part
|
||
|
|
# if cfg.get('basic')['self_template'] == False:
|
||
|
|
# dst_roi = crop(dst)
|
||
|
|
# else:
|
||
|
|
# dst_roi = dst
|
||
|
|
# return dst_roi, signal
|
||
|
|
#
|
||
|
|
# @staticmethod
|
||
|
|
# def get_roi(dst, image):
|
||
|
|
# signal = False
|
||
|
|
# dst_y, dst_x = dst.shape[:2]
|
||
|
|
# roi_height, roi_width = image['mask'].shape
|
||
|
|
# roi_y0, roi_x0 = image['position']
|
||
|
|
#
|
||
|
|
# if roi_y0 < 0:
|
||
|
|
# roi_yin = 0
|
||
|
|
# mask_yin = -roi_y0
|
||
|
|
# signal = True
|
||
|
|
# else:
|
||
|
|
# roi_yin = roi_y0
|
||
|
|
# mask_yin = 0
|
||
|
|
# if roi_y0 + roi_height > dst_y:
|
||
|
|
# roi_yout = dst_y
|
||
|
|
# mask_yout = dst_y - roi_y0
|
||
|
|
# signal = True
|
||
|
|
# else:
|
||
|
|
# roi_yout = roi_height + roi_y0
|
||
|
|
# mask_yout = roi_height
|
||
|
|
# # x part
|
||
|
|
# if roi_x0 < 0:
|
||
|
|
# roi_xin = 0
|
||
|
|
# mask_xin = -roi_x0
|
||
|
|
# signal = True
|
||
|
|
# else:
|
||
|
|
# roi_xin = roi_x0
|
||
|
|
# mask_xin = 0
|
||
|
|
# if roi_x0 + roi_width > dst_x:
|
||
|
|
# roi_xout = dst_x
|
||
|
|
# mask_xout = dst_x - roi_x0
|
||
|
|
# signal = True
|
||
|
|
# else:
|
||
|
|
# roi_xout = roi_width + roi_x0
|
||
|
|
# mask_xout = roi_width
|
||
|
|
#
|
||
|
|
# roi = dst[roi_yin: roi_yout, roi_xin: roi_xout]
|
||
|
|
# roi_mask = image['mask'][mask_yin: mask_yout, mask_xin: mask_xout]
|
||
|
|
# roi_image = image['image'][mask_yin: mask_yout, mask_xin: mask_xout]
|
||
|
|
# return roi, roi_mask, roi_image, signal
|