🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

1603閲覧

pythonで赤色を認識する

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/25 08:23

https://qiita.com/odaman68000/items/ae28cf7bdaf4fa13a65b
上記のサイトで赤色を認識するプログラムが書いてあったのですが、RGBからHSVに変換するコードのところでHとSはあるのにVだけないのですが、なぜないのかがわかりません。まずHとSだけだとどのような色になるのかわかりません。
本当にプログラム初心者なので変な質問かもしれませんが教えていただけるとありがたいです。

import cv2 import numpy as np def find_rect_of_target_color(image): hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) h = hsv[:, :, 0] s = hsv[:, :, 1] mask = np.zeros(h.shape, dtype=np.uint8) mask[((h < 50) | (h > 200)) & (s > 100)] = 255 mask, contours, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) rects = [] for contour in contours: approx = cv2.convexHull(contour) rect = cv2.boundingRect(approx) rects.append(np.array(rect)) return rects capture = cv2.VideoCapture(0) while cv2.waitKey(30) < 0: _, frame = capture.read() rects = find_rect_of_target_color(frame) if len(rects) > 0: rect = max(rects, key=(lambda x: x[2] * x[3])) cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (0, 0, 255), thickness=2) cv2.imshow('red', frame) capture.release() cv2.destroyAllWindows()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/10/25 08:55

過去の質問は解決済みであれば、クローズしていただけますか。
退会済みユーザー

退会済みユーザー

2019/10/25 09:10

解決していません、色々、わからないことが多すぎて質問している状況です。
guest

回答4

0

ベストアンサー

snow1231さん、

HとSだけだとどのような色になるのかわかりません。

WikipediaのHSV色空間 に"HSV色空間の円錐" という図がありますが、HSVは、こんな感じで表現されてます。

  • 0<= H < 360 (単位 °) 色相
  • 0<= S <= 100 (単位 %) 彩度
  • 0<= V <= 100 (単位 %) 明度

Hがぐるりと回る感じで、色の種類がきまります。
Sが100%で外側の方、0%に近づくと中心に寄って行って、白(灰色?)っぽくなります。
Vは、明るさで、0%に近づくと、下の方にいって、暗くなっていきます。

これがわかると、Hで大体の色がきまるっぽい、というのがわかるんじゃないかな、と。
どのあたりまで、"赤色"にするか、という範囲は、使う人が決めることになる、と思います。
(広い範囲で赤を拾いたいのか、狭い範囲で拾うのかで、数値を決める)


ところで、おそらく、分かっている人からすると、以下の質問全部、解決策は基本的に同じに見えるんじゃないでしょうか。

"プログラム初心者"とはかかれてますが、画像処理に関しても初心者なのかな?そっちのほうも、もっと基本の説明も必要でしょうか。
質問するにも基本的な知識は必要なので、"色空間"とか、ちょいと勉強してみてください。

投稿2019/10/25 18:37

mt08

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

上記のサイトで赤色を認識するプログラムが書いてあったのですが、RGBからHSVに変換するコードのところでHとSはあるのにVだけないのですが、なぜないのかがわかりません。

色を数値で表現する際には色々な表現方法があります。
一番有名なのは RGB ですが、HSV もその1つです。

HSV では、色を色相 (H)、彩度 (S)、明度 (V) という3つの整数値 (0~255) で表現します。
今回のコードでは、HSV 色空間で (H < 50, H > 200, 100 < S <= 255, 0 <= V <= 255) の範囲を赤っぽい色であるとコードを書いた人が決めて、それを以下の部分で抽出しているわけです。
V の値は赤かどうか判定する際に使わないので、v = hsv[:, :, 2] とあえてスライスしていません。

python

1mask[((h < 50) | (h > 200)) & (s > 100)] = 255

実際に下のサイトで HSV を変化させたときに色がどう変化するのかを確認してみると、各H、S、V の効果がわかると思います。

RGBとHSV・HSBの相互変換ツールと変換計算式 - PEKO STEP

投稿2019/10/25 09:45

編集2019/10/25 09:51
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何を持って「赤だ」とするかの絶対的定義が存在しないならば,
【何の値を見て,それがどのくらいならば赤だと判断するのか?】は実装者のさじ加減であったり,【何のために「赤」を認識したいのか?】という目的に依存する話になるでしょう.

HとSはあるのにVだけないのですが、なぜないのかがわかりません。

単に,そのリンク先の話を書いた人物が,(自身がやりたいことを実現するために「赤」を見つけることに関して)「HとSだけで処理できると考えた」というだけではないでしょうか.

まずHとSだけだとどのような色になるのかわかりません。

あなたが「色の判定にはVも見るべきだ」と考えるならば,そのようにしてみれば良いだけの話ではないのでしょうか?

投稿2019/10/25 09:32

編集2019/10/25 09:33
fana

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2019/10/25 09:53

ざっくり言えば, HとSが計算上は不等号の条件を満たしているけども過度に明るすぎたり暗すぎたりする画素があるときに,その色を「赤って言うか,白とか黒と呼ぶべきだろもうコレ」とか何とか判定したいならばVも相応に見てやれば良い.
guest

0

コードのところでHとSはあるのにVだけないのですが、なぜないのかがわかりません

参照先で直接質問されたようなのでそちらの回答が楽しみなところですが、私の解釈では作者の用途ではHとSだけで赤色を判別するのに十分と考えたから(あるいは実験結果として十分であったから)、では。

極論Vが0であればHやSがなんであっても(HSVで200,255,0等)色としては黒(RGBでは0,0,0)なのですが、作者はそういうケースは「気にしない」としたのでしょう。OpenCVの実装上、Sが非常に小さいときにHやSが「赤」の領域にかぶらない、とかいうことなのかも知れません(私は確認していません)。

tiitoiさんがWebサイトを紹介されていますが、私はGIMPのカラーピッカーで確認することが多いです。スポイトツールで読み込んだ画の特定の場所のRGB/HSVを知ることもできます。


HとSだけだとどのような色になるのかわかりません

って、以前の質問の回答への返信中

H/S/Vのそれぞれの意味はわかっていますか?

と聞きましたけどやっぱりわかってない、のですね。解説を見てそれを読み上げることが「わかった」ではありません。試験で解答欄を埋めているわけじゃないのですから。自分がわかっていないことを認めないと、わかるようになることは出来ないんじゃないでしょうか?

それと。
プログラムは、あなたがコンピュータにやらせようとする仕事のやり方を書いた指示書です。その指示書を作成する作業がプログラミングです。
さて、あなたがわからないのは、プログラミングつまり指示書の書き方ですか? それともコンピュータにやらせる仕事そのものですか?
後者がわからないのなら、プログラム以前の問題なので、それを解決してからプログラムの話に進まないと何も出来ません。(現実には同時並行もあり得ますけれど)
今回であればHSVのどういう値の範囲を扱うかというのが仕事のポイントで、
HSVの意味がわからないこととプログラム初心者であることは別次元の問題だということ、わかりますか?

その辺をごっちゃにするから、前の質問のように、実はプログラムとは何の関係もないことを知りたいのにプログラムの話にしてしまって余計混乱することになっているように見えます。

投稿2019/10/26 02:29

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問