オレンジ色の蓋の位置を見つけたいコーヒー缶の画像があります。はい、これ 。
gcolor2ユーティリティは、ふたの中央のHSVが(22、59、100)であることを示します。問題は、色の限界をどのように選択するかです。最小=(18、40、90)および最大=(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 __== '__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
を使用します。ここでは、gimpで22の色相値を取得しました。そのため、半分の11を取り、その範囲を定義しました。すなわち(5,50,50) - (15,255,255)
。
問題2:また、OpenCVはRGBではなくBGR形式を使用します。したがって、RGBをHSVに変換するコードを次のように変更します。
cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)
今すぐ実行します。次のような出力が得られました。
それがあなたが望んでいたことを願っています。いくつかの誤検出がありますが、それらは小さいため、蓋である最大の輪郭を選択できます。
編集:
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)
上記と同じ結果が得られます。しかし、コードははるかに簡単です。
わかりました。HSV
スペースで色を見つけることは古いですが、よくある質問です。 hsv-colormap
を作成して、特別な色をすばやく検索しました。ここにあります:
X軸は[0,180)でHue
を表し、y軸1は[0,255]でSaturation
を表し、y軸2はS = 255
を表し、V = 255
を保持します。
色を見つけるには、通常H
とS
の範囲を検索し、vをrange(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()
同様の回答:
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()
GreenのHSV値を見つけるには、Pythonターミナルで次のコマンドを試してください。
green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print hsv_green
[[[ 60 255 255]]]