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

質問編集履歴

5

修正

2017/07/13 08:04

投稿

Penefax
Penefax

スコア38

title CHANGED
File without changes
body CHANGED
File without changes

4

修正

2017/07/13 08:04

投稿

Penefax
Penefax

スコア38

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

3

追記

2017/07/13 07:41

投稿

Penefax
Penefax

スコア38

title CHANGED
File without changes
body CHANGED
@@ -11,35 +11,56 @@
11
11
  ###該当のソースコード
12
12
  ```Python
13
13
  #グラフ
14
+ # グラフの初期化
14
- d= genfromtxt("Planned.csv", delimiter=",")
15
+ def init_plot(d):
15
- fig = pyplot.figure(figsize=(16,9))
16
+ fig = plt.figure()
17
+ ax = fig.add_subplot(111, projection='3d')
16
18
 
17
- ax1 = fig.add_subplot(121, projection='3d')
18
- ax1.set_xlabel("X-axis")
19
+ ax.set_xlabel("X-axis")
19
- ax1.set_ylabel("Y-axis")
20
+ ax.set_ylabel("Y-axis")
20
- ax1.set_zlabel("Z-axis")
21
+ ax.set_zlabel("Z-axis")
21
- ax1.set_xlim(-30, 30)
22
+ ax.set_xlim(-30, 30)
22
- ax1.set_ylim(-40, 20)
23
+ ax.set_ylim(-40, 20)
23
- ax1.set_zlim(100, 200)
24
+ ax.set_zlim(100, 200)
24
- ax1.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5)
25
25
 
26
- ax2 = fig.add_subplot(222)
27
- ax2.set_xlabel('X-axis')
28
- ax2.set_ylabel('Y-axis')
29
- ax2.set_xlim(-30, 30)
26
+ # 最初に描画データを与えておく必要あり
30
- ax2.set_ylim(-40, 20)
31
- ax2.plot(d[:,0], d[:,1], "o", color="g", ms=24, mew=0.5)
27
+ l1, = ax.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5) # 初期データ用
28
+ l2, = ax.plot([0], [0], [0], "x", color="r", ms=8, mew=0.5) # 追加データ用 初回はダミーをセット
32
- ax2.grid(True)
29
+ return l1,l2 # 呼出元で利用
33
30
 
31
+ # グラフの描画更新
34
- ax3 = fig.add_subplot(224)
32
+ def update_plot(lines,d):
35
- ax3.set_xlabel('Z-axis')
33
+ lines.set_data(d[:,0],d[:,1]) # x,y
36
- ax3.set_ylabel('Y-axis')
34
+ lines.set_3d_properties(d[:,2]) # z
37
- ax3.set_xlim(100, 200)
38
- ax3.set_ylim(-40,20)
39
- ax3.plot(d[:,2], d[:,1], "o", color="g", ms=24, mew=0.5)
40
- ax3.grid(True)
35
+ plt.pause(.01)
41
36
 
37
+ if __name__ == "__main__":
38
+
39
+ # 最初から表示するデータ
40
+ d = genfromtxt("Planned.csv", delimiter=",")
41
+
42
+ # グラフの初期化
43
+ l1,l2 = init_plot(d) # l1=初期データ, l2=追加データ用
44
+ update_plot(l1,d)
45
+
46
+ time.sleep(1)
47
+
48
+ # データ追加し描画更新
49
+ a = np.array([[X,Y,Z]]) # 追加データ
50
+ update_plot(l2,a)
51
+
52
+ time.sleep(1)
53
+
42
-
54
+ # ループで
55
+ for i in range(113):
56
+ a = np.vstack((a,[X,Y,Z]))
57
+ update_plot(l2,a)
58
+
59
+ time.sleep(0.5)
60
+
61
+ # 最後に確認表示できるように
62
+ plt.show()
63
+
43
64
  # テンプレート画像読み込み
44
65
  img_obj = cv2.imread('1027.jpg', cv2.IMREAD_COLOR)
45
66
 
@@ -123,29 +144,7 @@
123
144
  Z = ((round(50/(l-50)*213,2)))
124
145
 
125
146
  追記
126
- def pause_plot():
127
- fig, ax = plt.subplots(1, 1)
128
-
129
- x4 = X
130
- y4 = Y
131
147
 
132
- scatter, = ax.plot(x4, y4, "x", color="r", ms=16, mew=0.5)
133
-
134
- while True:
135
- x4 = X
136
- y4 = Y
137
-
138
- scatter.set_data(x4, y4)
139
-
140
- ax.set_xlim(-30, 30)
141
- ax.set_ylim(-40, 20)
142
-
143
- plt.pause(.01)
144
-
145
- ax.grid(True)
146
-
147
- if __name__ == "__main__":
148
- pause_plot()
149
148
  ```
