質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

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

Python

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

Q&A

解決済

1回答

961閲覧

画像から特定色を認識し範囲の外接矩形を取り囲む

xxxxxxx

総合スコア50

OpenCV

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

Python

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

0グッド

0クリップ

投稿2019/01/04 12:43

編集2019/01/07 04:27

python

1import cv2 2import numpy as np 3import matplotlib.pyplot as plt 4from matplotlib.patches import Polygon 5 6#赤 7def find_rect_of_target_color(image): 8 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) 9 h = hsv[:, :, 0] 10 s = hsv[:, :, 1] 11 mask = np.zeros(h.shape, dtype=np.uint8) 12 mask[(h == 60) & (s == 255)] = 255 13 #輪郭抽出 14 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 15 16 rects1 = [] 17 for contour in contours: 18 approx = cv2.convexHull(contour) 19 rect = cv2.boundingRect(approx) 20 rects1.append(np.array(rect)) 21 return rects1 22 23#黄 24def find_rect_of_target_color(image): 25 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) 26 h = hsv[:, :, 0] 27 s = hsv[:, :, 1] 28 mask = np.zeros(h.shape, dtype=np.uint8) 29 mask[(h == 60) & (s == 225)] = 42 30 #輪郭抽出 31 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 32 rects2 = [] 33 for contour in contours: 34 approx = cv2.convexHull(contour) 35 rect = cv2.boundingRect(approx) 36 rects2.append(np.array(rect)) 37 return rects2 38 39#青 40def find_rect_of_target_color(image): 41 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) 42 h = hsv[:, :, 0] 43 s = hsv[:, :, 1] 44 mask = np.zeros(h.shape, dtype=np.uint8) 45 mask[((h > 220) | (h < 260)) & (s > 150)] = 255 46 #輪郭抽出 47 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 48 rects3 = [] 49 for contour in contours: 50 approx = cv2.convexHull(contour) 51 rect = cv2.boundingRect(approx) 52 rects3.append(np.array(rect)) 53 return rects3 54 55#緑 56def find_rect_of_target_color(image): 57 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV_FULL) 58 h = hsv[:, :, 0] 59 s = hsv[:, :, 1] 60 mask = np.zeros(h.shape, dtype=np.uint8) 61 mask[((h > 100) | (h < 140)) & (s > 150)] = 85 62 #輪郭抽出 63 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 64 rects4 = [] 65 for contour in contours: 66 approx = cv2.convexHull(contour) 67 rect = cv2.boundingRect(approx) 68 rects4.append(np.array(rect)) 69 return rects4 70 71if __name__ == "__main__": 72 img = cv2.imread('./sample.jpg') 73 74 #赤 75 rects1 = find_rect_of_target_color(img) 76 if len(rects1) > 0: 77 rect = max(rects1, key=(lambda x: x[2] * x[3])) 78 cv2.rectangle(img, tuple(rect[0:2]), 79 tuple(rect[0:2] + rect[2:4]), (0, 0, 255), thickness=2) 80 81 #黄 82 rects2 = find_rect_of_target_color(img) 83 if len(rects2) > 0: 84 rect = max(rects2, key=(lambda x: x[2] * x[3])) 85 cv2.rectangle(img, tuple(rect[0:2]), 86 tuple(rect[0:2] + rect[2:4]), (0, 255, 255), thickness=2) 87 88  #青 89 rects3 = find_rect_of_target_color(img) 90 if len(rects3) > 0: 91 rect = max(rects3, key=(lambda x: x[2] * x[3])) 92 cv2.rectangle(img, tuple(rect[0:2]), 93 tuple(rect[0:2] + rect[2:4]), (255, 0, 0), thickness=2) 94 95 #緑 96 rects4 = find_rect_of_target_color(img) 97 if len(rects4) > 0: 98 rect = max(rects4, key=(lambda x: x[2] * x[3])) 99 cv2.rectangle(img, tuple(rect[0:2]), 100 tuple(rect[0:2] + rect[2:4]), (0, 255, 0), thickness=2) 101 102cv2.imshow('findrect', img) 103k = cv2.waitKey(0) 104if k == ord('q'): 105 cv2.destroyAllWindows() 106 if k == ord('s'): 107 cv2.imwrite("./findrect.jpg", img) 108 cv2.destroyAllWindows() 109

画像の各H値
三角 :(0)
半円 :(61)
長方形:(221)
正方形:(147)

現在、上記のコードで入力画像の図形を色によって認識し、外接矩形を表示するプログラムの作成を行なっております。方法としては、入力画像をhsv画像に変換し、H成分とS成分を指定することでそれぞれの図形を認識するようになっています。しかしこれを実行すると全ての矩形が赤い三角形の周りに表示されるようになってしまい、値を調節してみましたがダメでした。下記の参考サイトをもとに画像版を作ろうと思っているのですが、うまくいきません。どなたかこの問題の解決方法を教えていただきたく質問させていただきました。よろしくお願いいたします。参考サイト

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

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

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

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

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

guest

回答1

0

ベストアンサー

同じ名前の関数find_rect_of_target_colorが4つ定義されているので,実行時に最後に定義された緑用のfind_rect_of_target_colorがその他の3つを上書きしてしまい,main関数内で4色ともそれを呼び出しています.色ごとに関数名を変えるか,引数で色情報を渡して関数内で分岐させてください.

それと,緑用のfind_rect_of_target_color内で(h > 100) | (h < 140)と書かれていますが,これだとすべてのhが該当します.そのせいで複数の図形が検出され,その中で面積が最大の三角形に矩形が集まってしまうのだと思います.

投稿2019/01/04 14:21

Takaya901

総合スコア181

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

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

xxxxxxx

2019/01/07 01:59

返信遅れて申し訳ありません。各変数に数字を加え、実行してみたのですが結果は変わらず、、でした。それと緑の範囲(100 < h < 140)で全てhが該当するというのはどういうことでしょうか?値を変えてもこれまた同じく全ての矩形が三角形のみに表示されてしまいます。
Takaya901

2019/01/07 03:58

(100 < h < 140)を表現するなら(h > 100) & (h < 140)です.100より大きいまたは140より小さい,ではなく100より大きいかつ140より小さい,なので. 参考サイトのコメント欄にある画像を使っておられるならば,質問内に書かれているHSVの値は間違っている気がします.赤(三角)のHは60ではなくもっと小さいはずです. imshowで表示した画像にマウスオーバーするとRGB値が表示されると思うので,その値をWebツールなどで変換して正確な値(値の範囲に注意)を調べてみてください.
xxxxxxx

2019/01/07 04:25

確かに、|と&を勘違いしておりました。それと質問内の値も全て間違っておりました。編集させていただきます、失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問