Pythonで動いているものの軌跡を出す
前回、Matlabで動いているものの軌跡を出すためのメモでしたが、今回はそれをPythonに移植というか同じことしようとしたときのメモになります。
コピペできるコードは末尾にあります。
素材は前回と同じく、NHKクリエイティブ・ライブラリーの火球の映像を使います。
実装
環境
・Python 3.8.8
・Jupyter Notebook 6.3.0
まず準備で3つのライブラリを入れておきます。
・OpenCV:画像処理に使う
・matplotlib:図形描画に使う
・numpy:数値計算に使う
OpenCVを使って素材動画を読み込みます。MatlabではVideoReader関数でやっていたところです。
次に閾値設定をします。
まずは1フレーム目の画像を見ながら、オブジェクトを検出できる閾値を見積もります。
オブジェクト(火球)の近くを切り出して、輝度をカラーバーで調べてみます。
カラーバーが0から80ちょいになっているので、だいたい80くらいで切れば良さそうです。
次にこの閾値を使って二値化し、オブジェクト検出します。
connectedComponentsWithStats でオブジェクト検出します。
返り値のうち、まず nlabels を見ます。これは検出されたオブジェクトの個数を返します。背景も1つとしてカウントされるので、1個の火球を検出するためには nlabels = 2 となることが必要です。
で centroids に各オブジェクトの座標が入ります。nlabels = 2 の場合、x座標が centroids[1][1]、y座標が centroids[1][0] になります。
うまく検出できていたら、以上の処理を各フレームについて行っていきます。
動画から1フレームずつ画像を読み込んでいきます。1フレームずつ読み込むのはMatlabと同じですね。
ret には動画が読み込めたかどうかをTrue/Falseで返し、 img には画像を1フレームずつ読み込んでくれます。なので下に if文を足すことで、動画が終わったところで処理を停止できます。
あとここではROIをさっきより大きくして、火球の軌跡全体が含まれるようにしています。
最後にx,y座標を取り出していますが、ここでは指定したROIの位置をもとに座標を補正しています。
最後に結果をプロットします。
うまく検出できました!
前回のMatlabと同じかそれ以上にシンプルにできました。
「続きをみるには」でコピペできるコードのフルバージョンが読めます。
ここから先は
¥ 100
この記事が気に入ったらサポートをしてみませんか?