150
149
  このX,Y,Zをax1(X,Y,Z),ax2(X,Y),ax3(Y,Z)にプロットしたいです。
151
150
 

2

再追記

2017/07/11 05:34

投稿

Penefax
Penefax

スコア38

title CHANGED
File without changes
body CHANGED
@@ -7,7 +7,7 @@
7
7
  Using default event loop until function specific to this GUI is implemented
8
8
  warnings.warn(str, mplDeprecation)
9
9
  ```
10
- というエラーコードが出てしまいます。Planned.csvの乗った散布図に描画されるようにしたい。
10
+ というエラーコードが出てしまいます。
11
11
  ###該当のソースコード
12
12
  ```Python
13
13
  #グラフ
@@ -21,7 +21,6 @@
21
21
  ax1.set_xlim(-30, 30)
22
22
  ax1.set_ylim(-40, 20)
23
23
  ax1.set_zlim(100, 200)
24
-
25
24
  ax1.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5)
26
25
 
27
26
  ax2 = fig.add_subplot(222)
@@ -29,7 +28,6 @@
29
28
  ax2.set_ylabel('Y-axis')
30
29
  ax2.set_xlim(-30, 30)
31
30
  ax2.set_ylim(-40, 20)
32
-
33
31
  ax2.plot(d[:,0], d[:,1], "o", color="g", ms=24, mew=0.5)
34
32
  ax2.grid(True)
35
33
 
@@ -38,15 +36,84 @@
38
36
  ax3.set_ylabel('Y-axis')
39
37
  ax3.set_xlim(100, 200)
40
38
  ax3.set_ylim(-40,20)
41
-
42
39
  ax3.plot(d[:,2], d[:,1], "o", color="g", ms=24, mew=0.5)
43
40
  ax3.grid(True)
44
41
 
45
-
42
+ 再追記
43
+ # テンプレート画像読み込み
44
+ img_obj = cv2.imread('1027.jpg', cv2.IMREAD_COLOR)
45
+
46
+ if img_obj is None: # テンプレート画像が取得できない場合
47
+ print u'画像が取得できません。'
48
+ sys.exit()
49
+
50
+ # 映像取得(カメラ映像)
51
+ src = cv2.VideoCapture('0deg_10fps_x20 ver3.avi')
52
+
53
+ if not src.isOpened(): # カメラ映像が取得できない場合
54
+ print u'映像が取得できません。'
55
+ sys.exit()
56
+
57
+ retval, frame = src.read()
58
+ height1, width1, channels1 = img_obj.shape
59
+ height2, width2, channels2 = frame.shape
60
+
61
+ rec = cv2.VideoWriter('0deg_10fps_x20 改.avi', cv.CV_FOURCC('X','V','I','D'), 6, (width2, height2))
62
+
63
+ f = open('result.csv', 'ab') #csvファイルが無ければ作る、の'a'を指定します
64
+
65
+ csvWriter = csv.writer(f)
66
+ val = 0
67
+
68
+ while True:
69
+
70
+ retval, frame = src.read() # 1フレーム取得
71
+
72
+ if frame is None:
73
+ break
74
+
75
+ # テンプレート・マッチングにより相互相関係数を計算
76
+ img_ccoeff1 = cv2.matchTemplate(frame, img_obj, cv2.TM_CCOEFF_NORMED)
77
+
78
+ # [-1, 1] を [0, 1] へ
79
+ cv2.normalize(img_ccoeff1,img_ccoeff1, 0, 1, cv2.NORM_MINMAX)
80
+
81
+ # 相互相関係数の最小値・最大値とその座標を抽出
82
+ cMin, cMax, pMin, pMax1 = cv2.minMaxLoc(img_ccoeff1)
83
+
84
+ # 検出領域の中心座標
85
+ detect = (pMax1[0] + width1/2, pMax1[1] + height1/2)
86
+ 再追記終わり
87
+
88
+ x = pMax1[0] + width1/2, pMax1[1] + height1/2
89
+
46
90
  x1 = (((round(((pMax1[0] + width1/2)-385)*0.327,2))), (round(((pMax1[1] + height1/2)-290)*0.327,2)))
