現在,描写した長方形内に点が入っているかどうかのプログラムを構築しています.
画像処理後,輪郭抽出により得た長方形の座標を使用しています.
作成したプログラムでは以下のような結果が得られます.
このプログラムを改良し,点の座標をランダムに表示していき,各長方形に点が何回入ったのかを表示するようにしたいと思っています.
例えば
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()