質問編集履歴

5

修正

2017/07/13 08:04

投稿

Penefax
Penefax

スコア38

test CHANGED
File without changes
test CHANGED
File without changes

4

修正

2017/07/13 08:04

投稿

Penefax
Penefax

スコア38

test CHANGED
@@ -1 +1 @@
1
- 動的に得られる関数のプロット(3次元、2次元)
1
+ real time plot
test CHANGED
File without changes

3

追記

2017/07/13 07:41

投稿

Penefax
Penefax

スコア38

test CHANGED
File without changes
test CHANGED
@@ -24,63 +24,105 @@
24
24
 
25
25
  #グラフ
26
26
 
27
- d= genfromtxt("Planned.csv", delimiter=",")
28
-
29
- fig = pyplot.figure(figsize=(16,9))
30
-
31
-
32
-
33
- ax1 = fig.add_subplot(121, projection='3d')
34
-
35
- ax1.set_xlabel("X-axis")
36
-
37
- ax1.set_ylabel("Y-axis")
38
-
39
- ax1.set_zlabel("Z-axis")
40
-
41
- ax1.set_xlim(-30, 30)
42
-
43
- ax1.set_ylim(-40, 20)
44
-
45
- ax1.set_zlim(100, 200)
46
-
47
- ax1.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5)
48
-
49
-
50
-
51
- ax2 = fig.add_subplot(222)
52
-
53
- ax2.set_xlabel('X-axis')
54
-
55
- ax2.set_ylabel('Y-axis')
56
-
57
- ax2.set_xlim(-30, 30)
58
-
59
- ax2.set_ylim(-40, 20)
60
-
61
- ax2.plot(d[:,0], d[:,1], "o", color="g", ms=24, mew=0.5)
62
-
63
- ax2.grid(True)
64
-
65
-
66
-
67
- ax3 = fig.add_subplot(224)
68
-
69
- ax3.set_xlabel('Z-axis')
70
-
71
- ax3.set_ylabel('Y-axis')
72
-
73
- ax3.set_xlim(100, 200)
74
-
75
- ax3.set_ylim(-40,20)
76
-
77
- ax3.plot(d[:,2], d[:,1], "o", color="g", ms=24, mew=0.5)
78
-
79
- ax3.grid(True)
80
-
81
-
82
-
83
- 再追記
27
+ # グラフの初期化
28
+
29
+ def init_plot(d):
30
+
31
+ fig = plt.figure()
32
+
33
+ ax = fig.add_subplot(111, projection='3d')
34
+
35
+
36
+
37
+ ax.set_xlabel("X-axis")
38
+
39
+ ax.set_ylabel("Y-axis")
40
+
41
+ ax.set_zlabel("Z-axis")
42
+
43
+ ax.set_xlim(-30, 30)
44
+
45
+ ax.set_ylim(-40, 20)
46
+
47
+ ax.set_zlim(100, 200)
48
+
49
+
50
+
51
+ # 最初に描画データを与えておく必要あり
52
+
53
+ l1, = ax.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5) # 初期データ用
54
+
55
+ l2, = ax.plot([0], [0], [0], "x", color="r", ms=8, mew=0.5) # 追加データ用 初回はダミーをセット
56
+
57
+ return l1,l2 # 呼出元で利用
58
+
59
+
60
+
61
+ # グラフの描画更新
62
+
63
+ def update_plot(lines,d):
64
+
65
+ lines.set_data(d[:,0],d[:,1]) # x,y
66
+
67
+ lines.set_3d_properties(d[:,2]) # z
68
+
69
+ plt.pause(.01)
70
+
71
+
72
+
73
+ if __name__ == "__main__":
74
+
75
+
76
+
77
+ # 最初から表示するデータ
78
+
79
+ d = genfromtxt("Planned.csv", delimiter=",")
80
+
81
+
82
+
83
+ # グラフの初期化
84
+
85
+ l1,l2 = init_plot(d) # l1=初期データ, l2=追加データ用
86
+
87
+ update_plot(l1,d)
88
+
89
+
90
+
91
+ time.sleep(1)
92
+
93
+
94
+
95
+ # データ追加し描画更新
96
+
97
+ a = np.array([[X,Y,Z]]) # 追加データ
98
+
99
+ update_plot(l2,a)
100
+
101
+
102
+
103
+ time.sleep(1)
104
+
105
+
106
+
107
+ # ループで追加
108
+
109
+ for i in range(113):
110
+
111
+ a = np.vstack((a,[X,Y,Z]))
112
+
113
+ update_plot(l2,a)
114
+
115
+
116
+
117
+ time.sleep(0.5)
118
+
119
+
120
+
121
+ # 最後に確認表示できるように
122
+
123
+ plt.show()
124
+
125
+
84
126
 
