ホームページ > バックエンド開発 > Python チュートリアル > 「cv::inRange」を使用して OpenCV で色検出に最適な HSV 境界を効果的に選択する方法

「cv::inRange」を使用して OpenCV で色検出に最適な HSV 境界を効果的に選択する方法

Barbara Streisand
リリース: 2025-01-05 09:49:39
オリジナル
806 人が閲覧しました

How to Effectively Choose Optimal HSV Boundaries for Color Detection in OpenCV using `cv::inRange`?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート