Armadilloフォーラム

microSDカードへの動画、画像、ログの保存、保持機能につきまして

yuki.shigefuji

2023年3月17日 20時02分

お世話になっております。

Armadilloのデモプログラムを改修し、
cv2の機能を使ってカメラの動画をmp4形式で動画出力したいと考えております。
Windowsで開発したものを、映した結果
動画ファイルが全く出力されず困っております。

弊社で調査したところでも環境のOpenCVのビルドが以下のようになっており、
mp4で出力できないのではないかと考えました。

OpenCVのビルド情報

Video I/O:
GStreamer: YES (1.18.4)
v4l/v4l2: YES (linux/videodev2.h)
gPhoto2: YES

そこでOpenCVを自前でビルドしなおしてしまおうと考えましたが、
必要な環境をインストールしてもビルド環境を整えることができませんでした。

自前でCMAKEしたもの
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_FFMPEG=ON \
-D WITH_GSTREAMER=ON \
-D WITH_X264=ON \
..

- Video I/O:
-- DC1394: NO
-- FFMPEG: NO
-- avcodec: NO
-- avformat: NO
-- avutil: NO
-- swscale: NO
-- avresample: NO
-- GStreamer: NO
-- v4l/v4l2: YES (linux/videodev2.h)

 GStreamerもOFFになり、x264についても未だに表示されませんでした。

目的はカメラ映像をmp4出力することですので、
どのように対処すべきかどうかの部分から、一度ご教示いただきたく存じます。
また、ほかの事例でカメラ映像をmp4出力しているような事例がございましたら教えていただきたいです。

以上、よろしくお願いいたします。

コメント

佐藤です。

> 目的はカメラ映像をmp4出力することですので、
これでしたら、OpenCVは使わずにgstreamerで以下のコマンドでできるかと思います。

gst-launch-1.0 -e v4l2src device=/dev/video2 ! video/x-raw,width=640,height=480,framerate=30/1 ! queue ! vpuenc_h264 ! h264parse ! qtmux ! filesink location=./output.mp4

/dev/video2となっている箇所やwidth,height,framerateの値はご自身の環境のものに置き換えてください。

ご回答ありがとうございます。

リアルタイムで物体検出をした動画をmp4形式で保存したいと考えており、コマンドラインからGstreamerを使用するとpythonのopenCVでビデオキャプチャが出来なくなってしまいますので、可能であればopenCVで保存する方法が望ましいと考えております。お手数ですがご確認よろしくお願いいたします。

> 佐藤です。
>
> > 目的はカメラ映像をmp4出力することですので、
> これでしたら、OpenCVは使わずにgstreamerで以下のコマンドでできるかと思います。
>
>

> gst-launch-1.0 -e v4l2src device=/dev/video2 ! video/x-raw,width=640,height=480,framerate=30/1 ! queue ! vpuenc_h264 ! h264parse ! qtmux ! filesink location=./output.mp4
> 

> /dev/video2となっている箇所やwidth,height,framerateの値はご自身の環境のものに置き換えてください。
>

お世話になっております。
表題の件は解決可能なのでしょうか。

お手数ですがご返信お待ちしております。

佐藤です。

opencvからの動画保存には cv2.VideoWriter を使用しているかと思いますが、以下のようにするとどうでしょうか。
※fpsや解像度の値はご自身の環境に合わせて下さい。

pipeline = "appsrc ! autovideoconvert ! video/x-raw,width=640,height=480,framera
te=30/1 ! queue ! vpuenc_h264 ! h264parse ! qtmux ! filesink location=./output.m
p4 sync=false"
writer = cv2.VideoWriter(pipeline, 0, 30, (640, 480))
while(True):
    # frameに対する何らかの処理
    writer.write(frame) # 処理したframeを書き込む
    cv2.waitKey(1)
writer.release()