Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

OpenPIVをWSL2上をためす その4:動画もイケる

PIVの元データを作る場合、その形式はハイスピードカメラから吐き出される動画である可能性が高いです。
それの切り出しは手動で切り出しなのかなと思ってましたが……ちゃんと動画のままやる方法が公式チュートリアルにありました。

実際のところ

元データを用意する

Githubに16Mbyteほどの動画がアップされてるので、こいつを使います。
元はYoutubeにアップロードされてる動画で、著者の許可はとったらしいです。
www.youtube.com
https://github.com/OpenPIV/openpiv-python/raw/master/openpiv/examples/test_movie/videoplayback.mp4
これを、以下のディレクトリに入れておきます。

'../test_movie/videoplayback.mp4'

とりあえず動画から切り出す

本編をそのまんま写経。

import cv2

import matplotlib.pyplot as plt
from openpiv import pyprocess, piv

vidcap = cv2.VideoCapture('../test_movie/videoplayback.mp4')
success, image1 = vidcap.read()
count = 0
U = []
V = []

while success and count < 10:
    success, image2 = vidcap.read()
    if success:
        x,y,u,v = piv.simple_piv(image1.sum(axis=2), image2.sum(axis=2),plot=True);
        image1 = image2.copy()
        count += 1
        U.append(u)
        V.append(v)

OpenCVのVideoCaptureメソッドを使ってフレーム毎に画像を切り出すスタイルみたいですね。

f:id:shuzo_kino:20210710002205p:plain

numpyも含めた解析

上記の後に以下を続けると……

import numpy as np

U = np.stack(U)
Umean = np.mean(U, axis=0)
V = np.stack(V)
Vmean = np.mean(V,axis=0)
fig,ax = plt.subplots(figsize=(8,8))
ax.imshow(image1,alpha=0.7)
ax.quiver(x,y,Umean,Vmean,scale=200,color='r',width=.008)
# plt.show()
plt.plot(np.mean(Umean,axis=1)*20,y[:,0],color='y',lw=3)

f:id:shuzo_kino:20210710002133p:plain