cv::inRange (OpenCV) を使用した色検出のための正しい HSV 境界の正しい上限と下限の選択
OpenCV の cv::inRange 関数では、HSV (色相、彩度、値) 色空間。これにより、正確な色検出が保証され、効率的なセグメンテーションが可能になります。
問題:
コーヒー缶のオレンジ色の蓋を含む画像を考えてみましょう。 gcolor2 ユーティリティを使用して取得した、蓋の中央の HSV 値は (22, 59, 100) です。 min = (18, 40, 90) および max = (27, 255, 255) として定義された初期境界を使用すると、予期しない検出結果が発生しました。
解決策:
問題 1: HSV 範囲の変動
異なる多くの場合、アプリケーションでは HSV 値に異なるスケールが使用されます。たとえば、GIMP は H: 0 ~ 360、S: 0 ~ 100、V: 0 ~ 100 のスケールを使用しますが、OpenCV は H: 0 ~ 179、S: 0 ~ 255、V: 0 ~ 255 を使用します。この場合、GIMP の色相値 22 は、値の半分を取得して OpenCV の 11 に変換される必要があります。したがって、修正された境界は (5, 50, 50) - (15, 255, 255) になります。
問題 2: 色空間の互換性
OpenCV は BGR を採用しています(青-緑-赤) カラー形式。RGB ではありません。互換性を確保するには、RGB を HSV に変換するコードを次のように変更する必要があります:
cv.CvtColor(frame, frameHSV, cv.CV_BGR2HSV)
更新コード:
import cv in_image = 'kaffee.png' out_image = 'kaffee_out.png' out_image_thr = 'kaffee_thr.png' ORANGE_MIN = cv.Scalar(5, 50, 50) ORANGE_MAX = cv.Scalar(15, 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_BGR2HSV) 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()
結果:
更新されたコードを実行すると、オレンジのより正確なセグメンテーションが得られます。蓋。
注:
背景の色合いが似ているため、小さな誤検出が発生する可能性があります。これに対処するには、輪郭分析などのさらなる処理を適用して、まぶたに対応する最大の輪郭を分離できます。
以上がOpenCV で正確な色検出を行うために正しい HSV の上限と下限を選択するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。