#author("2017-12-13T20:52:40+09:00","hasegawa","hasegawa")
#author("2018-02-24T13:20:11+09:00","hasegawa","hasegawa")
#contents

*OpenCVとPythonを使った動画解析 [#s5883425]
**用意するもの(Windows10) [#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」をクリックするとインストールされる。
**用意するもの(Mac) [#b97e2cb5]
-Mac(El Captianで確認)
-Homebrewでpython3をインストール
-Homebrewでopencv3をインストール
-easy_installでpipをインストール
-pipでmatplotlibをインストール
**サンプルプログラムの動かし方 [#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()             # 何かキーが押されるまで待つ
とする。

[[長谷川のページ]]



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS