Добрый день, подскажите как добавить фильтр формы и минимального размера? я хочу найти полуогруглые обьекты, на данный момент работают маски для обнаружения теплых цветов, обьекты преимущественно красно-оранжевые но проблема в том что есть много посторонних обьектов, хочу добавить фильтр для лучшего распознования, заранее спасибо
import cv2
import numpy as np
#import scikit-imag
#from scikit-imag import measure
import skimage
import imutils
from imutils import contours
from skimage import measure
import argparse
image = cv2.imread("2.jpg")
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
red= cv2.inRange(hsv, (0, 70, 50), (10, 255, 255))
red2 = cv2.inRange(hsv, (170, 70, 50), (180, 255, 255))
orange = cv2.inRange(hsv, (10, 100, 20), (25, 255, 255))
yellow = cv2.inRange(hsv, (21, 39, 64), (40, 255, 255))
mask_red = red>0
mask_red2 = red2>0
mask_orange = orange>0
mask_yellow = yellow>0
red = np.zeros_like(image, np.uint8)
red[mask_red] = image[mask_red]
red[mask_red2] = image[mask_red2]
red[mask_orange] = image[mask_orange]
red[mask_yellow] = image[mask_yellow]
#cv2.imshow("red color detection ", red)
gray = cv2.cvtColor(red, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (11, 11), 0)
thresh = cv2.threshold(blurred, 200, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.erode(thresh, None, iterations=2)
thresh = cv2.dilate(thresh, None, iterations=4)
labels = measure.label(thresh, connectivity=1, background=0)
mask = np.zeros(thresh.shape, dtype="uint8")
for label in np.unique(labels):
if label == 0:
continue
labelMask = np.zeros(thresh.shape, dtype="uint8")
labelMask[labels == label] = 255
numPixels = cv2.countNonZero(labelMask)
if numPixels > 300:
mask = cv2.add(mask, labelMask)
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = contours.sort_contours(cnts)[0]
for (i, c) in enumerate(cnts):
(x, y, w, h) = cv2.boundingRect(c)
((cX, cY), radius) = cv2.minEnclosingCircle(c)
cv2.circle(red, (int(cX), int(cY)), int(radius), (0, 0, 255), 3)
cv2.putText(red, "#{}".format(i + 1), (x, y - 15), cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
cv2.imshow("Image", red)
if cv2.waitKey(0):
cv2.destroyAllWindows()
ссылка на пример изображения:
https://drive.google.com/file/d/1O3Va5JZLNzw-X1XB5YxESjcdlDN115vP/view?usp=sharing
Ошибки после добавления фильтров :
cnts = contours.sort_contours(cnts)[0]
и
(cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),
ValueError: not enough values to unpack (expected 2, got 0)
Перемещено leave из general