Mac対応コンピュータビジョン向けカメラ

先日の仕事で、Webカメラの性能だと微妙だなって感じがあったので、コンピュータビジョン向けカメラを検討し、導入してみたので共有。
使ってみた感想的にはWebカメラで足りるならWebカメラ使ったほうが気軽でいいね、といったところ。もちろんコンピュータビジョン向けのカメラにもメリットはあるのだが、気軽に、という感じではないのだ。

ロジクール c920r

前も紹介したがWebカメラ界最高峰。720Pで30fps出せる。こいつを使ってみてダメなときにコンピュータビジョン向けカメラを検討するべき。

Logicool ロジクール HD プロ ウェブカム c920r

Logicool ロジクール HD プロ ウェブカム c920r

コンピュータビジョン向けカメラとは

720Pで60fpsはUSB2.0だと厳しく、USB3かEthernetなんかが必要になってくる。気軽に使いたいのでUSB3対応のものにしようとしたところ、まさにUSB3Visionという規格が存在した。EthernetにはGigE Visionという規格が存在する。

また、Webカメラと違ってレンズとセンサが別だ。マウントとしてはCマウント、CSマウント、Sマウントなど。これらは監視カメラのレンズとしても使われているので、比較的簡単に手に入る。今回はCSマウントのモデルにした。CマウントとCSマウントは、Cマウントを小型化したものがCSマウントで、CSマウントのカメラにはCマウントをつけることが可能だが、その逆は不可能。詳しくは下記で。
第1回 Cマウントレンズと、CSマウントレンズ 編

USB3 Visionカメラの大手

  • Basler
  • IDS
  • Matrix Vision
  • Point Grey
  • SENTECH
  • The Imaging Source
  • 東芝テリー
  • XIMEA

もっとある感じだったけど、ざっと調べたところこんなところだった。

USB3 VisionMac対応

  • Basler
  • XIMEA

Macに対応しているのは上記2社のみで、このうち日本に代理店があるのはBaslerのみなのでBasler社のカメラを導入した。

Baslerのカメラ

エリアスキャンカメラ| Basler
f:id:miso_engine:20170710165610p:plain

スクリーンショットは上記URLから。

気軽に買えるのは、ace、pulse、dartあたりで、1個あたりの値段も ace -> pulse -> dartdartが一番安い)の順であるが、dartのみ最小ロットが5個*1とのことで、1個のみ導入する場合はpulseのほうが手軽になる。今回小型化が必要だったのでdartを選んだのだが、基板がむき出しになるので、扱いやすさを考えると多少スペースに余裕があるならpulseやaceを選ぶほうが良いと思う。

また、aceだと一部のセンサに限定される画像補正機能であるPGIが、pulseとdartではすべてのセンサで有効とのこと。

ソフトについて

https://www.baslerweb.com/jp/support/downloads/software-downloads/pylon-5-0-5-osx/

BaslerはPylonというSDKを出している。これがmac対応しているわけだ。SDK自体の出来は問題なく、サンプルコードを見て簡単にOpenCVに組み込めたし、openFrameworksで扱うことにも成功した。まぁ理想を言えばUSB3 VisionがUVCのようにOpenCVなどのライブラリが標準対応してほしくはある。

また、Pylon Viewerというアプリで簡単にカメラとの接続確認やパラメータの確認なども出来て、macで開発自体スムーズに出来た。

*1:今回利用した代理店の制約かもしれない

ビデオ会議で重要なのは音声だった

ビデオ会議システムを構築したところ、スムーズなコミュニケーションに重要なのは、

  1. 音声の質
  2. 映像のフレームレート
  3. 映像の解像度

という順に重要だということがわかった。音声でまず問題になったのがエコーで、エコーキャンセラーをソフトウェア的に実現*1しようとするもどうもうまくいかず、ハードウェア側で対応しているもの(今回はYAMAHAのYVC-1000)に切り替えたところ劇的に改善した。

このYVC-1000は、エコーキャンセルも強力ながらその他のビデオ会議向け音質改善技術(マイク自動追尾、オートゲインコントロール、ノイズリダクション、残響抑圧、オートルームEQ)が搭載されており、その機能によりビデオ会議のクオリティが大変向上した。これらの機能は簡単に言うと人の声以外の音をカットし人の声のみを強調し、その音圧を一定にする。これにより非常に聞き取りやすくなる。YVC-1000のマイクの前で小さめの声で喋ってもそれを拾って聞きやすい音量で再生するため、遠隔地にいるほうがささやき声的な発言だと聞きやすいという逆転現象さえ起きてしまった。

ビデオ会議に不満がある方は導入検討の価値ありだと思う。

YVC-300

YVC-1000単体だと約10万円かかるが、ほぼ同機能が搭載されたスピーカー・マイク一体型のYVC-300が約4万円。
YVC-300 - スピーカーフォン/マイク&スピーカー - ヤマハ株式会社

その他スピーカーフォンメーカー

*1:オープンソースのものはwebrtcで実装されている

openFrameworksでWebカメラを自動的に接続する

oFで自動的に接続するシリーズ。

ofVideoGrabberで適当にデバイスの数字とかでやってるとノートPC内蔵のWebカメラ起動しちゃったりするんだけど、それを避けて常に特定のカメラを開けるようにする。避け方は簡単でWebカメラの名前(=ofVideoDeviceのdeviceName)を見て開けばOK。今回はロジクールのC920ってカメラだからC920って名前があるやつを開くだけ。

#define CAM_WIDTH 1296
#define CAM_HEIGHT 729

ofVideoGrabber cam;

void HogeClass::setup(){
    if(cam.isInitialized() == false){
        cout << "Initalizing cam" << endl;
        int index = 0;
        vector<ofVideoDevice> devices = cam.listDevices();
        for(int i=0; i<devices.size(); i++){
            ofVideoDevice& device = devices.at(i);
            cout << i  << ":" << device.deviceName << ":" << endl;
            if(device.deviceName.find("C920") != std::string::npos){
                index = i;
            }
        }
        cam.setDeviceID(index);
        cam.initGrabber(CAM_WIDTH, CAM_HEIGHT);
        cout << cam.getWidth() << "," << cam.getHeight() << endl;
        
        return;
    }
}

CAM_WIDTHとCAM_HEIGHTの数字はC920における秘伝のタレ。良いカメラでっせ。

Logicool ロジクール HD プロ ウェブカム c920r

Logicool ロジクール HD プロ ウェブカム c920r

2018/05/16 コード修正

@shigeodayo氏に指摘されてdevice.deviceName.find()のところの判定をちゃんとstd::string::nposにするように変更。また、cam.listDevices()がループ内で呼び出されてコンソールに意図しない出力が出てるのも修正。