昨夜のデジタル顕微鏡のソフトを長時間のパラパラ動画に対応させたので、考え方は汎用性高いので、まとめておこうと思う。
主な課題は以下の通りでした。
①長時間間隔で撮影すると、途中でモードを”s”押して調整モードに入ろうとしても入れなくなる
②最悪、せっかくとった動画が応答なしで消えてしまう
やったこと
※waitKeyの使い方はググってもあまり出てこないので、仕様の変更理由を記載する
①sleep()を止めて、waitKey()で待ち時間とする
理由:sleepだとその間、入力が無視されてなかなか戻って来ない。一方、waitKeyはKey入力待ちとなっていて、Key入力と同時に処理を反映してくれる。
②どの程度時間が経過したかを画像に記載するようにした
理由:表示が無いと動画を見てもどの程度の時間でその現象が起こったか分からない。
コードは以下に置いた
【2019.1.2追記】動画の保存ファイル名がかぶると前のファイルを消してしまうので、タイムスタンプを追加した
MicroScope/kenbikyo_KeyII.py
コード解説
基本はあまり変わっていないが、時間の経過を示すため変数jを導入しました。
そして、fpsを正しく計算できるように、While文中ではfpsを計算した後に持ってきました。
そのため、最初のtimerをWhileの前に持ってきました。
s=0.1
j=0
timer = cv2.getTickCount()
fpsと経過時間timeをframeに書き込みました。
while True:
ret, frame = cap.read()
#sleep(s)
fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);
timer = cv2.getTickCount()
# Display FPS on frame
cv2.putText(frame, "FPS : " + str(int(1000*fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);
cv2.putText(frame, "time : " + str(int((j-1)*s)) + " s", (400,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);
#print(int(j*s),is_video)
#j += 1
cv2.imshow('test',frame)
そして、is_video=="True"の判定を最後に持ってきて、先に終了と動画撮影の判定を実施することとしました。
key = cv2.waitKey(int(s*1000))&0xff
if key == ord('q'): #113
#cv2.destroyAllWindows()
break
elif key == ord('p'):
s=60
is_video = "True"
elif key == ord('s'):
s=0.1
is_video = "False"
if is_video=="True":
img_dst = cv2.resize(frame, (int(w), h)) #1280x960
out.write(img_dst)
print(int(j*s),is_video)
j += 1
上記の変更により、安定して長時間の撮影でも撮影モードと調整モードの切り替えがスムーズに実施することができるようになりました。
撮影した動画例
デジタル顕微鏡による長時間動画撮影♪(画像サイズ640x480)
※画像をクリックするとYouTube動画につながります
まとめ
・ロジックを変更して安定して長時間撮影できるようになった
・表示に経過時間を入れた
・種から芽がなかなか出ない