47
91
  x2 = (round(((pMax1[0] + width1/2)-385)*0.327,2))
48
92
  y2 = (round(((pMax1[1] + height1/2)-290)*0.327,2))
93
+
94
+
95
+ a = np.array([x2,y2])
96
+
97
+ text1 = "" + str(x1) + ""
98
+ text2 = "" + str(x2) + ""
99
+ text3 = "" + str(y2) + ""
100
+
101
+ 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)
102
+ 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)
103
+
104
+
105
+ # 探索画像から検出領域を抽出
106
+ img_crop = frame[pMax1[1]:pMax1[1]+height1, pMax1[0]:pMax1[0]+width1].copy()
49
107
 
108
+ # 検出領域に赤色の円と十字を描画
109
+ cv2.circle(frame, detect, width1/2, (0, 0, 255), 1)
110
+ 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)
111
+ 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)
112
+
113
+ x1 = (((round(((pMax1[0] + width1/2)-385)*0.327,2))), (round(((pMax1[1] + height1/2)-290)*0.327,2)))
114
+ x2 = (round(((pMax1[0] + width1/2)-385)*0.327,2))
115
+ y2 = (round(((pMax1[1] + height1/2)-290)*0.327,2))
116
+
50
117
  y1 = (round(((pMax2[0] + width1/2)-385)*0.327,2), round(((pMax2[1] + height1/2)-290)*0.327,2))
51
118
  x3 = (round(((pMax2[0] + width1/2)-385)*0.327,2))
52
119
  y3 = (round(((pMax2[1] + height1/2)-290)*0.327,2))
@@ -61,33 +128,18 @@
61
128
 
62
129
  x4 = X
63
130
  y4 = Y
64
- # 初期化的に一度plotしなければならない
131
+
65
- # そのときplotしたオブジェクトを受け取る必要がある.
66
- # listが返ってくるので,注意
67
132
  scatter, = ax.plot(x4, y4, "x", color="r", ms=16, mew=0.5)
68
133
 
69
- # ここから無限にplotする
70
134
  while True:
71
- # plotデータの更新
72
135
  x4 = X
73
136
  y4 = Y
74
-
75
- # 描画データを更新するときにplot関数を使うと
76
- # lineオブジェクトが都度増えてしまうので,注意
137
+
77
- # 一番楽なのは上記で受け取ったlinesに対して
78
- # set_data()メソッドで描画データを更新する方法.
79
138
  scatter.set_data(x4, y4)
80
139
 
81
- # set_data()を使うと軸とかは自動設定されないっぽいので,
82
- # 今回の例だとあっという間にsinカーブが描画範囲からいなくなる.
83
- # そのためx軸の範囲は適宜修正してやる必要がある.
84
140
  ax.set_xlim(-30, 30)
85
141
  ax.set_ylim(-40, 20)
86
142
 
87
- # 一番のポイント
88
- # - plt.show() ブロッキングされてリアルタイムに描写できない
89
- # - plt.ion() + plt.draw() グラフウインドウが固まってプログラムが止まるから使えない
90
- # ----> plt.pause(interval) これを使う!!! 引数はsleep時間
91
143
  plt.pause(.01)
92
144
 
93
145
  ax.grid(True)
@@ -102,7 +154,4 @@
102
154
  URL先ではsin関数を描画していますが、散布図でプロットしたいです。
103
155
 
104
156
  ###補足情報(言語/FW/ツール等のバージョンなど)
105
- windows10
106
- python2.7
107
- matplotlib
157
+ windows10,python2.7,matplotlib,spyder
108
- spyder

1

追記

2017/07/10 23:55

投稿

Penefax
Penefax

スコア38

