OpenCV の cv::inRange を使用した色検出のための最適な HSV 境界の選択
画像処理タスクでは、多くの場合、オブジェクトに基づいてオブジェクトを検出する必要があります。彼らの色について。この目的のために、OpenCV では cv::inRange 関数が一般的に使用され、指定された HSV カラー範囲内のピクセルを識別します。ただし、適切な HSV 境界を選択することは、特にさまざまなアプリケーションがさまざまな HSV スケールとカラー形式を使用する場合に困難になることがあります。
問題:
オレンジを検出するシナリオを考えてみましょう。コーヒー缶の蓋のイメージ。 gimp ツールを使用すると、蓋の中心の HSV 値は (22、59、100) であることがわかりました。ただし、HSV 範囲 (18、40、90) ~ (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) の場合、その半分 (11) を取得し、それに応じて範囲を調整する必要があります。これは、(5, 50, 50) - (15, 255, 255) の新しい HSV 範囲に変換されます。
解決策 2: BGR 形式に変換する
追加、OpenCV は RGB ではなく BGR カラー形式を使用することを考慮することが重要です。したがって、Python コードでは、cv::CV_RGB2HSV 変換を cv::CV_BGR2HSV に置き換える必要があります。
これらの変更を実装することで、検出アルゴリズムの結果が改善されるはずです。軽度の誤検出が依然として発生する可能性がありますが、最大の輪郭は蓋に対応するはずです。
OpenCV 2 による改良された Python コード:
import cv2 in_image = 'kaffee.png' out_image = 'kaffee_out.png' out_image_thr = 'kaffee_thr.png' ORANGE_MIN = np.array([5, 50, 50], np.uint8) ORANGE_MAX = np.array([15, 255, 255], np.uint8) def test1(): frame = cv2.imread(in_image) frameHSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) frame_threshed = cv2.inRange(frameHSV, ORANGE_MIN, ORANGE_MAX) cv2.imwrite(out_image_thr, frame_threshed) if __name__ == '__main__': test1()
強化された Python OpenCV 4 でのコード:
import cv2 import numpy as np in_image = 'kaffee.png' out_image = 'kaffee_out.png' out_image_thr = 'kaffee_thr.png' ORANGE_MIN = np.array([5, 50, 50], np.uint8) ORANGE_MAX = np.array([15, 255, 255], np.uint8) def test1(): frame = cv2.imread(in_image) frameHSV = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) frame_threshed = cv2.inRange(frameHSV, ORANGE_MIN, ORANGE_MAX) cv2.imwrite(out_image_thr, frame_threshed) if __name__ == '__main__': test1()
の使用これらの更新されたコードにより、コーヒー缶の画像上のオレンジ色の蓋を正確に検出することが可能になります。
以上が「cv::inRange」を使用して OpenCV で色検出に最適な HSV 境界を効果的に選択する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。