teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

d

2018/10/31 08:27

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -102,4 +102,28 @@
102
102
  rect = np.array([[170, 113], [167, 57], [317, 50], [319, 105]])
103
103
 
104
104
  print(within(point, rect)) # True
105
+ ```
106
+
107
+ ## 追記
108
+
109
+ とりあえず、定義した四角の中にボールの中心が入っている場合は赤色、入っていない場合は青色になるように、以下の関数を変更してみました。
110
+ rect の4点の座標値はラインに合わせて変えてください。
111
+
112
+ ```python
113
+ def displayCircle(image, ballList, thickness=5):
114
+ # ここはラインに合わせて変えてください。
115
+ rect = np.array([[170, 113], [167, 57], [317, 50], [319, 105]])
116
+
117
+ for i in range(len(ballList)):
118
+ x = int(ballList[i][0])
119
+ y = int(ballList[i][1])
120
+
121
+ if cv2.pointPolygonTest(rect, (x, y), False) >= 0:
122
+ # 線の中にボールの中心が入っている赤色で表示。
123
+ cv2.circle(image, (x, y), 10, (0, 0, 255), thickness)
124
+ else:
125
+ # 線の中にボールの中心が入っていない場合、青色で表示。
126
+ cv2.circle(image, (x, y), 10, (255, 0, 0), thickness)
127
+
128
+ return image
105
129
  ```

1

d

2018/10/31 08:27

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -84,4 +84,22 @@
84
84
  M = cv2.moments(cnt, False)
85
85
  x, y = int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])
86
86
  ball_pos.append([x, y])
87
+ ```
88
+
89
+ ## 追記
90
+
91
+ タプルで表現された点が4点で構成される四角に含まれるかどうかは以下で判定すればよいかと思います。
92
+
93
+ ```python
94
+ import cv2
95
+
96
+ def within(point, rect):
97
+ '''点 point が四角形 rect に含まれているかどうか
98
+ '''
99
+ return cv2.pointPolygonTest(rect, point, False) >= 0
100
+
101
+ point = (200, 100)
102
+ rect = np.array([[170, 113], [167, 57], [317, 50], [319, 105]])
103
+
104
+ print(within(point, rect)) # True
87
105
  ```