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対応カメラを複数台つなげるときは帯域に注意する
-
USBハブ使用時の同一の品番のUSBカメラ認識問題
- USBハブによっては、同一の品番のUSBカメラに対しては適切に認識しない機種があるらしい。PCI-ExpressでUSBポートを増設してUSBカメラを増設するというやりかたもあるらしい。
カメラの特性のget,set問題
- カメラの特性のget,setがライブラリとカメラの組み合わせによっては必ずしも細かな制御ができるようになっていないこと。-
バッファ制御問題
- ライブラリによっては、バッファに入っている画像のために、撮影した時刻と取得した時刻に無視できないずれを生じることがある。
- virtual bool cv::VideoCapture::grab() を使ってでデコードすることなしに、バッファに入っている画像データだけ取得して、遅延を減らす方法もある。
- ライブラリによっては、バッファに入っている画像のために、撮影した時刻と取得した時刻に無視できないずれを生じることがある。
画像データを保存することだけが目的ならば、画像データをデコードせずに、バイナリを受け取って、バイナリファイルを直接保存する。画像の表示はしないという手もある。
USBカメラのさまざまな形状
- ピンホールカメラ型
- 産業用の部材としての基板ベースのUSBカメラ
USBカメラといってもさまざまな形態がある。目的に応じて、選ぼう。
USBカメラの記事へのリンク
Ubuntu + UVC 対応カメラ インストール
まずは UVCドライバのインストール
sudo apt-get install uvccapture guvcview luvcviewLinux UVC driverのインストール, uvccaptureのインストール(ソースコードからのインストール方法)
コンパイル済みをインストールする方法
$sudo apt-get -y install uvccapture
まずは「イメージコントロール」タブです。ここでは,輝度や彩度,ホワイトバランスや露出など,カメラの基本パラメータを設定できます。
とある。
さらに
guvcviewの以上の機能のうち,GUIとコーデックを除くものは,libwebcamが実現しています。libwebcamはLinuxのVideo for Linux (V4L)のインターフェースを更に抽象化するライブラリです。
とある。
Video4Linuxコントロールパネル(v4l2ucp)を使うことで,V4Lサブシステムから,ウェブカメラをダイレクトにコントロールできます。
とある。
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関連
Ubuntu 超初心者が3台のWebカメラで防犯カメラサーバー構築
UVCに関する詳細の情報を得られるヒントの記事
UVCカメラドライバーの製作 PIC24F/PIC32MX
RaspberryPi関連
RaspberryPi RaspberryPiでウェブカメラは簡単に動いた
RaspberryPi pi で遊んでみる (Webカメラ)
RaspberryPi RaspberryPiでWebカメラを使ってストリーミング動画を配信させてみた
RaspberryPi RaspberryPiというかRaspbianで動くWebCAM監視カメラ(ライブカメラ)
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)
以下の記事を読む限り、当分は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
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/
Interface
緊急特集 ソニー技術者が徹底解説
新型ラズパイ・カメラ
7月25日発売 定価 926円+税
http://www.kumikomi.net/interface/contents/201609.php
Armadillo関連
Armadillo-500 Howto : UVC対応Webカメラを使用してディスプレイに動画像を表示する
Armadillo-500 Howto : UVC対応Webカメラを使用してストリーミング配信をおこなう
Armadillo ET2006デモ紹介 - ネットワーク対応監視カメラシステム
USB3.0 は
Armadillo-EVA 1500
では1入出力が利用可能。
BeagleBone Black
HD Camera Cape for BeagleBone Black
Beagle Bone BlackとWebカメラ(logitech C310)で高速!OpenCVで顔認識
Zynq関連
zynq ZYBOでUSBカメラを使う
zynq petalinux v2013.04@tb-7z-020-emcのUVCドライバ
組み込みカメラ
UVCの組み込みカメラの例です。
組み込みカメラ USB接続の産業用組込カメラです。 ドライバはUVCに対応し、Windowsであれば、標準ドライバで動作します。
組み込みカメラ ドライバのインストールが不要なUVCカメラです。USB2.0で簡単に接続でき、Windows、LinuxいずれのPCでも接続してすぐ動きます。
組み込みカメラ CMOSカメラモジュール モジュールとインタフェース基板とを組み合わせることでUSBカメラとすることができます。
組み込みカメラ USB2.0インターフェイスカメラモジュール
組み込み用途の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
FA-CAM202 2M-Pixel USB Camera for NanoPi2, Plug and Play
cv::VideoCaptureのバッファリングに注意
OpenCVのVideoCaptureを使う場合には、画像がバッファリングされていることに注意を要します。コード上でreadした時刻と、実際にその画像が撮影された時刻とが違うことに注意をしてください。特にreadする頻度が乏しいときには、その問題が顕著なものになります。
OpenCVのVideoCapture()ではset()メソッドで実は対応していない項目とかがみられる。Linuxの場合だとVideo4Linuxを使って制御すべきなのだろう。Video4Linuxの場合の設定可能な項目名と、OpenCVのVideoCapture()ではset()メソッドでは、カバーしている範囲が違うようだ。また同一のUSBカメラを用いていても、LinuxとWindowsで値の範囲が違っていることを経験した。
外部トリガーを利用可能なカメラの調査
外部トリガーを用いると複数台のカメラを同期した撮影が可能になります。
外部トリガーが可能な種類のUSBカメラを調査中
レンズについても調べてみる
画像処理・画像認識は、取得する画像自体がどのようであるのかに強く依存します。
小型のカメラモジュールでレンズを交換可能なものにM12(Sマウント)のレンズがあります。
それらについての調査中の記事が次のものです。
M12(Sマウント)のレンズについて調査中
注1:
マルチカメラ-パソコン1台にカメラは何台接続できる?
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
USBではないインタフェースでカメラを利用することは次のようなメリットを引き出せる可能性があります。
・カメラが持っている本来の処理能力でフレームレートが出せる場合がある。
・カメラのコントロールをカメラ内のレジスタを書き換えることで、高次のライブラリでは手が届かない範囲を制御できる。
・カメラ側で画像を圧縮・CPU側で画像をdecodeするという無駄をなくすことができる。
画像を圧縮・画像をdecodeするという処理は、レイテンシーを大きくする。
USBカメラからの圧縮画像をdecodeすることにCPUのリソースを使わずに済む。
・USBインタフェース部分は、帯域をあいたままにすることができる。