Open10

Linuxにセンサー繋いで画像を取得するための下調べ

ピン留めされたアイテム
Heya, NaohiroHeya, Naohiro

毎回よくわからない状態だったので調べた。2段飛ばしぐらいになってしまいました。

Heya, NaohiroHeya, Naohiro

Linuxのストレージはファイルシステム、システムコール、/dev/hogehoge みたいな階層構造をしているが、画像を取得する流れも同じっぽいけどどうなんだろうか?
つまり、Linuxからイメージセンサーを使う流れを調べたい

Heya, NaohiroHeya, Naohiro

indexを指定してOpenするらしいが、indexとは何のindexか

index camera_id + domain_offset (CAP_*) id of the video capturing device to open. To open default camera using default backend just pass 0. Use a domain_offset to enforce a specific reader implementation if multiple are available like cv::CAP_FFMPEG or cv::CAP_IMAGES or cv::CAP_DSHOW. e.g. to open Camera 1 using the MS Media Foundation API use index = 1 + cv::CAP_MSMF

default backend just pass 0のbackendとは何か

Heya, NaohiroHeya, Naohiro

FFMPEGについて調べる

FFmpeg is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata.

コーデックとは何か:エンコード、デコードが双方向にできるやつ、もしくはそのアルゴリズム
エンコードとは何か:アナログ信号やデジタルデータといった情報を、特定の方法で復元可能な別の状態に変換する処理である。(Wikipedia)

ライブラリとして libavcodec, libavformat, libavutil, libavfilter, libavdevice, libswresample, libswscaleがある。

ぱっとみ一番低レイヤなのはlibavdeviceっぽいがlibavformatが主役っぽい

libavdevice: provides an abstraction to access capture and playback devices.

土地勘がないので使い方を調べる https://proc-cpuinfo.fixstars.com/2017/08/ffmpeg-api-decode/

libavformat
mp4やmkvなどのコンテナから、H264やAACなどの映像や音声ストリームを取り出したり(demux)、逆に映像・音声ストリームをコンテナに入れたり(mux)するライブラリ

コンテナとは

コンテナファイルは、さまざまな種類のデータを識別したりまとめたりすることができる。単純なコンテナフォーマットは、異なる種類の音声ファイル形式データを複数含むことができる。先進的なコンテナフォーマットは、さまざまなストリーミングを再生し直すのに必要な同期情報とともに、音声・動画・副題・章(チャプター)・字幕・メタデータ(タグ)などに対応する。

コンテナとは動画本体の他にメタデータの情報も入っているファイルフォーマットという理解

コマンドラインの使い方

少し脱線したので戻ってffmpegのコマンド自体は/dev/video0を指定するらしい。https://i-beam.org/2020/05/05/remote-web-camera/

Heya, NaohiroHeya, Naohiro

V4L2: 詳解V4L2 (video for linux 2)

V4L2とは、Video for Linux 2の略です。その名の通り、VideoをLinuxで扱うためにLinux Kernelに実装されているuser space APIです。
https://zenn.dev/turing_motors/articles/programming-v4l2

V4L2がデバイスドライバとして提供しているインターフェイスが/dev/video*らしい
つまり、ユーザー空間としては一番最下層。
データはDirect Memory Access経由でやり取りされているらしい

Heya, NaohiroHeya, Naohiro

V4L2側 https://github.com/torvalds/linux/blob/master/include/media/v4l2-subdev.h#L480

struct v4l2_subdev_video_ops {
	int (*s_routing)(struct v4l2_subdev *sd, u32 input, u32 output, u32 config);
...で定義されていて

例えばIMX219の場合
ドライバ側 https://github.com/torvalds/linux/blob/master/drivers/media/i2c/imx219.c

static const struct v4l2_subdev_core_ops imx219_core_ops = {
	.subscribe_event = v4l2_ctrl_subdev_subscribe_event,
};

static const struct v4l2_subdev_video_ops imx219_video_ops = {
	.s_stream = imx219_set_stream,
};

で実装されている。

Heya, NaohiroHeya, Naohiro

ドライバはデバイスで定義されているregmap(register map)に読み書き?することでデバイスとコミュニケーションを取るらしい。