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

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

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

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

Python

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

Q&A

1回答

4640閲覧

描写した長方形内に点が入っているかどうかのプログラム

ysr0826

総合スコア5

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/01/27 11:38

現在,描写した長方形内に点が入っているかどうかのプログラムを構築しています.
画像処理後,輪郭抽出により得た長方形の座標を使用しています.
作成したプログラムでは以下のような結果が得られます.

このプログラムを改良し,点の座標をランダムに表示していき,各長方形に点が何回入ったのかを表示するようにしたいと思っています.
例えば
rect1 point 3 count
rect2 point 4 count
rect3 point 0 count
rect4 point 1 count
のように,図の左上からソートした各長方形に対し,最終的に何回点が入ったか表示したいと思っております.
どのようにプログラムを改良すればよいのでしょうか.

まだまだプログラミングを始めたばかりなので,どなたかご教授いただけないでしょうか.
よろしくお願いいたします.

処理後
rect does not contains point 0.
rect does not contains point 0.
rect does not contains point 0.
rect contains point 000.


Python

1# findContours(輪郭抽出) 2contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 3# 対象物の面積の大きさでフィルタリング 4rects = [] 5for cnt, hrchy in zip(contours, hierarchy[0]): 6# 面積が4000より小さいものは除く 7 if cv2.contourArea(cnt) < 4000: 8 continue 9# 面積が7800より大きいものは除く 10  if cv2.contourArea(cnt) > 7800: 11 continue 12#ルードノートは除く 13 if hrchy[3] == -1: 14 continue 15# 輪郭を囲む長方形を計算する。 16 rect = cv2.minAreaRect(cnt) 17#cv2.boxPoints() で長方形の座標を取得 18 rect_points = cv2.boxPoints(rect).astype(int) 19 rects.append(rect_points) 20# x-y 順でソート 21rects = sorted(rects, key=lambda x: (x[0][1], x[0][0])) 22######################################## 23# p1 対象物の座標 24p1 = (396, 294) 25# 点 point が四角形 rect に含まれているかどうか定義 26def within(point, rect): 27 '''点 point が四角形 rect に含まれているかどうか 28 ''' 29 return cv2.pointPolygonTest(rect, point, False) >= 0 30fig, ax = plt.subplots() 31#x座標 32ax.set_xlim([0, 650]) 33#y座標 34ax.set_ylim([500, 0]) 35# 描画する。 36for i, rect in enumerate(rects): 37#長方形を描画 38 ax.add_patch(Polygon(rect, fill=False))39 40 for i, point in enumerate([p1, p2]): 41 # テキストを描画する。 42 ax.text(*point, 'line {}'.format(i), fontsize=12) 43#点が四角形に含まれていたら 44 if within(point, rect): 45# 点を描画する 46 plt.plot([point[0]], [point[1]], marker='o', markersize=3, color="blue")47 print('rect contains point {0:03}.'.format(i)) 48 else: 49#点が四角形に含まれていなかったら 50 plt.plot([point[0]], [point[1]], marker='o', markersize=3, color="red") # 点を描画する。 51 print('rect does not contains point {}.'.format(i)) 52plt.show()

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/27 21:27

何にどう困っているのか明記した方が良いと思います。また、コードもimport cv2くらいから書き、張り付けたら手元で同じように動く状態のコードの方が回答が得られやすいです。
guest

回答1

0

ここが気になります

点 point が四角形 rect に含まれているかどうか定義

def within(point, rect):
'''点 point が四角形 rect に含まれているかどうか
return cv2.pointPolygonTest(rect, point, False) >= 0

pointPolygonTestはマイナス値なら領域の内側となるはず
なのに pointPolygonTest() >= 0 これではプラスの値(外側)の場合のみ
Trueにはるはず <= では?

投稿2020/01/28 00:13

yukiyuki123456

総合スコア130

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問