MIPI vs  Webカメラ　プロパティ比較


Raspberry pi 4BでWebカメラ、MIPIの比較を行ったのでその評価結果をまとめる。

#MIPIカメラとは
>モバイル機器内の相互接続標準化を進める組織で、データ転送、バッテリー、無線通信、ソフトなど多くの標準化を進めています。このMIPIのシリアルデータ伝送規格は2008年に制定されたD-PHYと呼ばれる規格で、主にカメラ接続（Camera Serial Interface = CSI-2）とディスプレイ接続（Display Serial Interface＝DSI）用の規格です。

引用：https://monoist.atmarkit.co.jp/mn/articles/1601/28/news033_4.html

MIPIアライアンスで策定されたモバイル機器のカメラやディスプレイとのインターフェイス規格に対応したカメラ。
低消費電力、かつ高速シリアル伝送できることから携帯電話のビデオ信号接続などに使用されている。

>基本的には差動(平衡)で動作し、二種類の物理層の規格が存在する。
D-PHYは、1レーンあたり最大1.0Gbpsの通信速度
M-PHYは、1レーンあたり最大6Gbpsの通信速度(ベアラー速度)
概ね、次のような仕様である。
1・2・4・8レーンで利用できる。
低EMI放射と高ノイズ耐性、低消費電力などを特徴としている。
400mVの差動振幅で、消費電力は最大3mAとされている。


引用：https://www.wdic.org/w/WDIC/MIPI


#Webカメラとは
WebカメラはPCあるいはネットワークに接続された小型のデジタルビデオカメラ。
PCにUSB接続すれば，通常のUSBメモリと同様にアクセスできる．
Video for Linux　Two(Video4LinuxTwo: v4l2)で扱えるデバイスのため，カーネルがUVCドライバ(USB Video Class)に対応していれば，v4l2対応の一般のアプリケーションから利用できる．

#比較表
|            |  Webカメラ | MIPIカメラ |
|:-----------|:-------------|:-------------|
|デバイス依存|◎USBポートがあればいい|△MIPIインタフェースが必要|
|ドライバ|用意する必要なし|メーカー独自のドライバを使用する？|
|伝送帯域|5Gbps|最大6Gbps|
|ケーブル長|３m|10cm（光ケーブルで数mまで可）|
|カメラのプロパティ数|14個△|29個〇|
|価格|〇|◎|

引用：https://www.wdic.org/w/WDIC/MIPI
引用：https://www.argocorp.com/knowledge/data.html


#WEBカメラ
使用するカメラ：Logitech（ロジテック） ウェブカメラ C270i ブラック 
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136687/367b4223-1c03-e600-1b4a-9b4a32b4c4fe.png">


###v4l2-ctlでカメラのサポートするフォーマットを確認
```console:terminal-webcamera
pi@raspberrypi:~ $ v4l2-ctl --list-formats
ioctl: VIDIOC_ENUM_FMT
	Type: Video Capture

	[0]: 'YUYV' (YUYV 4:2:2)
	[1]: 'MJPG' (Motion-JPEG, compressed)
```

###カメラのデバイス情報を確認
```console:terminal-webcamera
pi@raspberrypi:~ $ v4l2-ctl -D
Driver Info:
	Driver name      : uvcvideo
	Card type        : UVC Camera (046d:081b)
	Bus info         : usb-0000:01:00.0-1.1
	Driver version   : 4.19.118
	Capabilities     : 0x84a00001
		Video Capture
		Metadata Capture
		Streaming
		Extended Pix Format
		Device Capabilities
	Device Caps      : 0x04200001
		Video Capture
		Streaming
		Extended Pix Format
Media Driver Info:
	Driver name      : uvcvideo
	Model            : UVC Camera (046d:081b)
	Serial           : E0E18750
	Bus info         : usb-0000:01:00.0-1.1
	Media version    : 4.19.118
	Hardware revision: 0x00000012 (18)
	Driver version   : 4.19.118
Interface Info:
	ID               : 0x03000002
	Type             : V4L Video
Entity Info:
	ID               : 0x00000001 (1)
	Name             : UVC Camera (046d:081b)
	Function         : V4L2 I/O
	Flags         : default
	Pad 0x01000007   : 0: Sink
```
UVC（USBビデオクラス対応）カメラ用のドライバでv4l2ドライバの利用が可能なようだ。


