#author("2017-12-06T12:44:51+09:00","hasegawa","hasegawa") #contents *OpenCVとPythonを使った動画解析 [#s5883425] **用意するもの [#y8e3727f] -windows10が入ったPC(大学のPCはwindows8なので、使えません) -WinPython~ [[https://winpython.github.io/]]~ ここからダウンロードする。最新版(WinPython 3.6.3.0Qt5)をダウンロードすればよい。~ 適当なフォルダに展開すれば使える。インストールする必要はない。 -OpenCV~ [[https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv]]~ ここからダウンロードする。最新版はopencv_python-3.3.1-cp36-cp36m-win。WinPythonとpythonのバージョンが違うが問題ないようだ。 **WinPythonでOpenCVを使えるようにする。 [#cf27c4a9] WinPythonを展開すると、WinPython-64bit-3.6.3Qt5というフォルダができる。その中にある、WinPython Control Panelをダブルクリックすると、このようなウインドウが開く。 #ref("winpythoncontrolpanel.png") 「Add package」をクリックし、ダウンロードしたopencv_python‑3.3.1‑cp36‑cp36m‑win_am64.whlを選ぶ。「Install packages」をクリックするとインストールされる。 **サンプルプログラムの動かし方 [#d632cd94] 全学教育機構松本先生のページに詳しい解説がある。~ http://johnen.shinshu-u.ac.jp/~matsu/opencv/~ 「[[まとめ>http://johnen.shinshu-u.ac.jp/~matsu/opencv/#summary]]」に示されたソースプログラムをpendulum.pyと名前を付けて保存する。WinPython-64bit-3.6.3Qt5というフォルダの中にある「WinPython Command Prompt.exe」または「WinPython Powershell Prompt.ext」をダブルクリックすると、立ち上がる(図はPowershellの場合)。 #ref("powershell.png") ソースファイルと動画ファイルが置かれているフォルダに移動する。例えば、 PS D:\WinPython-64bit-3.6.3.0Qt5\scripts> cd ..\..\work PS D:\work> pythonを動かす。 PS D:\work> python pendulum.py 動画とグラフが表示されるはず。動画が止まったら、動画の表示されたウインドウをクリックして、Enterキーを押すとプログラムが終了する。 **色の選択の仕方 [#n0bf1e69] 追従する色の選択するために、振り子の重りには周りの色とは違った特徴のある色(例えば重りに色のついたシールを貼る)を使った方が、誤った位置を選ぶ可能性が小さくなる。 動画を撮影したら、動画再生ソフトで再生し、一次停止をして画面キャプチャ(Windowsの場合、PtrtSc(プリントスクリーン)を押す)する。ペイントを起動し、貼り付けを押すとキャプチャした画像が表示される。追従したい色を「色の選択」(スポイトのツール)で選び、「色の編集」をクリックしてウィンドウが開くと、その色の色合い(H)、鮮やかさ(S)、明るさ(V)を調べられる。 これを、プログラムのマスク用の[H,S,V]に指定するが、ペイントは色合い、鮮やかさ、明るさのスケールが0〜240なので、これをプログラムのスケール(色合い:0-180、鮮やかさ、明るさ:0〜255)に変換する。例えば、ペイントでの色合いが210だったとすると210/240*180=157.5になるので、色合いを中心値157.5に対し、上限値と下限値を±10程度で設定する。鮮やかさ、明るさはあまり感度がないので、下限値50,上限値255で設定すればよいはず。 lower = np.array([147,50,50]) # マスク用の[H,S,V]の下限 upper = np.array([167,255,255]) # マスク用の[H,S,V]の上限 **処理速度が遅い [#z9577940] 原因はフレーム毎に散布図に再描画させているためで、点の数が増えるにつれて処理速度が遅くなる。長時間の動画処理に不都合なので、全てのフレームを処理した後で描画させると処理が速く終了する。 plt.scatter(n_set,gx_set) # 散布図を描画 plt.pause(.001) # これがないと描画しない この2行を全てのフレーム処理が終わった後に持ってくる。具体的にはwhileループの外に出す。 # # キー入力を待つ # (値をいろいろ変えてみるとフレーム表示のスピードが変化する) # cv2.waitKey(30) plt.scatter(n_set,gx_set) # 散布図を描画 plt.pause(.001) # これがないと描画しない cv2.waitKey() # 何かキーが押されるまで待つ とする。 [[長谷川のページ]]