Мне поручено написать программу для обнаружения и выделения трех «целей» с высоты для моего ракетного клуба. Этими целями являются 3 больших брезента, для которых у меня есть значения RGB.Определение и дифференцирование целевого изображения Python и OpenCV
Когда я начал этот проект, я наложил изображение GoogleEarth на 3 прямоугольника, используя точные значения RGB для брезентов, и мой код работал безупречно. Однако, когда я действительно получил брезент и начал фотографировать их на земле, мой код не распознает брезент с границами цвета RGB, которые я предписывал.
Я попытался преобразовать изображения в цветовое пространство HSV, но я просто не могу заставить его работать. Я также думал об использовании контуров - пытаясь заставить программу распознать 4 прямые линии, которые связывают каждую цель. Проблема в том, что эти изображения будут вывезены на улицу, поэтому я не могу контролировать условия окружающего освещения.
Есть ли у кого-нибудь идеи относительно того, какое цветовое пространство или метод компьютерного зрения позволят мне идентифицировать и различать эти цели независимо от наружного освещения?
Исходное изображение после обработки
Фактический брезента быть Выявленные
Вот код:
import cv2
import numpy as np
image = cv2.imread('2000 ft.png', 1)
#hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
#cv2.waitKey(0)
cv2.destroyAllWindows()
# define target strings
targ = ['Target 1 - Blue', 'Target 2 - Yellow', 'Target 3 - Red']
i = 0
# BGR boundaries of colors
boundaries = [
# 0, 32, 91
([40, 10, 0], [160, 60, 20]),
# 255, 209, 0
([0, 180, 220], [20, 230, 255]),
# 166, 9, 61
([40, 0, 150], [80, 30, 185]),
]
# colors for rectangle outlines
colors = [
([91, 32, 0]), ([0, 209, 255]), ([61, 9, 166])
]
# # loop over the boundaries
for (lower, upper) in boundaries:
# create NumPy arrays from the boundaries
lower = np.array(lower, dtype = "uint16")
upper = np.array(upper, dtype = "uint16")
# find the colors within the specified boundaries and apply
# the mask
mask = cv2.inRange(image, lower, upper)
output = cv2.bitwise_and(image, image, mask = mask)
# frame threshold
frame_threshed = cv2.inRange(image, lower, upper)
imgray = frame_threshed
# iteratively view masks
cv2.imshow('imgray',imgray)
cv2.waitKey(0)
cv2.destroyAllWindows()
ret,thresh = cv2.threshold(frame_threshed,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# Find the index of the largest contour
areas = [cv2.contourArea(c) for c in contours]
max_index = np.argmax(areas)
cont=contours[max_index]
# putting text and outline rectangles on image
x,y,w,h = cv2.boundingRect(cont)
cv2.rectangle(image,(x,y),(x+w,y+h),colors[i],2)
cv2.putText(image, targ[i], (x-50, y-10), cv2.FONT_HERSHEY_PLAIN, 0.85, (0, 255, 0))
# cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),4)
cv2.imshow("Show",image)
cv2.waitKey()
cv2.destroyAllWindows()
i += 1
cv2.destroyAllWindows()
Я пишу этот код в Python, который у меня есть хорошее количество опыт использования, используя библиотеку OpenCV, в которой у меня нет большого опыта. Любая помощь будет принята с благодарностью!
Привет Роза, я использовал этот код и он прекрасно работает с изображением я первоначально размещен. Тем не менее, я взял еще несколько образцов изображений сегодня, и красные и синие цели не идентифицируются. Разные границы цветов помогут определить эти цели? Вот одна из картин, которые я попытался проанализировать: http://www.jpeg-optimizer.com/uploaded_images_final/IMG_2654__1486844593_152.7.224.5.jpg – RB1994
В идеале вы должны изучить целевые цвета, но я думаю, что если вы попробуете цвета из нескольких (не последовательных) кадров и установить целевой цвет в соответствие с образцами, вы получите разумные результаты –
в любом случае, я обновил код, чтобы использовать CIELab вместо RGB, он должен работать лучше –