Выбор правильных верхних и нижних границ ВПГ для обнаружения цвета с помощью 'CV::inRange' (OpenCV)
У меня есть изображение кофейной банки с оранжевой крышкой, положение которой я хочу найти. Вот оно .
утилита gcolor2 показывает HSV в центре крышки, чтобы быть (22, 59, 100). Вопрос в том, как выбрать пределы цвета тогда? Я пробовал min = (18, 40, 90) и max = (27, 255, 255), но получил неожиданный
вот код Python:
import cv
in_image = 'kaffee.png'
out_image = 'kaffee_out.png'
out_image_thr = 'kaffee_thr.png'
ORANGE_MIN = cv.Scalar(18, 40, 90)
ORANGE_MAX = cv.Scalar(27, 255, 255)
COLOR_MIN = ORANGE_MIN
COLOR_MAX = ORANGE_MAX
def test1():
frame = cv.LoadImage(in_image)
frameHSV = cv.CreateImage(cv.GetSize(frame), 8, 3)
cv.CvtColor(frame, frameHSV, cv.CV_RGB2HSV)
frame_threshed = cv.CreateImage(cv.GetSize(frameHSV), 8, 1)
cv.InRangeS(frameHSV, COLOR_MIN, COLOR_MAX, frame_threshed)
cv.SaveImage(out_image_thr, frame_threshed)
if __name__ == '__main__':
test1()
4 ответа:
Проблема 1 : различные применения используют различные масштабы для ВПГ. Например gimp использует
H = 0-360, S = 0-100 and V = 0-100
. Но OpenCV используетH: 0 - 180, S: 0 - 255, V: 0 - 255
. Здесь я получил значение оттенка 22 в gimp. Поэтому я взял половину этого, 11, и определил диапазон для этого. т. е.(5,50,50) - (15,255,255)
.Проблема 2: а также, OpenCV использует формат BGR, а не RGB. Поэтому измените свой код, который преобразует RGB в HSV следующим образом:
cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)
Теперь запустите его. Я получил выходной, как следует:
надеюсь, что это то, чего вы хотели. Есть некоторые ложные обнаружения, но они малы, поэтому вы можете выбрать самый большой контур, который является вашей крышкой.
EDIT:
как Карл Филипп сказал в своем комментарии, было бы хорошо добавить новый код. Но есть изменение только одной строки. Итак, я хотел бы добавить тот же код, реализованный в new
cv2
модуль, поэтому потребители могут сравнить легкость и гибкость новогоcv2
модуль.import cv2 import numpy as np img = cv2.imread('sof.jpg') ORANGE_MIN = np.array([5, 50, 50],np.uint8) ORANGE_MAX = np.array([15, 255, 255],np.uint8) hsv_img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) frame_threshed = cv2.inRange(hsv_img, ORANGE_MIN, ORANGE_MAX) cv2.imwrite('output2.jpg', frame_threshed)
это дает тот же результат, что и выше. Но код гораздо проще.
Я создал эту простую программу, чтобы получить коды HSV в реальном времени
import cv2 import numpy as np cap = cv2.VideoCapture(0) def nothing(x): pass # Creating a window for later use cv2.namedWindow('result') # Starting with 100's to prevent error while masking h,s,v = 100,100,100 # Creating track bar cv2.createTrackbar('h', 'result',0,179,nothing) cv2.createTrackbar('s', 'result',0,255,nothing) cv2.createTrackbar('v', 'result',0,255,nothing) while(1): _, frame = cap.read() #converting to HSV hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) # get info from track bar and appy to result h = cv2.getTrackbarPos('h','result') s = cv2.getTrackbarPos('s','result') v = cv2.getTrackbarPos('v','result') # Normal masking algorithm lower_blue = np.array([h,s,v]) upper_blue = np.array([180,255,255]) mask = cv2.inRange(hsv,lower_blue, upper_blue) result = cv2.bitwise_and(frame,frame,mask = mask) cv2.imshow('result',result) k = cv2.waitKey(5) & 0xFF if k == 27: break cap.release() cv2.destroyAllWindows()
ОК, найти цвет в
HSV
космос-старый, но распространенный вопрос. Я сделалhsv-colormap
для быстрого поиска специального цвета. Вот это:ось x представляет
Hue
в [0,180), y-axis1 представляетSaturation
в [0,255], y-axis2 представляетS = 255
, а сохранитьV = 255
.чтобы найти цвет, обычно просто посмотрите на диапазон
H
иS
, и установите v в диапазоне (20, 255).найти оранжевый цвет, мы ищем на карте, и найти лучший диапазон:
H :[10, 25], S: [100, 255], and V: [20, 255]
. Так что маска-этоcv2.inRange(hsv,(10, 100, 20), (25, 255, 255) )
затем мы используем найденный диапазон для поиска оранжевого цвета, это результат:
метод прост, но часто используется:
#!/usr/bin/python3 # 2018.01.21 20:46:41 CST import cv2 img = cv2.imread("test.jpg") hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) mask = cv2.inRange(hsv,(10, 100, 20), (25, 255, 255) ) cv2.imshow("orange", mask);cv2.waitKey();cv2.destroyAllWindows()
похожие ответы:
диапазон ВПГ OpenCV-это: H: от 0 до 179 S: от 0 до 255 V: от 0 до 255
Я обнаружил при попытке сделать обнаружение объектов на основе цветового пространства HSV, что диапазон 5 (диапазон opencv) был достаточным для фильтрации определенного цвета. Я бы советую вам использовать цветовое небо HSV, чтобы выяснить диапазон, который лучше всего подходит для вашего приложения.