LinuxでUVC(USB Video Class)タイプのUSBカメラを使う

LinuxでUVC(USB Video Class)タイプのUSBカメラを使う
その関係の記事のリンクを集めた。

大昔の時代と違って、UVC(USB Video Class)タイプのUSBカメラを接続すれば、Linuxでも問題なく認識される。

古いUSBカメラの場合にはUVCタイプではないものも存在した。その場合は、対象OSごとにドライバーソフトウェアをインストールする必要があった。


###**生じがちの問題:**###

- USBカメラへの電源の供給不足
    - (USBポートへの供給電力が不足になるとカメラが駆動しない。USBハブの場合には電力供給型のUSBハブを用いるべきこと。)
- USBの帯域不足
    - USBカメラの帯域は、OpenCVでcv::VideoCaptute()をするかどうかに関係なく、USBカメラを接続した時点でUSBの帯域を消費するとのことです。
    - [UVC対応カメラを複数台つなげるときは帯域に注意する](http://www.moonmile.net/blog/archives/2488)


- USBハブ使用時の同一の品番のUSBカメラ認識問題
    - USBハブによっては、同一の品番のUSBカメラに対しては適切に認識しない機種があるらしい。PCI-ExpressでUSBポートを増設してUSBカメラを増設するというやりかたもあるらしい。

- カメラの特性のget,set問題
    -　カメラの特性のget,setがライブラリとカメラの組み合わせによっては必ずしも細かな制御ができるようになっていないこと。 
- バッファ制御問題
    - ライブラリによっては、バッファに入っている画像のために、撮影した時刻と取得した時刻に無視できないずれを生じることがある。
        - [virtual bool cv::VideoCapture::grab()](https://docs.opencv.org/4.5.0/d8/dfe/classcv_1_1VideoCapture.html#ae38c2a053d39d6b20c9c649e08ff0146) を使ってでデコードすることなしに、バッファに入っている画像データだけ取得して、遅延を減らす方法もある。

- 画像データを保存することだけが目的ならば、画像データをデコードせずに、バイナリを受け取って、バイナリファイルを直接保存する。画像の表示はしないという手もある。

###**USBカメラのさまざまな形状**
- web会議用のカメラ
- 産業用のカメラに近い形状
- 顕微鏡形のUSBカメラ
- ![顕微鏡形のUSBカメラの例](https://www.vixen.co.jp/img/product/micro/cmos/212613a_w500.jpg)
- ピンホールカメラ型
- 
　![ピンホールカメラ型の例](http://www.mothertool.co.jp/img/products/2013072915444508802.jpg)
　

[usb ピンホールカメラで検索](https://www.google.co.jp/search?q=usb+%E3%83%94%E3%83%B3%E3%83%9B%E3%83%BC%E3%83%AB%E3%82%AB%E3%83%A1%E3%83%A9&rlz=1C1ROFJ_jaJP632JP632&oq=USB+%E3%83%94%E3%83%B3%E3%83%9B%E3%83%BC%E3%83%AB&aqs=chrome.1.69i57j0l3.11235j0j8&sourceid=chrome&ie=UTF-8)

- 産業用の部材としての基板ベースのUSBカメラ

　USBカメラといってもさまざまな形態がある。目的に応じて、選ぼう。



###**USBカメラの記事へのリンク**###

- [UVC(USB Video Class)とは]
(http://www.infinitegra.co.jp/blog/?p=61)




- Ubuntu [第147回　UbuntuでUSBウェブカメラを使う]
(http://gihyo.jp/admin/serial/01/ubuntu-recipe/0147)


[USBカメラ(UVCカメラ)を使う](http://ishi.main.jp/ros/ros_uvccam.html)



- [Ubuntu + UVC 対応カメラ インストール](http://hanageubuntu.seesaa.net/article/218489362.html)
まずは UVCドライバのインストール
sudo apt-get install uvccapture guvcview luvcview

- [Linux UVC driverのインストール, uvccaptureのインストール(ソースコードからのインストール方法)](http://www2.denshi.numazu-ct.ac.jp/mirsdoc2/mirsmg3d/osin/num0005a/0005.html)

コンパイル済みをインストールする方法
>$sudo apt-get -y install uvccapture

[第303回　guvcviewで簡単ビデオ撮影](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0303)を読むと、
>まずは「イメージコントロール」タブです。ここでは，輝度や彩度，ホワイトバランスや露出など，カメラの基本パラメータを設定できます。

とある。

さらに

> guvcviewの以上の機能のうち，GUIとコーデックを除くものは，libwebcamが実現しています。libwebcamはLinuxのVideo for Linux （V4L）のインターフェースを更に抽象化するライブラリです。

とある。


[Video for Linuxサブシステム](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0230)
には

> Video4Linuxコントロールパネル（v4l2ucp）を使うことで，V4Lサブシステムから，ウェブカメラをダイレクトにコントロールできます。

とある。

[uvcdynctrl ユーティリティについて](http://jalan.sakura.ne.jp/tokay-lab/2013/07/10/184.html)

>uvcdynctrl は、libwebcam ライブラリパッケージに含まれるユーティリティです
ヘルプ
$ uvcdynctrl -h
Brightness コントロールの値取得
$ uvcdynctrl -d video0 -g "Brightness"
128
Brightness コントロールの値設定
$ uvcdynctrl -d video0 -s "Brightness" 0



  Exposure, Auto
    ID      : 0x0000000f,
    Type    : Choice,
    Flags   : { CAN_READ, CAN_WRITE },
    Values  : { 'Manual Mode'[1], 'Aperture Priority Mode'[3] },
    Default : 3


$ uvcdynctrl -d video4 -s "Exposure, Auto Priority" 0
http://www.sphaero.org/blog:2012:0727_control_your_webcam_from_the_command_line


インストール方法
sudo apt-get install uvcdynctrl

Video4Linux関連

- [Video4Linuxによる画像の取り込み](https://staff.aist.go.jp/naoyuki.ichimura/research/tips/v4ln_j.htm)
- [Video4linux](http://fukuchi.org/oss4art/Video4linux)
- [USBカメラ（UVC）の制御](http://wikiwiki.jp/akamonzaka/?cv%2Fsamples%2Flibwebcam)
- [8/7にやったこと(libwebcamを利用)](http://ameblo.jp/sy-eng/entry-12059340836.html)





Ubuntu [超初心者が３台のWebカメラで防犯カメラサーバー構築]
(http://devoutaman515.dip.jp/linux_motion/bouhan.html)


記事 [Video4Linuxコントロールパネル]
(http://gihyo.jp/admin/serial/01/ubuntu-recipe/0230)

UVCに関する詳細の情報を得られるヒントの記事
[UVCカメラドライバーの製作　PIC24F/PIC32MX]
(http://www.suwa-koubou.jp/micom/UVCwebcam/uvc.html)



###**RaspberryPi関連**
RaspberryPi [RaspberryPiでウェブカメラは簡単に動いた]
(http://gataro-avr-ken.cocolog-nifty.com/blog/2013/05/raspberrypi-22b.html)

RaspberryPi [pi で遊んでみる (Webカメラ)]
(http://www.ahirustudio.com/gadget/rasp_pi_work2/)

RaspberryPi [RaspberryPiでWebカメラを使ってストリーミング動画を配信させてみた]
(http://mizna.hatenablog.com/entry/2014/11/17/171127)

RaspberryPi [RaspberryPiというかRaspbianで動くWebCAM監視カメラ(ライブカメラ)](https://linux.yebisu.jp/memo/800)


RaspberryPiは、Linux系の組み込みボードよりは簡単にテストに使うことができる。Pythonでimport cv2でOpenCVのバインディングを取り込むと、cv2.VideoCapture()を使ってビデオキャプチャをすることができる。キャプチャのためのインスタンスに足してget(propId) , set(propId, value) をすることができる。対応するUVCカメラが同一のものであっても、get()やset()の値はWindowsとLinuxの場合で異なることもあるようだ。

[Python: cv2.VideoCapture.get(propId) 
Python: cv2.VideoCapture.set(propId, value)](http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html)


以下の記事を読む限り、当分はUSB3は利用できないらしい(2016時点)。
http://makezine.jp/blog/2016/03/eben-upton-talks-about-the-new-raspberry-pi-3.html


Raspberry Piカメラのセットアップ方法
http://www.rs-online.com/designspark/electronics/jpn/knowledge-item/raspberry-pi-camera-setup
Raspberry_Pi_Camera実装
http://techstorage.interlink.ne.jp/?p=1038


[Raspberry Pi用広角カメラモジュール](https://www.switch-science.com/catalog/3211/)

Camera Serial Interface
https://en.wikipedia.org/wiki/Camera_Serial_Interface

---
Rasppberry Pi用のカメラが大幅に性能アップした件

RaspberryPiでは、専用のインタフェースでカメラモジュールを接続することができる。
ソニー製センサーで800万画素と大幅に性能アップしたRaspberry Pi用カメラモジュールが登場
http://gigazine.net/news/20160426-raspberry-pi-8m-camera/
![](http://cdn-img.auone.jp/spnews/image/ggz/2016/04/ggz_CLM201604260010/ggz_CLM201604260010_01_l.jpg)


Interface
緊急特集 ソニー技術者が徹底解説 
新型ラズパイ・カメラ
7月25日発売　定価 926円＋税
http://www.kumikomi.net/interface/contents/201609.php

![Interface](http://shop.cqpub.co.jp/hanbai/books/MIF/MIF201609.jpg)


----




###**Armadillo関連**
Armadillo-500 [Howto : UVC対応Webカメラを使用してディスプレイに動画像を表示する]
(http://armadillo.atmark-techno.com/howto/webcam-display)

Armadillo-500 [Howto : UVC対応Webカメラを使用してストリーミング配信をおこなう]
(http://armadillo.atmark-techno.com/howto/webcam-streaming)

Armadillo [ET2006デモ紹介 - ネットワーク対応監視カメラシステム](http://armadillo.atmark-techno.com/articles/et2006/network-camera)


USB3.0 は
[Armadillo-EVA 1500]
(http://armadillo.atmark-techno.com/armadillo-eva-1500)
では1入出力が利用可能。


###**BeagleBone Black**
[HD Camera Cape for BeagleBone Black](http://www.ti.com/devnet/docs/catalog/endequipmentproductfolder.tsp?actionPerformed=productFolder&productId=19580)
[Beagle Bone BlackとWebカメラ(logitech C310)で高速！OpenCVで顔認識]
(http://qiita.com/nonbiri15/items/9593d61a2be81f2b31a9)



###**Zynq関連**

zynq [ZYBOでUSBカメラを使う]
(http://www.sweetcafe.jp/?p=322)

zynq [petalinux v2013.04@tb-7z-020-emcのUVCドライバ]
(http://blog.livedoor.jp/yhmtmt/archives/30171128.html)


###**組み込みカメラ**
UVCの組み込みカメラの例です。

組み込みカメラ　[USB接続の産業用組込カメラです。 ドライバはUVCに対応し、Windowsであれば、標準ドライバで動作します。]
(http://www.shikino.co.jp/products/output-usb-index.html)


組み込みカメラ　[ドライバのインストールが不要なUVCカメラです。USB2.0で簡単に接続でき、Windows、LinuxいずれのPCでも接続してすぐ動きます。](http://www.mvision.co.jp/mcm4350fish.html)

組み込みカメラ　[CMOSカメラモジュール](http://www.chemi-con.co.jp/catalog/meca.html) モジュールとインタフェース基板とを組み合わせることでUSBカメラとすることができます。

組み込みカメラ [USB2.0インターフェイスカメラモジュール](http://www.aelnet.co.jp/html/pixelimage/index.html)

組み込み用途のUSBカメラの例

10 Years Surveillance Systems and USB Cameras Designer and Manufacturer
http://www.elpcctv.com/5megapixel-usb-camera-module-usb20-omnivision-ov5640-color-cmos-sensor-21mm-lens-p-215.html

http://sentech.co.jp/choice/index.html


[FA-CAM202 2M-Pixel USB Camera for NanoPi2, Plug and Play](http://www.friendlyarm.com/index.php?route=product/product&path=78&product_id=90)


###**cv::VideoCaptureのバッファリングに注意**
OpenCVのVideoCaptureを使う場合には、画像がバッファリングされていることに注意を要します。コード上でreadした時刻と、実際にその画像が撮影された時刻とが違うことに注意をしてください。特にreadする頻度が乏しいときには、その問題が顕著なものになります。

OpenCVのVideoCapture()ではset()メソッドで実は対応していない項目とかがみられる。Linuxの場合だとVideo4Linuxを使って制御すべきなのだろう。Video4Linuxの場合の設定可能な項目名と、OpenCVのVideoCapture()ではset()メソッドでは、カバーしている範囲が違うようだ。また同一のUSBカメラを用いていても、LinuxとWindowsで値の範囲が違っていることを経験した。


###**外部トリガーを利用可能なカメラの調査**
外部トリガーを用いると複数台のカメラを同期した撮影が可能になります。
[外部トリガーが可能な種類のUSBカメラを調査中](http://qiita.com/nonbiri15/items/bfc9254cba943c110d56)




###**レンズについても調べてみる**
　画像処理・画像認識は、取得する画像自体がどのようであるのかに強く依存します。
小型のカメラモジュールでレンズを交換可能なものにM12(Sマウント)のレンズがあります。
それらについての調査中の記事が次のものです。
[M12(Sマウント)のレンズについて調査中](http://qiita.com/nonbiri15/items/635ba96cf2c8f82f5040)

注１：
[マルチカメラ－パソコン1台にカメラは何台接続できる？]
(http://www.skylogiq.co.jp/blog/20121204_saito/index.html)

[2台同時入力は可能ですか？（複数台同時入力は可能ですか？）]
(http://www.mvision.co.jp/mcm4350fish.html)



------------------------------------------------------------

USBカメラとしてUSB2.0,USB3.0の両方があるが、
USB2.0しか対応していないボードや、カメラ側も多く帯域の問題を生じやすい。


LinuxBoard　     USB3.0
RaspberryPi 2 B  x
RaspberryPi 3 B  x

Jetson TK1      USB 3.0 Type A
Jetson TX1      USB 3.0 Type A

Armadillo-EVA 1500 USB 3.0（Host）対応
Armadillo-IoTゲートウェイ G3  x



-----------------
###**USBカメラでもなく専用カメラでもないカメラを接続するときには**
そのボードに対して専用カメラが用意されていない場合で、しかもUSBカメラでないタイプを接続しようとするときには、
interface　のバックナンバーの記事を読んでみるのがよさそうだ。
http://www.kumikomi.net/interface/contents/201411.php

![MIF201411l.jpg](https://qiita-image-store.s3.amazonaws.com/0/83761/2db6df89-e96d-d62f-ebf3-1bd805f0f526.jpeg)

USBではないインタフェースでカメラを利用することは次のようなメリットを引き出せる可能性があります。
・カメラが持っている本来の処理能力でフレームレートが出せる場合がある。
・カメラのコントロールをカメラ内のレジスタを書き換えることで、高次のライブラリでは手が届かない範囲を制御できる。
・カメラ側で画像を圧縮・CPU側で画像をdecodeするという無駄をなくすことができる。
　画像を圧縮・画像をdecodeするという処理は、レイテンシーを大きくする。
　USBカメラからの圧縮画像をdecodeすることにCPUのリソースを使わずに済む。
・USBインタフェース部分は、帯域をあいたままにすることができる。

[RICHO のTHETA S ライブ映像をパソコンで見る]
(https://support.theta360.com/ja/manual/s/content/streaming/streaming_01.html)