85
127
  # テンプレート画像読み込み
86
128
 
@@ -248,51 +290,7 @@
248
290
 
249
291
  追記
250
292
 
251
- def pause_plot():
293
+
252
-
253
- fig, ax = plt.subplots(1, 1)
254
-
255
-
256
-
257
- x4 = X
258
-
259
- y4 = Y
260
-
261
-
262
-
263
- scatter, = ax.plot(x4, y4, "x", color="r", ms=16, mew=0.5)
264
-
265
-
266
-
267
- while True:
268
-
269
- x4 = X
270
-
271
- y4 = Y
272
-
273
-
274
-
275
- scatter.set_data(x4, y4)
276
-
277
-
278
-
279
- ax.set_xlim(-30, 30)
280
-
281
- ax.set_ylim(-40, 20)
282
-
283
-
284
-
285
- plt.pause(.01)
286
-
287
-
288
-
289
- ax.grid(True)
290
-
291
-
292
-
293
- if __name__ == "__main__":
294
-
295
- pause_plot()
296
294
 
297
295
  ```
298
296
 

2

再追記

2017/07/11 05:34

投稿

Penefax
Penefax

スコア38

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ```
18
18
 
19
- というエラーコードが出てしまいます。Planned.csvの乗った散布図に描画されるようにしたい。
19
+ というエラーコードが出てしまいます。
20
20
 
21
21
  ###該当のソースコード
22
22
 
@@ -44,8 +44,6 @@
44
44
 
45
45
  ax1.set_zlim(100, 200)
46
46
 
47
-
48
-
49
47
  ax1.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5)
50
48
 
51
49
 
@@ -60,8 +58,6 @@
60
58
 
61
59
  ax2.set_ylim(-40, 20)
62
60
 
63
-
64
-
65
61
  ax2.plot(d[:,0], d[:,1], "o", color="g", ms=24, mew=0.5)
66
62
 
67
63
  ax2.grid(True)
@@ -78,15 +74,107 @@
78
74
 
79
75
  ax3.set_ylim(-40,20)
80
76
 
81
-
82
-
83
77
  ax3.plot(d[:,2], d[:,1], "o", color="g", ms=24, mew=0.5)
84
78
 
85
79
  ax3.grid(True)
86
80
 
87
81
 
88
82
 
89
-
83
+ 再追記
84
+
85
+ # テンプレート画像読み込み
86
+
87
+ img_obj = cv2.imread('1027.jpg', cv2.IMREAD_COLOR)
88
+
89
+
90
+
91
+ if img_obj is None: # テンプレート画像が取得できない場合
92
+
93
+ print u'画像が取得できません。'
94
+
95
+ sys.exit()
96
+
97
+
98
+
99
+ # 映像取得(カメラ映像)
100
+
101
+ src = cv2.VideoCapture('0deg_10fps_x20 ver3.avi')
102
+
103
+
104
+
105
+ if not src.isOpened(): # カメラ映像が取得できない場合
106
+
107
+ print u'映像が取得できません。'
108
+
109
+ sys.exit()
110
+
111
+
112
+
113
+ retval, frame = src.read()
114
+
115
+ height1, width1, channels1 = img_obj.shape
116
+
117
+ height2, width2, channels2 = frame.shape
118
+
119
+
120
+
121
+ rec = cv2.VideoWriter('0deg_10fps_x20 改.avi', cv.CV_FOURCC('X','V','I','D'), 6, (width2, height2))
122
+
123
+
124
+
125
+ f = open('result.csv', 'ab') #csvファイルが無ければ作る、の'a'を指定します
126
+
127
+
128
+
129
+ csvWriter = csv.writer(f)
130
+
131
+ val = 0
132
+
133
+
134
+
135
+ while True:
136
+
137
+
138
+
139
+ retval, frame = src.read() # 1フレーム取得
140
+
141
+
142
+
143
+ if frame is None:
144
+
145
+ break
146
+
147
+
148
+
149
+ # テンプレート・マッチングにより相互相関係数を計算
150
+
151
+ img_ccoeff1 = cv2.matchTemplate(frame, img_obj, cv2.TM_CCOEFF_NORMED)
152
+
153
+
154
+
155
+ # [-1, 1] を [0, 1] へ
156
+
157
+ cv2.normalize(img_ccoeff1,img_ccoeff1, 0, 1, cv2.NORM_MINMAX)
158
+
159
+
160
+
161
+ # 相互相関係数の最小値・最大値とその座標を抽出
162
+
163
+ cMin, cMax, pMin, pMax1 = cv2.minMaxLoc(img_ccoeff1)
164
+
165
+
166
+
167
+ # 検出領域の中心座標
168
+
169
+ detect = (pMax1[0] + width1/2, pMax1[1] + height1/2)
170
+
171
+ 再追記終わり
172
+
173
+
174
+
175
+ x = pMax1[0] + width1/2, pMax1[1] + height1/2
176
+
177
+
90
178
 
91
179
  x1 = (((round(((pMax1[0] + width1/2)-385)*0.327,2))), (round(((pMax1[1] + height1/2)-290)*0.327,2)))
92
180
 
@@ -94,6 +182,52 @@
94
182
 
95
183
  y2 = (round(((pMax1[1] + height1/2)-290)*0.327,2))
96
184
 
185
+
186
+
187
+
188
+
189
+ a = np.array([x2,y2])
190
+
191
+
192
+
193
+ text1 = "" + str(x1) + ""
194
+
195
+ text2 = "" + str(x2) + ""
196
+
197
+ text3 = "" + str(y2) + ""
198
+
199
+
200
+
201
+ cv2.putText(frame, text1, ((pMax1[0] + width1/2)-65, (pMax1[1] + height1/2)-30), cv2.FONT_HERSHEY_COMPLEX, 0.7, (0, 255, 0), 2, cv2.CV_AA)
202
+
203
+ cv2.putText(frame, "L1", ((pMax1[0] + width1/2)-70, (pMax1[1] + height1/2)-60), cv2.FONT_HERSHEY_COMPLEX, 0.7, (0, 255, 0), 2, cv2.CV_AA)
204
+
205
+
206
+
207
+
208
+
209
+ # 探索画像から検出領域を抽出
210
+
211
+ img_crop = frame[pMax1[1]:pMax1[1]+height1, pMax1[0]:pMax1[0]+width1].copy()
212
+
213
+
214
+
215
+ # 検出領域に赤色の円と十字を描画
216
+
217
+ cv2.circle(frame, detect, width1/2, (0, 0, 255), 1)
218
+
219
+ cv2.line(frame,((pMax1[0] + width1/2) - 25, pMax1[1] + height1/2), ((pMax1[0] + width1/2) + 25 , pMax1[1] + height1/2), (0, 0, 255), 1)
220
+
221
+ cv2.line(frame,((pMax1[0] + width1/2), (pMax1[1] + height1/2 )-25), ((pMax1[0] + width1/2), (pMax1[1] + height1/2) + 25), (0, 0, 255), 1)
222
+
223
+
224
+
225
+ x1 = (((round(((pMax1[0] + width1/2)-385)*0.327,2))), (round(((pMax1[1] + height1/2)-290)*0.327,2)))
226
+
227
+ x2 = (round(((pMax1[0] + width1/2)-385)*0.327,2))
228
+
229
+ y2 = (round(((pMax1[1] + height1/2)-290)*0.327,2))
230
+
97
231
 
98
232
 
99
233
  y1 = (round(((pMax2[0] + width1/2)-385)*0.327,2), round(((pMax2[1] + height1/2)-290)*0.327,2))
@@ -124,60 +258,30 @@
124
258
 
125
259
  y4 = Y
126
260
 
127
- # 初期化的に一度plotしなければならない
261
+
128
-
129
- # そのときplotしたオブジェクトを受け取る必要がある.
130
-
131
- # listが返ってくるので,注意
132
262
 
133
263
  scatter, = ax.plot(x4, y4, "x", color="r", ms=16, mew=0.5)
134
264
 
135
265
 
136
266
 
137
- # ここから無限にplotする
138
-
139
267
  while True:
140
268
 
141
- # plotデータの更新
142
-
143
269
  x4 = X
144
270
 
145
271
  y4 = Y
146
272
 
147
-
148
-
149
- # 描画データを更新するときにplot関数を使うと
150
-
151
- # lineオブジェクトが都度増えてしまうので,注意
273
+
152
-
153
- # 一番楽なのは上記で受け取ったlinesに対して
154
-
155
- # set_data()メソッドで描画データを更新する方法.
156
274
 
157
275
  scatter.set_data(x4, y4)
158
276
 
159
277
 
160
278
 
161
- # set_data()を使うと軸とかは自動設定されないっぽいので,
162
-
163
- # 今回の例だとあっという間にsinカーブが描画範囲からいなくなる.
164
-
165
- # そのためx軸の範囲は適宜修正してやる必要がある.
166
-
167
279
  ax.set_xlim(-30, 30)
168
280
 
169
281
  ax.set_ylim(-40, 20)
170
282
 
171
283
 
172
284
 
173
- # 一番のポイント
174
-
175
- # - plt.show() ブロッキングされてリアルタイムに描写できない
176
-
177
- # - plt.ion() + plt.draw() グラフウインドウが固まってプログラムが止まるから使えない
178
-
179
- # ----> plt.pause(interval) これを使う!!! 引数はsleep時間
180
-
181
285
  plt.pause(.01)