###カメラのプロパティ情報を確認
```console:terminal-webcamera
pi@raspberrypi:~ $ v4l2-ctl --list-ctrls
                     brightness 0x00980900 (int)    : min=0 max=255 step=1 default=128 value=128
                       contrast 0x00980901 (int)    : min=0 max=255 step=1 default=32 value=32
                     saturation 0x00980902 (int)    : min=0 max=255 step=1 default=32 value=32
 white_balance_temperature_auto 0x0098090c (bool)   : default=1 value=1
                           gain 0x00980913 (int)    : min=0 max=255 step=1 default=64 value=64
           power_line_frequency 0x00980918 (menu)   : min=0 max=2 default=2 value=2
      white_balance_temperature 0x0098091a (int)    : min=0 max=10000 step=10 default=4000 value=4000 flags=inactive
                      sharpness 0x0098091b (int)    : min=0 max=255 step=1 default=24 value=24
         backlight_compensation 0x0098091c (int)    : min=0 max=1 step=1 default=0 value=0
                  exposure_auto 0x009a0901 (menu)   : min=0 max=3 default=3 value=3
              exposure_absolute 0x009a0902 (int)    : min=1 max=10000 step=1 default=166 value=166 flags=inactive
         exposure_auto_priority 0x009a0903 (bool)   : default=0 value=1
                      led1_mode 0x0a046d05 (menu)   : min=0 max=3 default=3 value=3
                 led1_frequency 0x0a046d06 (int)    : min=0 max=131 step=1 default=0 value=0
```

#それぞれのプロパティ値の意味
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136687/7981a6a3-8f59-0389-9a50-d422a0d55f12.png)

自動露光機能や露光時間の設定やゲインの設定など基本的なプロパティは備わっているものの、自動ゲインの機能としては不足しており、設定項目が少ないが、照明が一定環境下の監視目的の用途であれば十分。


##Webカメラの操作方法(gstreamer)

```
gst-launch-1.0 v4l2src ! video/x-raw,width=640,height=480,framerate=15/2 ! videoconvert ! ximagesink
```

参照先：
https://www.argocorp.com/software/DL/tis/Linux/index.html
https://www.argocorp.com/UVC_camera.html

#MIPIカメラ
使用したカメラ：5MP 1080P Camera for raspberry pi 4 Model b カメラモジュール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136687/bf9a1720-ce11-d91b-2871-a31c771be66f.png)


#v4l2-ctlでカメラのサポートするフォーマットを確認
```console:terminal-MIPI
pi@raspberrypi:~ $ v4l2-ctl -D
Driver Info:
	Driver name      : bm2835 mmal
	Card type        : mmal service 16.1
	Bus info         : platform:bcm2835-v4l2
	Driver version   : 4.19.118
	Capabilities     : 0x85200005
		Video Capture
		Video Overlay
		Read/Write
		Streaming
		Extended Pix Format
		Device Capabilities
	Device Caps      : 0x05200005
		Video Capture
		Video Overlay
		Read/Write
		Streaming
		Extended Pix Format
```
v4l2-ctlで認識していいるが、ドライバがメーカー独自のもの。
ちなみにJetsonでは動作しなかった。（ドライバを組み込めばうまくいくかもしれないが・・・）

