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

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

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

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

Python

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

Q&A

解決済

1回答

2338閲覧

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

xxxxxxx

総合スコア50

OpenCV

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

Python

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

0グッド

1クリップ

投稿2019/01/07 12:12

python

1import cv2 2import numpy as np 3import matplotlib.pyplot as plt 4from matplotlib.patches import Polygon 5 6#赤 7def find_rect_of_target_color1(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 < 20) & (h > 200)) & (s > 128)] = 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_color2(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 > 50) & (h < 70)) & (s > 150)] = 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_color3(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_color4(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 > 80) & (h < 140)) & (s > 150)] = 102 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('./front.jpg') 73 img = cv2.imread('./sample.jpg') 74 75 #赤 76 rects1 = find_rect_of_target_color1(img) 77 if len(rects1) > 0: 78 rect = max(rects1, key=(lambda x: x[2] * x[3])) 79 cv2.rectangle(img, tuple(rect[0:2]), 80 tuple(rect[0:2] + rect[2:4]), (0, 0, 255), thickness=2) 81 # B G R 82 #黄 83 rects2 = find_rect_of_target_color2(img) 84 if len(rects2) > 0: 85 rect = max(rects2, key=(lambda x: x[2] * x[3])) 86 cv2.rectangle(img, tuple(rect[0:2]), 87 tuple(rect[0:2] + rect[2:4]), (0, 255, 255), thickness=2) 88 89 #青 90 rects3 = find_rect_of_target_color3(img) 91 if len(rects3) > 0: 92 rect = max(rects3, key=(lambda x: x[2] * x[3])) 93 cv2.rectangle(img, tuple(rect[0:2]), 94 tuple(rect[0:2] + rect[2:4]), (255, 0, 0), thickness=2) 95 96 #緑 97 rects4 = find_rect_of_target_color4(img) 98 if len(rects4) > 0: 99 rect = max(rects4, key=(lambda x: x[2] * x[3])) 100 cv2.rectangle(img, tuple(rect[0:2]), 101 tuple(rect[0:2] + rect[2:4]), (0, 255, 0), thickness=2) 102 103 104cv2.imshow('findrect', img) 105k = cv2.waitKey(0) 106if k == ord('q'): 107 cv2.destroyAllWindows() 108 if k == ord('s'): 109 cv2.imwrite("./findrect.jpg", img) 110 cv2.destroyAllWindows() 111

上記のコードで用意した画像(下記)からそれぞれの色を検出し、外接矩形を表示するプログラムを作成しています。現段階で実行するとなぜか緑の正方形のみに外接矩形が表示されるようになっています。4つそれぞれの値を調節してみましたがうまくいきません。
どなたかわかる方いらっしゃいましたらご教授願いたく思います。
使用画像

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

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

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

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

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

guest

回答1

0

ベストアンサー

hsv画像に変換する際にCOLOR_BGR2HSV_FULLを指定しているので,hは0255の値を取ります.ご確認されたhの値は0359の範囲での値ではないでしょうか.その場合はその値を360で割って255をかけて0~255の範囲になるようにしてください。

投稿2019/01/07 15:30

Takaya901

総合スコア181

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

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

xxxxxxx

2019/01/08 00:53

できました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問