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

質問編集履歴

4

プログラムを修正しました。

2019/01/11 06:22

投稿

chachamaru0421
chachamaru0421

スコア17

title CHANGED
File without changes
body CHANGED
@@ -48,7 +48,7 @@
48
48
  #xとyの座標を返す関数
49
49
  def getPos(self):
50
50
  return (self.mouseEvent["x"], self.mouseEvent["y"])
51
-
51
+
52
52
  #取得した座標から特徴点を取得する
53
53
  class Motion:
54
54
  #コンストラクタ
@@ -92,7 +92,7 @@
92
92
  mouseData.getPos()
93
93
  print(mouseData.getX())
94
94
  print(mouseData.getY())
95
-          self.onMouse(mouseData.getX(),mouseData.getY(),mouseData.getPos())
95
+ self.onMouse(mouseData.getX(),mouseData.getY(),mouseData.getPos())
96
96
  #右クリックがあったら終了
97
97
  elif mouseData.getEvent() == cv2.EVENT_RBUTTONDOWN:
98
98
  break;
@@ -233,6 +233,7 @@
233
233
  self.status = np.delete(self.status, i, 0)
234
234
  i -= 1
235
235
  i += 1
236
+
236
237
  if __name__ == '__main__':
237
238
  Motion().run()
238
239
  ```

3

プログラムを修正しました。

2019/01/11 06:22

投稿

chachamaru0421
chachamaru0421

スコア17

title CHANGED
File without changes
body CHANGED
@@ -91,7 +91,8 @@
91
91
  mouseData.getY()
92
92
  mouseData.getPos()
93
93
  print(mouseData.getX())
94
+ print(mouseData.getY())
94
- print(mouseData.getY()) self.onMouse(mouseData.getX(),mouseData.getY(),mouseData.getPos())
95
+          self.onMouse(mouseData.getX(),mouseData.getY(),mouseData.getPos())
95
96
  #右クリックがあったら終了
96
97
  elif mouseData.getEvent() == cv2.EVENT_RBUTTONDOWN:
97
98
  break;
@@ -232,6 +233,8 @@
232
233
  self.status = np.delete(self.status, i, 0)
233
234
  i -= 1
234
235
  i += 1
236
+ if __name__ == '__main__':
237
+ Motion().run()
235
238
  ```
236
239
 
237
240
  ### 実行結果例

2

プログラムを修正しました。

2019/01/11 06:19

投稿

chachamaru0421
chachamaru0421

スコア17

title CHANGED
File without changes
body CHANGED
@@ -48,7 +48,7 @@
48
48
  #xとyの座標を返す関数
49
49
  def getPos(self):
50
50
  return (self.mouseEvent["x"], self.mouseEvent["y"])
51
-
51
+
52
52
  #取得した座標から特徴点を取得する
53
53
  class Motion:
54
54
  #コンストラクタ
@@ -72,35 +72,9 @@
72
72
  #特徴点のステータス(一番最初の画像で取得した特徴点)
73
73
  self.status_src = None
74
74
  #特徴点(一番最初の画像で取得した特徴点)
75
- self.features_src = None
76
-
77
- #取得した座標から特徴点を取得する
78
- class Motion:
79
- #コンストラクタ
80
- def __init__(self):
81
- #表示ウィンドウ(特徴点追跡用)
82
- cv2.namedWindow("motion")
83
- #表示ウィンドウ(特徴点指定用)
84
- cv2.namedWindow("input window")
85
- #インターバル
86
- self.interval = INTERVAL
87
- #現在のフレーム(カラー)
88
- self.frame = None
89
- #現在のフレーム(グレー)
90
- self.gray_next = None
91
- #前回のフレーム(グレー)
92
- self.gray_prev = None
93
- #特徴点
94
- self.features = None
95
- #特徴点のステータス
96
- self.status = None
97
- #特徴点のステータス(一番最初の画像で取得した特徴点)
98
- self.status_src = None
99
- #特徴点(一番最初の画像で取得した特徴点)
100
75
  self.features_src = None
101
76
  #メインループ
102
- def run(self):
77
+ def run(self):
103
- n = 1
104
78
  #最初のフレームの処理
105
79
  self.frame = cv2.imread("IMG_1.tiff")
106
80
  self.gray_prev = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY)

1

プログラムを修正しました。

2019/01/11 06:15

投稿

chachamaru0421
chachamaru0421

スコア17

title CHANGED
File without changes
body CHANGED
@@ -97,15 +97,16 @@
97
97
  #特徴点のステータス(一番最初の画像で取得した特徴点)
98
98
  self.status_src = None
99
99
  #特徴点(一番最初の画像で取得した特徴点)
100
- self.features_src = None
100
+ self.features_src = None
101
101
  #メインループ
102
102
  def run(self):
103
+ n = 1
103
104
  #最初のフレームの処理
104
105
  self.frame = cv2.imread("IMG_1.tiff")
105
106
  self.gray_prev = cv2.cvtColor(self.frame, cv2.COLOR_BGR2GRAY)
106
- self.gray_next = cv2.cvtColor(self.frame,cv2.COLOR_BGR2GRAY)
107
+ self.gray_next = cv2.cvtColor(self.frame,cv2.COLOR_BGR2GRAY)
107
108
  #最初の特徴点10点を指定
