В настоящее время он отлично работает с объектами, которые не соприкасаются, но не работает, когда несколько небольших объектов (около 3,5 мм × 1,5 мм) **соприкасаются ** или **перекрываются ** — в конечном итоге они считаются как одна капля.
Вот текущий процесс обработки (упрощенный):
Код: Выделить всё
def extra_process(img):
sm = cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)
lab = cv2.cvtColor(sm, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
l_clahe = clahe.apply(l)
lab_cl = cv2.merge((l_clahe, a, b))
return cv2.cvtColor(lab_cl, cv2.COLOR_LAB2BGR)
def process_pipeline(img):
enhanced = extra_process(img)
gray = cv2.cvtColor(enhanced, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
canny = cv2.Canny(blur, 30, 150, 3)
kernel = np.ones((3,3), np.uint8)
closed = cv2.morphologyEx(canny, cv2.MORPH_CLOSE, kernel)
cnt, _ = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_KCOS)
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.drawContours(rgb, cnt, -1, (0, 255, 0), 2)
counted = sum(1 for c in cnt if cv2.contourArea(c) > 100)
return rgb, counted
- Я уже пробовал использовать водораздел.
Я хочу разделить объекты, которые соприкасаются или перекрывают друг друга.
Я избегаю использования YOLO или предварительно обученные модели. Основная причина в том, что моя производственная линия имеет очень большое разнообразие объектов — иногда ежедневно появляются две или более новых объектных моделей.
Повторное обучение или точная настройка YOLO (или любой предварительно обученной CNN) для каждой новой модели было бы слишком трудоемким и неэффективным.
Вместо этого я ищу облегченный подход к локальному обучению или адаптивному распознаванию на основе OpenCV.
Мой вопрос:
Что будет ли хорошим подходом помочь системе распознавать и отделять перекрывающиеся небольшие объекты одного и того же типа?
Подробнее здесь: https://stackoverflow.com/questions/797 ... -camera-no