99

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

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

9 に答える 9

161

問題 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)

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

于 2012-06-08T14:52:21.197 に答える
31

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()
于 2014-09-25T16:58:13.983 に答える
7

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

Gimp (または他の写真操作ソフトウェア) では、色相の範囲は 0 から 360 です。opencv は色情報を 1 バイトに格納するため、1 バイトの最大数値は 255 であるため、openCV の色相値は、gimp の色相値を 2 で割った値に相当します。 .

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

HSV空間での色検出によるHSVカラーパレット

于 2017-03-01T00:27:55.303 に答える
1

GIMP または PaintDotNet を使用して、HSV の正確な範囲を取得できます。しかし問題は、グラフィックス ソフトウェアの HSV 範囲が OpenCV の同じ範囲と異なることです。そのため、これを修正する関数が必要です。この目的のために、次の関数を使用できます。

def fixHSVRange(h, s, v):
    # Normal H,S,V: (0-360,0-100%,0-100%)
    # OpenCV H,S,V: (0-180,0-255 ,0-255)
    return (180 * h / 360, 255 * s / 100, 255 * v / 100)

ここに画像の説明を入力

たとえば、次のように使用できます。

im=cv2.imread("image.jpg",1)
im_hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
color1 = fixHSVRange(h=10, s=20, v=0)
color2 = fixHSVRange(h=30, s=70, v=100)
mask = cv2.inRange(im_hsv, color1, color2)
cv2.imwrite("mask.jpg",mask)

ここに画像の説明を入力

于 2021-05-07T10:19:57.683 に答える