распознание объекта по цвету, раздельные рамки для нескольких объектов

Рейтинг: 0Ответов: 1Опубликовано: 16.04.2023

Есть скрипт по распознанию заданного цвета. Хорошо работает если объект один, а если два, то рамка выделения просто увеличивается и захватывает два объекта. Как эту рамку разбить для каждого объекта чтоб своя была,а не одна общая.

import tkinter as tk
from tkinter import ttk
from tkinter.colorchooser import askcolor

import sys
import numpy as np
import cv2
from PIL import Image

from random import randrange

root = tk.Tk()
root.title('Tkinter Color Chooser')
root.geometry('300x150')

c1, c2, c3 = '', '', ''

def change_color():
    global c1,c2,c3
    colors = askcolor(title="Tkinter Color Chooser")
    c1 = str(colors[0]).split(',')[0]
    c1 = ''.join(c1.split('(', 1)[1]) #Red
    c2 = str(colors[0]).split(',')[1]
    c2 = ''.join(c2.split(' ', 1)[1]) #Green
    c3 = str(colors[0]).split(',')[2]
    c3 = ''.join(c3.split(')')[0])
    c3 = ''.join(c3.split(' ', 1)[1]) #Blue
    root.configure(bg=colors[1])

def color_hsv():
    blue = int(c3)
    green = int(c2)
    red = int(c1)
    color = np.uint8([[[blue, green, red]]])
    hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
    hue = hsv_color[0][0][0]

    color_box = [(0,0,255),(0,255,255),(0,255,0),(255,255,0),(255,0,0)]
    c_num = randrange(5)

    img = cv2.imread('Blue.jpg', 1)
    img = cv2.resize(img, (0, 0), fx=0.2, fy=0.2)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    lower_range = np.array([hue - 10 if hue-10>0 else 0, 70, 70], dtype=np.uint8)
    upper_range = np.array([hue + 10 if hue+10<179 else 179, 255, 255], dtype=np.uint8)
    mask = cv2.inRange(hsv, lower_range, upper_range)
    mask_ = Image.fromarray(mask)
    bbox = mask_.getbbox()
    if bbox is not None:
        x1, y1, x2, y2 = bbox
        img = cv2.rectangle(img, (x1,y1), (x2,y2), color_box[c_num], 2)

    #cv2.imshow('mask', mask)
    cv2.imshow('image', img)
    while (1):
        k = cv2.waitKey(0)
        if (k == 27):
            break
    cv2.destroyAllWindows()

ttk.Button(root, text='Select a Color', command=change_color).pack(expand=True)
ttk.Button(root, text='Find objects', command=color_hsv).pack(expand=True)

root.mainloop()

Ответы

▲ 3Принят

Я решил вопрос таким образом, если есть решение лучше, буду рад увидеть.

mask = cv2.inRange(hsv, lower_range, upper_range)

_, thresh = cv2.threshold(mask, 70, 255, cv2.THRESH_BINARY)
dilated = cv2.dilate(thresh, None, iterations=2)

cnts, _ = cv2.findContours(dilated, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
    x1, y1, x2, y2 = cv2.boundingRect(c)
    img = cv2.rectangle(img, (x1,y1), (x1+x2,y1+y2), color_box[c_num], 2)

cv2.imshow('image', img)