182
286
 
183
287
 
@@ -206,10 +310,4 @@
206
310
 
207
311
  ###補足情報(言語/FW/ツール等のバージョンなど)
208
312
 
209
- windows10
210
-
211
- python2.7
212
-
213
- matplotlib
313
+ windows10,python2.7,matplotlib,spyder
214
-
215
- spyder

1

追記

2017/07/10 23:55

投稿

Penefax
Penefax

スコア38

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  動画からテンプレートマッチングにより入力画像の中心座標を求めてそれを三角測量の式を用いてX,Y,Zを出しています。
4
4
 
5
- X,Y,Zを求める計算とほぼ時のタイミングでグラフにプロットされるようにしたい。
5
+ X,Y,Zを求める計算と同タイミングでグラフにプロットされるようにしたい。
6
6
 
7
7
 
8
8
 
@@ -10,10 +10,14 @@
10
10
 
11
11
  ```
12
12
 
13
+ Using default event loop until function specific to this GUI is implemented
14
+
13
- プロットされない。
15
+ warnings.warn(str, mplDeprecation)
14
16
 
15
17
  ```
16
18
 
19
+ というエラーコードが出てしまいます。Planned.csvの乗った散布図に描画されるようにしたい。
20
+
17
21
  ###該当のソースコード
18
22
 
19
23
  ```Python
@@ -82,7 +86,7 @@
82
86
 
83
87
 
84
88
 
85
- #三角測量
89
+
86
90
 
87
91
  x1 = (((round(((pMax1[0] + width1/2)-385)*0.327,2))), (round(((pMax1[1] + height1/2)-290)*0.327,2)))
88
92
 
@@ -106,6 +110,86 @@
106
110
 
107
111
  Z = ((round(50/(l-50)*213,2)))
108
112
 
113
+
114
+
115
+ 追記
116
+
117
+ def pause_plot():
118
+
119
+ fig, ax = plt.subplots(1, 1)
120
+
121
+
122
+
123
+ x4 = X
124
+
125
+ y4 = Y
126
+
127
+ # 初期化的に一度plotしなければならない
128
+
129
+ # そのときplotしたオブジェクトを受け取る必要がある.
130
+
131
+ # listが返ってくるので,注意
132
+
133
+ scatter, = ax.plot(x4, y4, "x", color="r", ms=16, mew=0.5)
134
+
135
+
136
+
137
+ # ここから無限にplotする
138
+
139
+ while True:
140
+
141
+ # plotデータの更新
142
+
143
+ x4 = X
144
+
145
+ y4 = Y
146
+
147
+
148
+
149
+ # 描画データを更新するときにplot関数を使うと
150
+
151
+ # lineオブジェクトが都度増えてしまうので,注意.
152
+
153
+ # 一番楽なのは上記で受け取ったlinesに対して
154
+
155
+ # set_data()メソッドで描画データを更新する方法.
156
+
157
+ scatter.set_data(x4, y4)
158
+
159
+
160
+
161
+ # set_data()を使うと軸とかは自動設定されないっぽいので,
162
+
163
+ # 今回の例だとあっという間にsinカーブが描画範囲からいなくなる.
164
+
165
+ # そのためx軸の範囲は適宜修正してやる必要がある.
166
+
167
+ ax.set_xlim(-30, 30)
168
+
169
+ ax.set_ylim(-40, 20)
170
+
171
+
172
+
173
+ # 一番のポイント
174
+
175
+ # - plt.show() ブロッキングされてリアルタイムに描写できない
176
+
177
+ # - plt.ion() + plt.draw() グラフウインドウが固まってプログラムが止まるから使えない
178
+
179
+ # ----> plt.pause(interval) これを使う!!! 引数はsleep時間
180
+
181
+ plt.pause(.01)
182
+
183
+
184
+
185
+ ax.grid(True)
186
+
187
+
188
+
189
+ if __name__ == "__main__":
190
+
191
+ pause_plot()
192
+
109
193
  ```
110
194
 
111
195
  このX,Y,Zをax1(X,Y,Z),ax2(X,Y),ax3(Y,Z)にプロットしたいです。
@@ -114,7 +198,9 @@
114
198
 
115
199
  ###試したこと
116
200
 
201
+ [matplotlibでリアルタイム描画](http://qiita.com/hausen6/items/b1b54f7325745ae43e47)を参考にしてコードを考えてみましたが上手くいきませんでした。
202
+
117
- 色々、定義したりそれ変えたりもしましたが上手くきませんした
203
+ URL先ではsin関数描画ていすが、散布図でプロットしたいで
118
204
 
119
205
 
120
206