見出し画像

Pythonで動いているものの軌跡を出す

前回、Matlabで動いているものの軌跡を出すためのメモでしたが、今回はそれをPythonに移植というか同じことしようとしたときのメモになります。
コピペできるコードは末尾にあります。

素材は前回と同じく、NHKクリエイティブ・ライブラリーの火球の映像を使います。

画像1

実装

環境
・Python 3.8.8
・Jupyter Notebook 6.3.0

まず準備で3つのライブラリを入れておきます。
OpenCV:画像処理に使う
matplotlib:図形描画に使う
numpy:数値計算に使う

OpenCVを使って素材動画を読み込みます。MatlabではVideoReader関数でやっていたところです。

次に閾値設定をします。
まずは1フレーム目の画像を見ながら、オブジェクトを検出できる閾値を見積もります。

オブジェクト(火球)の近くを切り出して、輝度をカラーバーで調べてみます。

画像2

カラーバーが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の位置をもとに座標を補正しています。

最後に結果をプロットします。

画像3

うまく検出できました!
前回のMatlabと同じかそれ以上にシンプルにできました。

「続きをみるには」でコピペできるコードのフルバージョンが読めます。

ここから先は

618字

¥ 100

期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?