質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

2160閲覧

real time plot

Penefax

総合スコア38

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

1クリップ

投稿2017/07/08 07:34

編集2017/07/13 08:04

###前提・実現したいこと
動画からテンプレートマッチングにより入力画像の中心座標を求めてそれを三角測量の式を用いてX,Y,Zを出しています。
X,Y,Zを求める計算と同じタイミングでグラフにプロットされるようにしたい。

###発生している問題・エラーメッセージ

Using default event loop until function specific to this GUI is implemented warnings.warn(str, mplDeprecation)

というエラーコードが出てしまいます。
###該当のソースコード

Python

1#グラフ 2# グラフの初期化 3def init_plot(d): 4 fig = plt.figure() 5 ax = fig.add_subplot(111, projection='3d') 6 7 ax.set_xlabel("X-axis") 8 ax.set_ylabel("Y-axis") 9 ax.set_zlabel("Z-axis") 10 ax.set_xlim(-30, 30) 11 ax.set_ylim(-40, 20) 12 ax.set_zlim(100, 200) 13 14 # 最初に描画データを与えておく必要あり 15 l1, = ax.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5) # 初期データ用 16 l2, = ax.plot([0], [0], [0], "x", color="r", ms=8, mew=0.5) # 追加データ用 初回はダミーをセット 17 return l1,l2 # 呼出元で利用 18 19# グラフの描画更新 20def update_plot(lines,d): 21 lines.set_data(d[:,0],d[:,1]) # x,y 22 lines.set_3d_properties(d[:,2]) # z 23 plt.pause(.01) 24 25if __name__ == "__main__": 26 27 # 最初から表示するデータ 28 d = genfromtxt("Planned.csv", delimiter=",") 29 30 # グラフの初期化 31 l1,l2 = init_plot(d) # l1=初期データ, l2=追加データ用 32 update_plot(l1,d) 33 34 time.sleep(1) 35 36 # データ追加し描画更新 37 a = np.array([[X,Y,Z]]) # 追加データ 38 update_plot(l2,a) 39 40 time.sleep(1) 41 42 # ループで追加 43 for i in range(113): 44 a = np.vstack((a,[X,Y,Z])) 45 update_plot(l2,a) 46 47 time.sleep(0.5) 48 49 # 最後に確認表示できるように 50 plt.show() 51 52# テンプレート画像読み込み 53img_obj = cv2.imread('1027.jpg', cv2.IMREAD_COLOR) 54 55if img_obj is None: # テンプレート画像が取得できない場合 56 print u'画像が取得できません。' 57 sys.exit() 58 59# 映像取得(カメラ映像) 60src = cv2.VideoCapture('0deg_10fps_x20 ver3.avi') 61 62if not src.isOpened(): # カメラ映像が取得できない場合 63 print u'映像が取得できません。' 64 sys.exit() 65 66retval, frame = src.read() 67height1, width1, channels1 = img_obj.shape 68height2, width2, channels2 = frame.shape 69 70rec = cv2.VideoWriter('0deg_10fps_x20 改.avi', cv.CV_FOURCC('X','V','I','D'), 6, (width2, height2)) 71 72f = open('result.csv', 'ab') #csvファイルが無ければ作る、の'a'を指定します 73 74csvWriter = csv.writer(f) 75val = 0 76 77while True: 78 79 retval, frame = src.read() # 1フレーム取得 80 81 if frame is None: 82 break 83 84 # テンプレート・マッチングにより相互相関係数を計算 85 img_ccoeff1 = cv2.matchTemplate(frame, img_obj, cv2.TM_CCOEFF_NORMED) 86 87 # [-1, 1] を [0, 1] へ 88 cv2.normalize(img_ccoeff1,img_ccoeff1, 0, 1, cv2.NORM_MINMAX) 89 90 # 相互相関係数の最小値・最大値とその座標を抽出 91 cMin, cMax, pMin, pMax1 = cv2.minMaxLoc(img_ccoeff1) 92 93 # 検出領域の中心座標 94 detect = (pMax1[0] + width1/2, pMax1[1] + height1/2) 95再追記終わり 96 97 x = pMax1[0] + width1/2, pMax1[1] + height1/2 98 99 x1 = (((round(((pMax1[0] + width1/2)-385)*0.327,2))), (round(((pMax1[1] + height1/2)-290)*0.327,2))) 100 x2 = (round(((pMax1[0] + width1/2)-385)*0.327,2)) 101 y2 = (round(((pMax1[1] + height1/2)-290)*0.327,2)) 102 103 104 a = np.array([x2,y2]) 105 106 text1 = "" + str(x1) + "" 107 text2 = "" + str(x2) + "" 108 text3 = "" + str(y2) + "" 109 110 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) 111 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) 112 113 114 # 探索画像から検出領域を抽出 115 img_crop = frame[pMax1[1]:pMax1[1]+height1, pMax1[0]:pMax1[0]+width1].copy() 116 117 # 検出領域に赤色の円と十字を描画 118 cv2.circle(frame, detect, width1/2, (0, 0, 255), 1) 119 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) 120 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) 121 122 x1 = (((round(((pMax1[0] + width1/2)-385)*0.327,2))), (round(((pMax1[1] + height1/2)-290)*0.327,2))) 123 x2 = (round(((pMax1[0] + width1/2)-385)*0.327,2)) 124 y2 = (round(((pMax1[1] + height1/2)-290)*0.327,2)) 125 126 y1 = (round(((pMax2[0] + width1/2)-385)*0.327,2), round(((pMax2[1] + height1/2)-290)*0.327,2)) 127 x3 = (round(((pMax2[0] + width1/2)-385)*0.327,2)) 128 y3 = (round(((pMax2[1] + height1/2)-290)*0.327,2)) 129 130 X = (round((50/(l-50))*((x2 + x3)/2),2)) 131 Y = (round((50/(l-50))*((y2 + y3)/2),2)) 132 Z = ((round(50/(l-50)*213,2))) 133 134追記 135

