質問: カメラモジュールとcamera.inoを用いてSDカードに画像を記録をしているのですが、1秒当たり2フレーム程度しか保存できません。30FPS程度でSDカードに記録できるようにするための方法を教えてください。よろしくお願いします。
回答: 興味があったので、少し調べてみました。 caemra.ino の静止画の撮影処理にかかる時間を調べてみると、次のような内訳になりました。 ``` takePicture : 330ms~ OpenFile : 30ms WriteFile : 70ms~ CloseFile : 10ms Total : 440ms~ ※撮影したJPGのファイルサイズによって変動することに注意 ``` 静止画撮影に 330ms、ファイル処理に 110ms かかっています。 静止画撮影になんでこんなに時間がかかるのだろうと、takePicture の中身を見たら、次のように処理をしていました。 ``` ioctl(video_fd, VIDIOC_TAKEPICT_START, take_num) //カメラ開始 ioctl_dequeue_stream_buf(&buf, V4L2_BUF_TYPE_STILL_CAPTURE) //写真撮影 ioctl(video_fd, VIDIOC_TAKEPICT_STOP, false) //カメラ停止 ``` つまり、静止画をとるたびにカメラを開始・停止をしていたのです。 なので、カメラを開始したまま連続撮影したらどうなるだろうと思い試してみました。 次のような感じです。 ``` ioctl(video_fd, VIDIOC_TAKEPICT_START, take_num) //カメラ開始 for (int i = 0; i < 30; ++i) { ioctl_dequeue_stream_buf(&buf, V4L2_BUF_TYPE_STILL_CAPTURE) //30枚連続写真撮影 } ioctl(video_fd, VIDIOC_TAKEPICT_STOP, false) //カメラ停止 ``` すると測定結果は次のようになりました。 ``` ioctl_dequeue_stream_buf: 90ms~ OpenFile : 30ms WriteFile : 70ms~ CloseFile : 10ms Total : 200ms~ ※撮影したJPGのファイルサイズによって変動することに注意 ``` 期待したとおり、大分時間が縮まりました。5fps 位はなんとかなりそうです。 しかし 30fps を実現するには、静止画撮影に 15ms、ファイル処理に 15ms 程度しか割り当てられません。う~ん、静止画撮影の処理をベースに 30fps を実現するのは厳しそうですね。 動画なら時間方向の圧縮もあるので全体のデータ量が少なくなりますし、SDカードに連続的に書き込めますので、もっと早くなる可能性がありますが、残念ながら参考になりそうなコードは見つかりませんでした。 以上、ご参考になれば。(あまり参考にならないかも知れませんが...^^;)