LINUX.ORG.RU

Хочу добавить фильтр размера для обнаружения красно-оранжевых обьектов

 ,


0

1

Добрый день, подскажите как добавить фильтр формы и минимального размера? я хочу найти полуогруглые обьекты, на данный момент работают маски для обнаружения теплых цветов, обьекты преимущественно красно-оранжевые но проблема в том что есть много посторонних обьектов, хочу добавить фильтр для лучшего распознования, заранее спасибо

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

Это можно сделать кучей разных способов, например:

  1. найти замкнутые контуры
  2. найти площадь
  3. отсортировать по размеру и отфильтровать по какому-то эмпирическому порогу.

На будущее: было бы весьма кстати выкладывать примеры изображений.

ymn ★★★★★ ()
Ответ на: комментарий от ymn

спасибо, ссылка на фото добавлена, на счет кода то изображение после фильтра теплых цветов(red), преображено на черно былый (gray) н о появилась ошибка когда я хочу с gray взять определенные по размеру пиксели, спасибо за Вашу помощь!

katemisik ()

Ты же в прошлой итерации научилась постить в нужную тему форума (в Development), что опять произошло, обнуление?

zemidius ()
Ответ на: комментарий от ymn

плюс минус да, я думаю сделать поиск элипсов-светафоров(они обычно черного цвета), а потом поиск красные-оранжевые цвета в элипсах, пока что лучше идеи у меня идеи нет

katemisik ()
Ответ на: комментарий от katemisik

Тогда просто бери cv2.HoughCircles и вперед, если это учебная задача. А если нет, то классическими методами будет очень сложно нивелировать влияние освещения/погодных условий и т.п. вещей. Для таких вещей используют сверточные сети.

ymn ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей