60 lines
2.4 KiB
Python
60 lines
2.4 KiB
Python
import cv2
|
|
import numpy as np
|
|
|
|
from ..builder import PIPELINES
|
|
|
|
|
|
@PIPELINES.register_module()
|
|
class ContourDetection(object):
|
|
def __init__(self):
|
|
# logging.info("ContourDetection run ")
|
|
pass
|
|
|
|
# @ RunTime
|
|
def __call__(self, result):
|
|
# shoe diff
|
|
if result['name'] == 'shoes':
|
|
Contour = self.get_contours(result['image'])
|
|
Mask = np.zeros(result['image'].shape[:2], np.uint8)
|
|
for i in range(2):
|
|
Max_contour = Contour[i]
|
|
Epsilon = 0.001 * cv2.arcLength(Max_contour, True)
|
|
Approx = cv2.approxPolyDP(Max_contour, Epsilon, True)
|
|
cv2.drawContours(Mask, [Approx], -1, 255, -1)
|
|
if result['pre_mask'] is None:
|
|
result['mask'] = Mask
|
|
else:
|
|
result['mask'] = cv2.bitwise_and(Mask, result['pre_mask'])
|
|
else:
|
|
Contour = self.get_contours(result['image'])
|
|
Mask = np.zeros(result['image'].shape[:2], np.uint8)
|
|
if len(Contour):
|
|
Max_contour = Contour[0]
|
|
Epsilon = 0.001 * cv2.arcLength(Max_contour, True)
|
|
Approx = cv2.approxPolyDP(Max_contour, Epsilon, True)
|
|
cv2.drawContours(Mask, [Approx], -1, 255, -1)
|
|
else:
|
|
Mask = np.ones(result['image'].shape[:2], np.uint8) * 255
|
|
# TODO 修复部分图片出现透明的情况 下版本上线
|
|
# img2gray = cv2.cvtColor(result['image'], cv2.COLOR_BGR2GRAY)
|
|
# ret, Mask = cv2.threshold(img2gray, 126, 255, cv2.THRESH_BINARY)
|
|
# Mask = cv2.bitwise_not(Mask)
|
|
if result['pre_mask'] is None:
|
|
result['mask'] = Mask
|
|
else:
|
|
result['mask'] = cv2.bitwise_and(Mask, result['pre_mask'])
|
|
result['front_mask'] = result['mask']
|
|
result['back_mask'] = result['mask']
|
|
return result
|
|
|
|
@staticmethod
|
|
def get_contours(image):
|
|
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
|
|
Edge = cv2.Canny(gray, 10, 150)
|
|
kernel = np.ones((5, 5), np.uint8)
|
|
Edge = cv2.dilate(Edge, kernel=kernel, iterations=1)
|
|
Edge = cv2.erode(Edge, kernel=kernel, iterations=1)
|
|
Contour, _ = cv2.findContours(Edge, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
|
Contour = sorted(Contour, key=cv2.contourArea, reverse=True)
|
|
return Contour
|