Linux
OpenCV
RaspberryPi
USBカメラ

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ハブ使用時の同一の品番のUSBカメラ認識問題

    • USBハブによっては、同一の品番のUSBカメラに対しては適切に認識しない機種があるらしい。PCI-ExpressでUSBポートを増設してUSBカメラを増設するというやりかたもあるらしい。
  • カメラの特性のget,set問題
    - カメラの特性のget,setがライブラリとカメラの組み合わせによっては必ずしも細かな制御ができるようになっていないこと。

  • バッファ制御問題

    • ライブラリによっては、バッファに入っている画像のために、撮影した時刻と取得した時刻に無視できないずれを生じることがある。
      • virtual bool cv::VideoCapture::grab()を使ってでデコードすることなしに、バッファに入っている画像データだけ取得して、遅延を減らす方法もある。

USBカメラのさまざまな形状

  • web会議用のカメラ
  • 産業用のカメラに近い形状
  • 顕微鏡形のUSBカメラ
  • 顕微鏡形のUSBカメラの例

- ピンホールカメラ型

 ピンホールカメラ型の例
 

usb ピンホールカメラで検索

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

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

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

USBカメラ(UVCカメラ)を使う

コンパイル済みをインストールする方法

$sudo apt-get -y install uvccapture

第303回 guvcviewで簡単ビデオ撮影を読むと、

まずは「イメージコントロール」タブです。ここでは,輝度や彩度,ホワイトバランスや露出など,カメラの基本パラメータを設定できます。

とある。

さらに

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

とある。

Video for Linuxサブシステム
には

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

とある。

uvcdynctrl ユーティリティについて

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カメラで防犯カメラサーバー構築

記事 Video4Linuxコントロールパネル

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

Raspberry Pi用広角カメラモジュール

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

Interface


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

http://sentech.co.jp/choice/index.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台にカメラは何台接続できる?

2台同時入力は可能ですか?(複数台同時入力は可能ですか?)


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

USBではないインタフェースでカメラを利用することは次のようなメリットを引き出せる可能性があります。
・カメラが持っている本来の処理能力でフレームレートが出せる場合がある。
・カメラのコントロールをカメラ内のレジスタを書き換えることで、高次のライブラリでは手が届かない範囲を制御できる。
・USBインタフェース部分は、帯域をあいたままにすることができる。