はじめに
前回の続き。
ラズパイ上のファイルをWindows上に持ってきて、それを動画にするまで+α
ラズパイ上にあるファイルのダウンロード方法
ラズパイ上にあるファイルの転送方法はすぐに思いつくのは2つ。
- WindowsOSを対象とした、ファイルサーバ機能などを提供するSamba
- とりあえず誰とでも接続できるFTPサーバ
今回はWindows以外と接続する予定がないので、とりあえずSambaを利用することにした。
Sambaのセットアップ方法はこのリンクの記事を参考にした。
これの設定通りコマンドを叩いて、いざ\\raspberrypi
をエクスプローラのアドレス欄に記入…しても動かない。
WindowsからpingしてみたらIPv6のアドレスが返ってきているため、物理的にはつながっていたようだった。
下記のリンクを見る限り、おそらく正しくIPアドレスが設定されておらず、raspberrypiまで到達できないのが原因のようだ。
ただ、teratermでraspberrypiに接続すればその接続状況がWindowsに保存されるらしく、
接続後はWindowsからファイルサーバへアクセスできた。
Sambaは必ず手動で立ち上げるようにsudo systemctl smbd disable
で自動で起動しないようにしたため、
今の時点ではteratermへの接続が必須な状態は問題なさそうだ。
今後問題が出てから改めてDHCPクライアントや固定IPについては考えることにする。
ここからはCPUをより使う作業になっているため、WindowsPC上で作業を行う。
画像ファイルを動画ファイルに変更する
画像ファイルの動画ファイルへの変換はサンプルがたくさんあるが、
個人的に良いサンプルだと思ったのは下記のアドレスのコード。
自分はアンパックを生かしたfourccの作成が思いついていなかった。
今回の画像や動画には、下記のような特徴やユースケースがある
- 暗視状態だと画像が紫色になる
- グレースケールに変換する
- 画像のサイズが良くわかっていない
- 特定の写真を見てサイズを推定することにする
- 負荷状況で画像のサイズが変わるかもしれないので念の為、3枚目あたりを利用する
- 速度とか読み出し位置とかを変更して、寝相のわるいところだけ切り出すといったユースケースもありそう
- 考えられる部分は変数として指定できるようにしておく
これらのことを考えて、次のコードを作って変換することにした。
import cv2
from typing import Iterable
import glob
import re
def files2image(images: Iterable[str], write_path: str, sample_image: str, skip: int = 1, flame_rate: float = 30.0):
if skip <= 0:
raise ValueError("スキップ間隔間違えていますよ。")
sample = cv2.imread(sample_image)
height, width, _ = sample.shape
writer = cv2.VideoWriter(write_path, cv2.VideoWriter_fourcc(*"mp4v"), flame_rate, (width, height), isColor=False)
for count, filename in enumerate(images[::skip]):
color = cv2.imread(filename)
gray = cv2.cvtColor(color, cv2.COLOR_BGR2GRAY)
writer.write(gray)
print(f"\r{count} 枚処理完了", end="")
writer.release()
if __name__ == '__main__':
base_path = r"D:\photos"
dir_name = "1125"
append = "gray"
glob_path = f"{base_path}\\{dir_name}\\*.jpg"
result_path = f"{base_path}\\{dir_name}_{append}.mp4"
items = glob.glob(glob_path)
files2image(items, result_path, items[2])
結果を表示したいところだけど、流石に個人情報的にまずいと思ったので別の動画を作成してきた。
こんなことできませんした
おまけ
Aviutilでエンコードし直したらファイルサイズが半分程度になりました(1.5MB→610KB)。OpenCVの動画エンコードはあまり効率が良くはなさそう。