59 lines
1.0 KiB
Python
59 lines
1.0 KiB
Python
from __future__ import annotations
|
|
|
|
import cv2
|
|
from funcy import first, iterate
|
|
from numpy import generic
|
|
|
|
|
|
def copy_and_normalize_channels(image):
|
|
|
|
image = image.copy()
|
|
try:
|
|
image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
|
|
except cv2.error:
|
|
pass
|
|
|
|
return image
|
|
|
|
|
|
def npconvert(ob):
|
|
if isinstance(ob, generic):
|
|
return ob.item()
|
|
raise TypeError
|
|
|
|
|
|
def lift(fn):
|
|
def lifted(coll):
|
|
yield from map(fn, coll)
|
|
|
|
return lifted
|
|
|
|
|
|
def star(fn):
|
|
def starred(*args):
|
|
return fn(*args)
|
|
|
|
return starred
|
|
|
|
|
|
def until(cond, func, *args, **kwargs):
|
|
return first(filter(cond, iterate(func, *args, **kwargs)))
|
|
|
|
|
|
def make_merger_sentinel():
|
|
def no_new_mergers(records):
|
|
nonlocal number_of_records_so_far
|
|
|
|
number_of_records_now = len(records)
|
|
|
|
if number_of_records_now == number_of_records_so_far:
|
|
return True
|
|
|
|
else:
|
|
number_of_records_so_far = number_of_records_now
|
|
return False
|
|
|
|
number_of_records_so_far = -1
|
|
|
|
return no_new_mergers
|