質問編集履歴
4
プログラムを修正しました。
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
|
-
|
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
プログラムを修正しました。
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
|
-
|
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
プログラムを修正しました。
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
プログラムを修正しました。
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]]],
|
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から削除
|