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メソッドを使ってフレーム毎に画像を切り出すスタイルみたいですね。
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)