[解決済み] cv::inRange` を用いた色検出において,HSV の上下の境界を正しく選択する方法 (OpenCV)
質問
オレンジ色の蓋をしたコーヒー缶の画像を探したい。 以下はそれである .
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()
どのように解決するのですか?
問題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)
では、実行してみましょう。以下のように出力されました。
ご希望に添えたでしょうか?誤検出はありますが、小さいので、一番大きい輪郭を選べばいいと思います。
編集中です。
として
カール・フィリップ
がコメントで述べているように、新しいコードを追加するのは良いことでしょう。しかし、たった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)
上記と同じ結果になります。しかし、コードはよりシンプルになります。
関連
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] Pythonで0xを使わずにhex()を使うには?
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] バブルソートの宿題
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法