Выбор правильных верхних и нижних границ ВПГ для обнаружения цвета с помощью '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 55

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)

Теперь запустите его. Я получил выходной, как следует:

enter image description here

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

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 для быстрого поиска специального цвета. Вот это:

enter image description here

ось 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) )

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

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. как определить пороговое значение для обнаружения только объектов зеленого цвета изображение: Opencv

  2. выбирая правильные значения ВПГ для пороговой обработки с использованием OpenCV InRangeS

диапазон ВПГ OpenCV-это: H: от 0 до 179 S: от 0 до 255 V: от 0 до 255

Я обнаружил при попытке сделать обнаружение объектов на основе цветового пространства HSV, что диапазон 5 (диапазон opencv) был достаточным для фильтрации определенного цвета. Я бы советую вам использовать цветовое небо HSV, чтобы выяснить диапазон, который лучше всего подходит для вашего приложения.

HSV color palate with color detection in HSV space