title CHANGED
File without changes
body CHANGED
@@ -1,11 +1,13 @@
1
1
  ###前提・実現したいこと
2
2
  動画からテンプレートマッチングにより入力画像の中心座標を求めてそれを三角測量の式を用いてX,Y,Zを出しています。
3
- X,Y,Zを求める計算とほぼ時のタイミングでグラフにプロットされるようにしたい。
3
+ X,Y,Zを求める計算と同タイミングでグラフにプロットされるようにしたい。
4
4
 
5
5
  ###発生している問題・エラーメッセージ
6
6
  ```
7
+ Using default event loop until function specific to this GUI is implemented
7
- プロットされない。
8
+ warnings.warn(str, mplDeprecation)
8
9
  ```
10
+ というエラーコードが出てしまいます。Planned.csvの乗った散布図に描画されるようにしたい。
9
11
  ###該当のソースコード
10
12
  ```Python
11
13
  #グラフ
@@ -40,7 +42,7 @@
40
42
  ax3.plot(d[:,2], d[:,1], "o", color="g", ms=24, mew=0.5)
41
43
  ax3.grid(True)
42
44
 
43
- #三角測量
45
+
44
46
  x1 = (((round(((pMax1[0] + width1/2)-385)*0.327,2))), (round(((pMax1[1] + height1/2)-290)*0.327,2)))
45
47
  x2 = (round(((pMax1[0] + width1/2)-385)*0.327,2))
46
48
  y2 = (round(((pMax1[1] + height1/2)-290)*0.327,2))
@@ -52,11 +54,52 @@
52
54
  X = (round((50/(l-50))*((x2 + x3)/2),2))
53
55
  Y = (round((50/(l-50))*((y2 + y3)/2),2))
54
56
  Z = ((round(50/(l-50)*213,2)))
57
+
58
+ 追記
59
+ def pause_plot():
60
+ fig, ax = plt.subplots(1, 1)
61
+
62
+ x4 = X
63
+ y4 = Y
64
+ # 初期化的に一度plotしなければならない
65
+ # そのときplotしたオブジェクトを受け取る必要がある.
66
+ # listが返ってくるので,注意
67
+ scatter, = ax.plot(x4, y4, "x", color="r", ms=16, mew=0.5)
68
+
69
+ # ここから無限にplotする
70
+ while True:
71
+ # plotデータの更新
72
+ x4 = X
73
+ y4 = Y
74
+
75
+ # 描画データを更新するときにplot関数を使うと
76
+ # lineオブジェクトが都度増えてしまうので,注意.
77
+ # 一番楽なのは上記で受け取ったlinesに対して
78
+ # set_data()メソッドで描画データを更新する方法.
79
+ scatter.set_data(x4, y4)
80
+
81
+ # set_data()を使うと軸とかは自動設定されないっぽいので,
82
+ # 今回の例だとあっという間にsinカーブが描画範囲からいなくなる.
83
+ # そのためx軸の範囲は適宜修正してやる必要がある.
84
+ ax.set_xlim(-30, 30)
85
+ ax.set_ylim(-40, 20)
86
+
87
+ # 一番のポイント
88
+ # - plt.show() ブロッキングされてリアルタイムに描写できない
89
+ # - plt.ion() + plt.draw() グラフウインドウが固まってプログラムが止まるから使えない
90
+ # ----> plt.pause(interval) これを使う!!! 引数はsleep時間
91
+ plt.pause(.01)
92
+
93
+ ax.grid(True)
94
+
95
+ if __name__ == "__main__":
96
+ pause_plot()
55
97
  ```
56
98
  このX,Y,Zをax1(X,Y,Z),ax2(X,Y),ax3(Y,Z)にプロットしたいです。
57
99
 
58
100
  ###試したこと
101
+ [matplotlibでリアルタイム描画](http://qiita.com/hausen6/items/b1b54f7325745ae43e47)を参考にしてコードを考えてみましたが上手くいきませんでした。
59
- 色々、定義したりそれ変えたりもましたが上手くせんでした。
102
+ URL先ではsin関数描画いますが、散布図プロットしたいです
60
103
 
61
104
  ###補足情報(言語/FW/ツール等のバージョンなど)
62
105
  windows10