[WIP] Refactoring meta-detection

This commit is contained in:
Matthias Bisping 2023-01-09 13:42:23 +01:00
parent 72bc52dc7b
commit 8327794685

View File

@ -1,15 +1,12 @@
from functools import reduce, partial
from itertools import compress
from operator import __and__
from typing import Iterable
import cv2
import numpy as np
from funcy import lmap, compose, rcompose
from funcy import lmap, compose, rcompose, first, lkeep
from cv_analysis.utils.connect_rects import connect_related_rects2
from cv_analysis.utils.conversion import box_to_rectangle, rectangle_to_box
from cv_analysis.utils.display import show_image
from cv_analysis.utils.postprocessing import (
remove_included,
has_no_parent,
@ -45,22 +42,21 @@ def prepare_for_initial_detection(image: np.ndarray):
def __find_segments(image):
def to_rectangle_if_valid(contour, hierarchy):
return (
box_to_rectangle(cv2.boundingRect(contour))
if is_likely_segment(contour) and has_no_parent(hierarchy)
else None
)
contours, hierarchies = find_contours(image)
likely_segments = map(is_likely_segment, contours)
without_parents = map(has_no_parent, hierarchies[0])
valid_contours = map(__and__, likely_segments, without_parents)
contours = compress(contours, valid_contours)
boxes = map(cv2.boundingRect, contours)
rectangles = lmap(box_to_rectangle, boxes)
rectangles = lkeep(map(to_rectangle_if_valid, *find_contours(image)))
return rectangles
def find_contours(image):
contours, hierarchies = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
return contours, hierarchies
return contours, first(hierarchies)
def is_likely_segment(rect, min_area=100):