developer tip

'cv :: inRange'(OpenCV)를 사용하여 색상 감지를위한 올바른 상위 및 하위 HSV 경계 선택

copycodes 2020. 11. 16. 21:41
반응형

'cv :: inRange'(OpenCV)를 사용하여 색상 감지를위한 올바른 상위 및 하위 HSV 경계 선택


내가 찾고 싶은 주황색 뚜껑 위치가있는 커피 캔 이미지가 있습니다. 여기 있습니다 영상.

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()

문제 1 : 다른 애플리케이션은 HSV에 대해 다른 스케일을 사용합니다. 예를 들어 gimp는 H = 0-360, S = 0-100 and V = 0-100. 그러나 OpenCV는 H: 0-179, S: 0-255, V: 0-255. 여기에 김프에서 22의 색조 값이 있습니다. 그래서 나는 그것의 절반, 11, 그리고 그것에 대한 범위를 정의했습니다. (5,50,50) - (15,255,255).

문제 2 : 또한 OpenCV는 RGB가 아닌 BGR 형식을 사용합니다. 따라서 RGB를 HSV로 변환하는 코드를 다음과 같이 변경하십시오.

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

이제 실행하십시오. 다음과 같은 출력이 있습니다.

여기에 이미지 설명 입력

그것이 당신이 원했던 것이기를 바랍니다. 오 탐지가 있지만 크기가 작기 때문에 뚜껑 인 가장 큰 윤곽을 선택할 수 있습니다.

편집하다:

으로 칼 필립이 자신의 의견에 말했다, 새로운 코드를 추가하는 것이 좋을 것입니다. 그러나 한 줄만 변경됩니다. 그래서 새로운 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공간 에서 색상 찾기 는 오래되었지만 일반적인 질문입니다. hsv-colormap특별한 색상을 빨리 찾아 보도록 만들었 습니다. 여기있어:

여기에 이미지 설명 입력

x 축은 Hue[0,180), y 축 1은 Saturation[0,255], y 축 2는를 S = 255, 유지하면서 V = 255.

색상을 찾으려면 일반적으로 범위 H범위를 찾고 S범위 (20, 255)에 v를 설정합니다.

주황색을 찾기 위해지도를 찾고 최적의 범위를 찾습니다 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()

비슷한 답변 :

  1. 이미지에서 녹색 개체 만 감지하도록 임계 값을 정의하는 방법 : OpenCV

  2. InRangeS로 OpenCV 임계 값에 대한 올바른 HSV 값 선택


실시간으로 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()

OpenCV HSV 범위 : H : 0 ~ 179 S : 0 ~ 255 V : 0 ~ 255

Gimp (또는 기타 사진 조작 sw)에서 색조 범위는 0에서 360까지입니다. opencv는 단일 바이트에 색상 정보를 입력하기 때문에 단일 바이트의 최대 숫자 값은 255이므로 openCV 색조 값은 gimp의 색조 값을 2로 나눈 값과 같습니다. .

HSV 색상 공간을 기반으로 물체 감지를 시도 할 때 범위 5 (opencv 범위)가 특정 색상을 필터링하기에 충분하다는 것을 발견했습니다. 귀하의 응용 분야에 가장 적합한 범위를 파악하기 위해 HSV 색상 구개를 사용하는 것이 좋습니다.

HSV color palate with color detection in HSV space


Green의 HSV 값을 찾으려면 Python 터미널에서 다음 명령을 시도하십시오.

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

참고 URL : https://stackoverflow.com/questions/10948589/choosing-the-correct-upper-and-lower-hsv-boundaries-for-color-detection-withcv

반응형