def _locate(segmented, offset=None):
"""Inspired from: https://goo.gl/HYPrR1"""
# clean invalid patterns from the mask
segmented = process_mask(segmented)
# CV_RETR_EXTERNAL to only get external contours.
_, contours, hierarchy = cv2.findContours(segmented.copy(),
cv2.RETR_CCOMP,
cv2.CHAIN_APPROX_SIMPLE)
# Note: points are represented as (col, row)-tuples apparently
transform = identity
if offset is not None:
col_off, row_off = offset
transform = affine_transform(delta_x=col_off, delta_y=row_off)
components = []
if len(contours) > 0:
top_index = 0
tops_remaining = True
while tops_remaining:
exterior = contours[top_index][:, 0, :].tolist()
interiors = []
# check if there are childs and process if necessary
if hierarchy[0][top_index][2] != -1:
sub_index = hierarchy[0][top_index][2]
subs_remaining = True
while subs_remaining:
interiors.append(contours[sub_index][:, 0, :].tolist())
# check if there is another sub contour
if hierarchy[0][sub_index][0] != -1:
sub_index = hierarchy[0][sub_index][0]
else:
subs_remaining = False
# add component tuple to components only if exterior is a polygon
if len(exterior) > 3:
polygon = Polygon(exterior, interiors)
polygon = transform(polygon)
if polygon.is_valid: # some polygons might be invalid
components.append(polygon)
else:
print (explain_validity(polygon))
# check if there is another top contour
if hierarchy[0][top_index][0] != -1:
top_index = hierarchy[0][top_index][0]
else:
tops_remaining = False
del contours
del hierarchy
return components
评论列表
文章目录