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

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

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

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

Python

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

Q&A

解決済

1回答

688閲覧

表示した外接矩形の詳細情報を求める

xxxxxxx

総合スコア50

OpenCV

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

Python

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

0グッド

0クリップ

投稿2019/01/08 04:04

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 v = hsv[:, :, 2] 12 mask = np.zeros(h.shape, dtype=np.uint8) 13 mask[(h > 240) & (s > 100) & (v > 100)] = 251 14 #輪郭抽出 15 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 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 v = hsv[:, :, 2] 29 mask = np.zeros(h.shape, dtype=np.uint8) 30 mask[((h > 20) & (h < 40)) & (s > 100) & (v > 200)] = 30 31 #輪郭抽出 32 _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 33 rects2 = [] 34 for contour in contours: 35 approx = cv2.convexHull(contour) 36 rect = cv2.boundingRect(approx) 37 rects2.append(np.array(rect)) 38 return rects2 39 40if __name__ == "__main__": 41 img = cv2.imread('./sample.jpg') 42 43 #赤 44 rects1 = find_rect_of_target_color1(img) 45 if len(rects1) > 0: 46 rect = max(rects1, key=(lambda x: x[2] * x[3])) 47 cv2.rectangle(img, tuple(rect[0:2]), 48 tuple(rect[0:2] + rect[2:4]), (0, 0, 255), 2) 49 # B G R 50 #黄 51 rects2 = find_rect_of_target_color2(img) 52 if len(rects2) > 0: 53 rect = max(rects2, key=(lambda x: x[2] * x[3])) 54 cv2.rectangle(img, tuple(rect[0:2]), 55 tuple(rect[0:2] + rect[2:4]), (0, 255, 255), 2) 56 57cv2.imshow('findrect', img) 58k = cv2.waitKey(0) 59if k == ord('q'): 60 cv2.destroyAllWindows() 61

上記は画像をHSV変換して特定色の外接矩形を表示するプログラムになります。
表示した外接矩形の縦の長さと横の長さ、面積とアスペクト比を計算するコードを追加したいのですが、いまいちわかりません。
様々なサイトを参考にして実行してみましたがpython初心者なものでコンパイルエラーが多数出てしまいます。
どなたか解決方法がわかる方いらっしゃいましたらご教授願います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ソースコードを見る限り、各外接矩形にてrect[2]が幅、rect[3]が高さのようなので

Python

1w,h = rect[2],rect[3] # 幅と高さ 2a = w*h # 面積 3ar = w/h# アスペクト比

でよいかと思います。

投稿2019/01/08 04:21

can110

総合スコア38262

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

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

xxxxxxx

2019/01/08 06:13

できました!それと求めたそれらの値を画像内の外接矩形の下に表示させたいのですが、矩形のどこかの座標がわからなくて困っています。。
can110

2019/01/08 06:19 編集

rect[1]が矩形の左上のy座標のようなので、それにhを足すと矩形下辺のy座標になります。x座標はrect[0]のままでよいでしょう。 実際に紙に描いてみると理解しやすいかと思います。
xxxxxxx

2019/01/08 06:45

大変わかりやすい回答ありがとうございました! なんとか思った通りにできました。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問