web-dev-qa-db-ja.com

C ++ OpenCV 2.4.11:すべてのカメラを一覧表示

C++、OpenCV 2.4.11、Windows 8.1、Qt Creator 3.4.2を使用して、接続されているすべてのWebカメラ(USB Webカメラと内部Webカメラ)を一覧表示したいと思います。私にとっては、次の方法でアクセス可能なWebカメラの数を取得するだけで十分です。

VideoCapture videoCapture(0); // Will access my internal laptop webcam.
VideoCapture videoCapture(1); // Will access the first connected usb webcam.

これが私のコードです:

// Following procedure detects, how many webcams are accessible from 0 on upwards.
numberOfDevices = 0;
bool noError = true;

while (noError)
{
    try
    {
        // Check if camera is available.
        VideoCapture videoCapture(numberOfDevices); // Will crash if not available, hence try/catch.

        // ...
    }
    catch (...)
    {
        noError = false;
    }

    // If above call worked, we have found another camera.
    numberOfDevices++;
}

内部Webカメラをアクティブにした場合、try-blockのコードは機能します。ハードウェアマネージャーで内部カメラを非アクティブ化すると(ラップトップに他のカメラが接続されていない場合)、呼び出しが失敗し、次のエラーメッセージが表示されます(デバッグモード)。

Exception Triggered
---------------------------
The inferior stopped because it triggered an exception.<p>Stopped in thread 0 by: 
Exception at 0x7ff8533d9090, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance).

および次の2つのビルドの問題:

Exception at 0x7ff871af8b9c, code: 0xa1a01db1: , flags=0x0 (first chance)

Exception at 0x7ff8533d9090, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)

発生したエラーを取得するにはどうすればよいですか?ご覧のとおり、try/catchは機能しません。

または、そのようなダーティループなしでOpenCVで利用可能なすべてのWebカメラにアクセスできる方法はありますか?

6
Loomis

現時点では、OpenCVのカメラ数に関連する機能はまだありません(3.0.0バージョン) 対応するチケット を参照してください。

適切なカメラ処理は、OpenCV内部の問題のようです(たとえば、 ここ または ここ で説明されています)。通常、カメラをOpenCVで開いたまま物理的に無効にした後、キャプチャコードに表示されます(破壊されたファイル記述子を読み取ろうとした場合)。

通常、アクセス違反に対して独自のハンドラーを実装することもできます( このスレッド を調べてください)が、それは本当に汚いトリックです。

4
avtomaton

OpenCV内でデバイス(IDを含む)を列挙できるようにするこのC++クラスを作成しました。 GitHubでホストされています。

https://github.com/studiosi/OpenCVDeviceEnumerator

DirectShowを使用して、GUID CLSID_VideoInputDeviceCategoryのカテゴリを持つすべてのデバイスを取得し、列挙子を介して、システムに表示される順序(ID)を取得するという考え方です。 VideoCaptureオブジェクトを作成して(列挙上のデバイスのインデックスとなるIDを受け取るコンストラクターを使用して)OpenCVでそれらを開く必要があります。明らかに、このアプローチはWindowsでのみ機能します。

2
dagilpe