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

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

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

[画像 プログラム] で検索にでてきたやつを深堀り
【Python×OpenCV】
カメラから画像を取得するコマンドcv2.readとは

Open video file or a capturing device or a IP video stream for video capturing.

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とは何か

図があった
Video I/O with OpenCV Overview
OpenCV Video I/O API Backendsとして
- FFMPEG
- DShow
- VFW
- MSMF
- AVF/IOS
- V4L
- OPENNI
などがあるらしい。
聞いたことあるのはFFMPEGとV4Lくらい

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/

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経由でやり取りされているらしい

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,
};
で実装されている。

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