108
- cv2.imshow("input window",self.frame)
109
+ cv2.imshow("input window",self.frame)
109
110
  #コールバックの設定
110
111
  mouseData = mouseParam("input window")
111
112
  while 1:
@@ -116,11 +117,13 @@
116
117
  mouseData.getY()
117
118
  mouseData.getPos()
118
119
  print(mouseData.getX())
119
- print(mouseData.getY())
120
- self.onMouse(mouseData.getX(),mouseData.getY(),mouseData.getPos())
120
+ print(mouseData.getY()) self.onMouse(mouseData.getX(),mouseData.getY(),mouseData.getPos())
121
+ #右クリックがあったら終了
122
+ elif mouseData.getEvent() == cv2.EVENT_RBUTTONDOWN:
123
+ break;
121
124
  #特徴点描画と10点の特徴点を取得
122
125
  if self.features is not None:
123
- if len(self.features) >= 10:
126
+ if len(self.features) >= 10:
124
127
  #オプティカルフローの計算
125
128
  features_prev = self.features
126
129
  #グレースケールに変換
@@ -135,17 +138,18 @@
135
138
  criteria = CRITERIA, \
136
139
  flags = 0)
137
140
  #有効な特徴点のみ残す
138
- self.refreshFeatures()
141
+ self.refreshFeatures()
139
- #最初の特徴点を格納しておく
140
142
  if len(self.features) >= 10:
143
+ #最初の特徴点を格納しておく
141
144
  self.status_src = self.status
142
145
  self.features_src = self.features
143
- print("特徴点10個取得出来ました")
146
+ print("特徴点10個取得出来ました")
144
- break;
147
+ break;
145
148
  #画像毎の特徴点を抽出し、追跡する
146
- for frame in range(2,FRAME):
149
+ for frame in range(2,FRAME):
147
150
  #グレースケールに変換
148
151
  self.gray_next = cv2.cvtColor(self.frame,cv2.COLOR_BGR2GRAY)
152
+ #self.gray_next = self.frame
149
153
  #特徴点が登録されている場合にOpticalFlowを計算
150
154
  if self.features is not None:
151
155
  #オプティカルフローの計算
@@ -160,11 +164,11 @@
160
164
  criteria = CRITERIA, \
161
165
  flags = 0)
162
166
  #有効な特徴点のみ残す
163
- self.refreshFeatures()
167
+ self.refreshFeatures()
164
168
  #フレームに有効な特徴点を描画
165
169
  if self.features is not None:
166
170
  for features in self.features:
167
- cv2.circle(self.frame,(features[0][0],features[0][1]),2,(15,241,255),-1,8,0)
171
+ cv2.circle(self.frame,(features[0][0],features[0][1]),2,(15,241,255),-1,8,0)
168
172
  #表示
169
173
  cv2.imshow("motion",self.frame)
170
174
  #次のループ処理の準備
@@ -176,6 +180,8 @@
176
180
  #終了処理
177
181
  cv2.destroyAllWindows()
178
182
  #マウスクリックで特徴点を指定する
183
+ #クリックされた近傍に既存の特徴点がある場合は既存の特徴点を削除する
184
+ #クリックされた近傍に既存の特徴点がない場合は新規特徴点を追加する
179
185
  def onMouse(self,x,y,XY):
180
186
  #最初の特徴点追加
181
187
  if self.features is None:
@@ -183,6 +189,7 @@
183
189
  return
184
190
  #クリック点がすでに取得済みの座標点であれば追加しない
185
191
  for click in self.features:
192
+ #print(click)
186
193
  if np.all(click == XY):
187
194
  return
188
195
  #探索半径(pixel)
@@ -219,13 +226,13 @@
219
226
  index += 1
220
227
  #全ての特徴点が指定された半径の外側にある
221
228
  print("feature is out of radius")
222
- return -1
229
+ return -1
223
230
  # 特徴点を新規に追加する
224
231
  def addFeature(self, x, y):
225
232
  # 特徴点が未登録
226
233
  if self.features is None:
227
234
  # ndarrayの作成し特徴点の座標を登録
228
- self.features = np.array([[[x, y]]], np.float32)
235
+ self.features = np.array([[[x, y]]],np.float32)
229
236
  self.status = np.array([1])
230
237
  # 特徴点を高精度化
231
238
  cv2.cornerSubPix(self.gray_next, self.features, (10, 10), (-1, -1), CRITERIA)
@@ -235,7 +242,7 @@
235
242
  self.features = np.append(self.features, [[[x, y]]], axis = 0).astype(np.float32)
236
243
  self.status = np.append(self.status, 1)
237
244
  # 特徴点を高精度化
238
- cv2.cornerSubPix(self.gray_next, self.features, (10, 10), (-1, -1), CRITERIA)
245
+ cv2.cornerSubPix(self.gray_next, self.features, (10, 10), (-1, -1), CRITERIA)
239
246
  # 有効な特徴点のみ残す
240
247
  def refreshFeatures(self):
241
248
  # 特徴点が未登録
@@ -243,7 +250,7 @@
243
250
  return
244
251
  # 全statusをチェックする
245
252
  i = 0
246
- while i < len(self.features):
253
+ while i < len(self.features):
247
254
  # 特徴点として認識できず
248
255
  if self.status[i] == 0:
249
256
  # 既存のndarrayから削除