```console:terminal-MIPI
pi@raspberrypi:~ $ v4l2-ctl --list-ctrls

User Controls

                     brightness 0x00980900 (int)    : min=0 max=100 step=1 default=50 value=50 flags=slider
                       contrast 0x00980901 (int)    : min=-100 max=100 step=1 default=0 value=0 flags=slider
                     saturation 0x00980902 (int)    : min=-100 max=100 step=1 default=0 value=0 flags=slider
                    red_balance 0x0098090e (int)    : min=1 max=7999 step=1 default=1000 value=1000 flags=slider
                   blue_balance 0x0098090f (int)    : min=1 max=7999 step=1 default=1000 value=1000 flags=slider
                horizontal_flip 0x00980914 (bool)   : default=0 value=0
                  vertical_flip 0x00980915 (bool)   : default=0 value=0
           power_line_frequency 0x00980918 (menu)   : min=0 max=3 default=1 value=1
                      sharpness 0x0098091b (int)    : min=-100 max=100 step=1 default=0 value=0 flags=slider
                  color_effects 0x0098091f (menu)   : min=0 max=15 default=0 value=0
                         rotate 0x00980922 (int)    : min=0 max=360 step=90 default=0 value=0 flags=modify-layout
             color_effects_cbcr 0x0098092a (int)    : min=0 max=65535 step=1 default=32896 value=32896

Codec Controls

             video_bitrate_mode 0x009909ce (menu)   : min=0 max=1 default=0 value=0 flags=update
                  video_bitrate 0x009909cf (int)    : min=25000 max=25000000 step=25000 default=10000000 value=10000000
         repeat_sequence_header 0x009909e2 (bool)   : default=0 value=0
            h264_i_frame_period 0x00990a66 (int)    : min=0 max=2147483647 step=1 default=60 value=60
                     h264_level 0x00990a67 (menu)   : min=0 max=11 default=11 value=11
                   h264_profile 0x00990a6b (menu)   : min=0 max=4 default=4 value=4

Camera Controls

                  auto_exposure 0x009a0901 (menu)   : min=0 max=3 default=0 value=1
         exposure_time_absolute 0x009a0902 (int)    : min=1 max=10000 step=1 default=1000 value=100
     exposure_dynamic_framerate 0x009a0903 (bool)   : default=0 value=0
             auto_exposure_bias 0x009a0913 (intmenu): min=0 max=24 default=12 value=12
      white_balance_auto_preset 0x009a0914 (menu)   : min=0 max=10 default=1 value=1
            image_stabilization 0x009a0916 (bool)   : default=0 value=0
                iso_sensitivity 0x009a0917 (intmenu): min=0 max=4 default=0 value=0
           iso_sensitivity_auto 0x009a0918 (menu)   : min=0 max=1 default=1 value=1
         exposure_metering_mode 0x009a0919 (menu)   : min=0 max=2 default=0 value=0
                     scene_mode 0x009a091a (menu)   : min=0 max=13 default=0 value=0

JPEG Compression Controls

            compression_quality 0x009d0903 (int)    : min=1 max=100 step=1 default=30 value=30
```

##プロパティの意味
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136687/6fdc9b8c-0816-af36-ec5c-5397fa42ba09.png)


カメラコントロールできるプロパティがWebカメラと比較して多いが、
動画圧縮のプロパティまであるのが特徴的。
圧縮して保存できるので、長時間録画する監視用途にはあっているかもしれない。


##MIPIカメラの操作方法
RASPBIANシステム端末に入り、以下のステートメントを実行してシステム更新を入手

```console:terminal-MIPI
sudo apt-get update
sudo apt-get upgrade
```

raspi-configを使ってカメラポートを設定する

```console:terminal-MIPI
sudo raspi-config
```

「インターフェースオプション」 - >「カメラ」を選択し、
有効にしてシステムを再起動する。
カメラをラズベリーパイにケーブルで接続した後
写真の撮影には

```console:terminal-MIPI
raspistill -o image.jpg
```

を、ビデオの撮影には

```console:terminal-MIPI
raspivid -o vido.h264 -t 10000
```

を使用できる。 （PS 10000は10秒のこと）

もちろんGstreamerでも可能。

```console:terminal-MIPI
gst-launch-1.0 v4l2src ! video/x-raw,width=640,height=480,framerate=15/2 ! videoconvert ! ximagesink
```

動作させるにもGstreamerのパイプラインを使用できるのでWebカメラと遜色なく開発できる。

#総評
MIPIカメラのほうがプロパティの数からカメラの機能として豊富だが、ラズパイに依存したドライバで開発しにくかったり（ラズパイが比較的よくフリーズするのでできればデスクトップPCで作業したい）、MIPIのリボンケーブルの短さでカメラの設置位置に苦労した。一方で、Webカメラはラズパイだけでなく、他のOS（Windows,Ubuntu,Jetson）などで動作もするし、簡単にカメラの移動・設置ができるので、簡易的に使用するのであればWebカメラのほうが開発しやすい。