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

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

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

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

Python

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

解決済

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

xxxxxxx
xxxxxxx

総合スコア0

OpenCV

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

Python

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

1回答

0評価

0クリップ

32閲覧

投稿2019/01/04 12:43

編集2022/01/12 10:58

python

import cv2 import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Polygon #赤 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 == 60) & (s == 255)] = 255 #輪郭抽出 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) rects1 = [] for contour in contours: approx = cv2.convexHull(contour) rect = cv2.boundingRect(approx) rects1.append(np.array(rect)) return rects1 #黄 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 == 60) & (s == 225)] = 42 #輪郭抽出 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) rects2 = [] for contour in contours: approx = cv2.convexHull(contour) rect = cv2.boundingRect(approx) rects2.append(np.array(rect)) return rects2 #青 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 > 220) | (h < 260)) & (s > 150)] = 255 #輪郭抽出 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) rects3 = [] for contour in contours: approx = cv2.convexHull(contour) rect = cv2.boundingRect(approx) rects3.append(np.array(rect)) return rects3 #緑 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 > 100) | (h < 140)) & (s > 150)] = 85 #輪郭抽出 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) rects4 = [] for contour in contours: approx = cv2.convexHull(contour) rect = cv2.boundingRect(approx) rects4.append(np.array(rect)) return rects4 if __name__ == "__main__": img = cv2.imread('./sample.jpg') #赤 rects1 = find_rect_of_target_color(img) if len(rects1) > 0: rect = max(rects1, key=(lambda x: x[2] * x[3])) cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (0, 0, 255), thickness=2) #黄 rects2 = find_rect_of_target_color(img) if len(rects2) > 0: rect = max(rects2, key=(lambda x: x[2] * x[3])) cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (0, 255, 255), thickness=2)   #青 rects3 = find_rect_of_target_color(img) if len(rects3) > 0: rect = max(rects3, key=(lambda x: x[2] * x[3])) cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (255, 0, 0), thickness=2) #緑 rects4 = find_rect_of_target_color(img) if len(rects4) > 0: rect = max(rects4, key=(lambda x: x[2] * x[3])) cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (0, 255, 0), thickness=2) cv2.imshow('findrect', img) k = cv2.waitKey(0) if k == ord('q'): cv2.destroyAllWindows() if k == ord('s'): cv2.imwrite("./findrect.jpg", img) cv2.destroyAllWindows()

画像の各HSV値
三角 :(60,255,255)
半円 :(60,225,255)
長方形:(40,111,199)
正方形:(82,181,255)

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

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

Python

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