Вопрос по hsv, color-detection, opencv – Выбор правильной верхней и нижней границ ВПГ для определения цвета с помощью `cv :: inRange` (OpenCV)

58

У меня есть изображение кофейной банки с оранжевой крышкой, положение которой я хочу найти. Вотimage.

Утилита gcolor2 показывает HSV в центре крышки (22, 59, 100). Вопрос в том, как выбрать пределы цвета? Я пробовал min = (18, 40, 90) и max = (27, 255, 255), но получил неожиданноеresult

Вот код 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()
Я проверил значения (22, 59, 100) как HSV, и они, кажется, не соответствуют ни одному цвету, подобному цветам крышки. Но как BGR, они имеют смысл. Как вы получили эти значения? karlphillip
Вот скриншот с gcolor2imageshack.us/photo/my-images/23/rgb2hsv.png, Затем я проверил номер цвета # FFA069 наyafla.com/yaflaColor/ColorRGBHSL.aspx?RGB=&Colors=,,,,,,,,, и преобразование то же самое. Student FourK
Вероятно, это связано с различными диапазонами HSV в OpenCV, а именно: H: 0–180, S: 0–255, V: 0–255. Student FourK

Ваш Ответ

4   ответа
22

Я создал эту простую программу, чтобы получить коды 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()
LOL, я написал тот же код с печатью окончательных значений HSV, используемыхgithub.com/saurabheights/ImageProcessingExperimentScripts/blob/…
15

Ок, найди цвет вHSV Пространство это старый, но общий вопрос. я сделалhsv-colormap быстро искать специальный цвет. Вот:

enter image description here

Ось X представляетHue в [0,180), ось Y представляетSaturation в [0,255], ось Y2 представляет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) )

Затем мы используем найденный диапазон для поиска оранжевого цвета, это результат:

enter image description here


Метод прост, но обычно используется:

#!/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()

Подобные ответы:

  1. How to define a threshold value to detect only green colour objects in an image :Opencv

  2. Choosing correct HSV values for OpenCV thresholding with InRangeS

0

Чтобы найти значение HSV для Green, попробуйте следующие команды в терминале Python

green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print hsv_green
[[[ 60 255 255]]]
124

Problem 1 : Различные приложения используют разные шкалы для HSV. Например, 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).

Problem 2: Кроме того, OpenCV использует формат BGR, а не RGB. Поэтому измените код, который преобразует RGB в HSV, следующим образом:

cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)

Теперь запустите это. Я получил вывод следующим образом:

enter image description here

Надеюсь, это то, что вы хотели. Есть несколько ложных обнаружений, но они маленькие, поэтому вы можете выбрать самый большой контур, которым является ваша крышка.

EDIT:

КакKarl Philip сказал в своем комментарии, было бы хорошо, чтобы добавить новый код. Но есть изменение только одной строки. Итак, я хотел бы добавить тот же код, реализованный в новом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)

Это дает тот же результат, что и выше. Но код намного проще.

Спасибо. Но я не думаю, что здесь есть много превосходства. :) (Хорошо, я сделаю это)
+1 Отлично, еще раз. Если бы вы могли добавить полный исходный код с вашими модификациями, это было бы здорово.
@karlphillip: отредактировал ответ
Просто чтобы сказать спасибо! Это помогло мне много!
Большой! Теперь это работает и для меня, хотя я считаю, что ваши S и V min-max диапазоны слишком ослаблены. У меня также есть хорошее покрытие крышки с min (5, 100, 255) и max (15, 200, 255). Student FourK

Похожие вопросы