このX,Y,Zをax1(X,Y,Z),ax2(X,Y),ax3(Y,Z)にプロットしたいです。

###試したこと
matplotlibでリアルタイム描画を参考にしてコードを考えてみましたが上手くいきませんでした。
URL先ではsin関数を描画していますが、散布図でプロットしたいです。

###補足情報(言語/FW/ツール等のバージョンなど)
windows10,python2.7,matplotlib,spyder

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

plt.pause()でリアルタイムに描画できるようです。
以下のページに具体的なサンプルコードが載っています。
参考:
matplotlibでリアルタイム描画
Python+Matplotlibでプロットアニメーションを作成する

以下は3次元散布図に初期データを表示し、任意のタイミングで別データとして座標を追加し、描画更新する例です。

Python

1import numpy as np 2from matplotlib import pyplot as plt 3from mpl_toolkits.mplot3d.axes3d import Axes3D 4import time 5 6# グラフの初期化 7def init_plot(d): 8 fig = plt.figure() 9 ax = fig.add_subplot(111, projection='3d') 10 11 ax.set_xlabel("X-axis") 12 ax.set_ylabel("Y-axis") 13 ax.set_zlabel("Z-axis") 14 ax.set_xlim(-30, 30) 15 ax.set_ylim(-40, 20) 16 ax.set_zlim(-30, 20) 17 18 # 最初に描画データを与えておく必要あり 19 l1, = ax.plot(d[:,0], d[:,1], d[:,2], "o", color="g", ms=16, mew=0.5) # 初期データ用 20 l2, = ax.plot([0], [0], [0], "o", color="b", ms=8, mew=0.5) # 追加データ用 初回はダミーをセット 21 return l1,l2 # 呼出元で利用 22 23# グラフの描画更新 24def update_plot(lines,d): 25 lines.set_data(d[:,0],d[:,1]) # x,y 26 lines.set_3d_properties(d[:,2]) # z 27 plt.pause(.01) 28 29if __name__ == "__main__": 30 31 # 最初から表示するデータ 32 d = np.array([[-20,-30,-20],[20,-30,-20]]) 33 34 # グラフの初期化 35 l1,l2 = init_plot(d) # l1=初期データ, l2=追加データ用 36 update_plot(l1,d) 37 38 time.sleep(1) 39 40 # データ追加し描画更新 41 a = np.array([[-20,10,0]]) # 追加データ 42 update_plot(l2,a) 43 44 time.sleep(1) 45 46 # ループで追加 47 for i in range(0,10): 48 a = np.vstack((a,[i,i,2*i])) 49 update_plot(l2,a) 50 51 time.sleep(0.5) 52 53 # 最後に確認表示できるように 54 plt.show()

