web-dev-qa-db-ja.com

`cv :: inRange`(OpenCV)を使用した色検出のための正しいHSV境界の上限と下限の選択

オレンジ色の蓋の位置を見つけたいコーヒー缶の画像があります。はい、これ image

gcolor2ユーティリティは、ふたの中央のHSVが(22、59、100)であることを示します。問題は、色の限界をどのように選択するかです。最小=(18、40、90)および最大=(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 __== '__main__':
    test1()
65
Student FourK

問題1:アプリケーションが異なればHSVのスケールも異なります。たとえば、gimpはH = 0-360, S = 0-100 and V = 0-100を使用します。ただし、OpenCVはH: 0-179, S: 0-255, V: 0-255を使用します。ここでは、gimpで22の色相値を取得しました。そのため、半分の11を取り、その範囲を定義しました。すなわち(5,50,50) - (15,255,255)

問題2:また、OpenCVはRGBではなくBGR形式を使用します。したがって、RGBをHSVに変換するコードを次のように変更します。

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

今すぐ実行します。次のような出力が得られました。

enter image description here

それがあなたが望んでいたことを願っています。いくつかの誤検出がありますが、それらは小さいため、蓋である最大の輪郭を選択できます。

編集:

Karl Philipが彼のコメントで述べたように、新しいコードを追加するのは良いことです。ただし、1行のみの変更があります。したがって、新しい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)

上記と同じ結果が得られます。しかし、コードははるかに簡単です。

128
Abid Rahman K

わかりました。HSVスペースで色を見つけることは古いですが、よくある質問です。 hsv-colormapを作成して、特別な色をすばやく検索しました。ここにあります:

enter image description here

X軸は[0,180)でHueを表し、y軸1は[0,255]でSaturationを表し、y軸2はS = 255を表し、V = 255を保持します。

色を見つけるには、通常HSの範囲を検索し、vをrange(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. InRangeSを使用したOpenCVしきい値の正しいHSV値の選択

26
Kinght 金

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

OpenCV HSVの範囲:H:0から179 S:0から255 V:0から255

Gimp(または他の写真操作sw)のHueの範囲は0から360です。opencvは1バイトに色情報を入れるため、1バイトの最大数の値は255です。したがって、openCV Hue値はgimpのHue値を2で割った値に相当します。 。

HSV色空間に基づいてオブジェクト検出を行おうとしたときに、特定の色を除外するには5の範囲(opencvの範囲)で十分であることがわかりました。 HSVカラー口蓋を使用して、アプリケーションに最適な範囲を把握することをお勧めします。

HSV color palate with color detection in HSV space

3
sami dalati

GreenのHSV値を見つけるには、Pythonターミナルで次のコマンドを試してください。

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