распознание объекта по цвету, раздельные рамки для нескольких объектов
Есть скрипт по распознанию заданного цвета. Хорошо работает если объект один, а если два, то рамка выделения просто увеличивается и захватывает два объекта. Как эту рамку разбить для каждого объекта чтоб своя была,а не одна общая.
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<255 else 255, 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()
Ответы (1 шт):
Автор решения: T800
→ Ссылка
Я решил вопрос таким образом, если есть решение лучше, буду рад увидеть.
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)