投稿2017/07/08 08:25

編集2017/07/11 04:21
can110

総合スコア38254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Penefax

2017/07/10 00:39

ご回答ありがとうございます。このサイトを参考にもう少し検討してみて、疑問点があればまた質問させていただきます。
Penefax

2017/07/10 08:13

すみません、やはり、わからなかったので追記させていただきました。ご教授をお願いします。
can110

2017/07/10 09:03

すみません。提示されたコードの詳細を確認していませんが、具体的にどう「うまく行かない」のでしょうか? また「X,Y,Zを求める計算」はリアルタイム描画毎に行う必要があると思いますが、コード上ではそれがないように思えます。
Penefax

2017/07/11 00:03

分かりにくくて済みません。具体的には、1.X,Y,Zをリアルタイムでグラフ(1.xyzの3軸・3D、2.xy軸、3.yz軸)として表示させたいが出来ない。2.X,Y,ZをPlanned.csvが乗っているグラフにリアルタイムで乗らない。 理想としては、テンプレートマッチングが行われている動画と同時にグラフも表示されかつプロットされていくです。(result.csvに座標結果がうち込まれていくようになっています。) 「X,Y,Zを求める計算」の部分は質問文に追記させていただきました。 よろしくお願いします。
can110

2017/07/11 01:37

散布図にて初期データ表示+任意のタイミングでデータ追加表示するコード例を追加しました。 最初から複雑な処理を書くと難しいので、簡単な例から試してみるとよいかと思います。
Penefax

2017/07/11 02:03

ありがとうございます。このコード例を3次元プロットすることは可能なのでしょうか?
can110

2017/07/11 03:00

可能です。3次元散布図にコード修正しました。
Penefax

2017/07/11 03:21

ありがとうございます。d = np.vstack((d,[-20,10,0]))やd = np.vstack((d,[i,i,2*i]))はデータ形式になっていますが、これを計算式(x=○○、y=○○みたいな)やcsvファイルを読み込むことは可能でしょうか?また、リアルタイムで打ち込まれる方に関してのマーカーの種類などをはじめから打ち込まれている方と変えることは出来るのでしょうか?
can110

2017/07/11 04:23

初期データ=CSV読込データ、追加データ=リアルタイム計算結果とすればよいのでは? それぞれ別マークで描画したいなら、plotを個別に呼べば(デフォルト動作では)重ねて描画されます。 上記を踏まえてサンプルコード修正しています。
Penefax

2017/07/11 09:07 編集

a = np.array([[-20,10,0]]) # 追加データ の中身も a = np.array([[X,Y,Z]])にすればよいのでしょうか? また、この時X,Y,Zを定義している式よりも上にコードを置いた状態で読み込むにはどのようにしたらよいのでしょうか? 動画処理→グラフ表示の順でコードを書いていくと動画が終了してからグラフが表示されてしまい、グラフ→動画処理の順でコードを書いていくとX,Y,Zがglobalで見つかりませんでしたとエラーが出てしまいます。
can110

2017/07/11 08:16

すみません。何が分からないのか分かりません。 サンプルと同様に、a = np.vstack((a,[X,Y,Z]))で新たな座標をa配列に追加 update_plot(l2,a)で、a配列内容をグラフにセットして表示更新すればよいだけです。
Penefax

2017/07/11 09:07

言葉足らずですみません、ひとつ前のコメントを訂正させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問