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カメラにアクセスできる方法はありますか?
OpenCV内でデバイス(IDを含む)を列挙できるようにするこのC++クラスを作成しました。 GitHubでホストされています。
https://github.com/studiosi/OpenCVDeviceEnumerator
DirectShowを使用して、GUID CLSID_VideoInputDeviceCategoryのカテゴリを持つすべてのデバイスを取得し、列挙子を介して、システムに表示される順序(ID)を取得するという考え方です。 VideoCaptureオブジェクトを作成して(列挙上のデバイスのインデックスとなるIDを受け取るコンストラクターを使用して)OpenCVでそれらを開く必要があります。明らかに、このアプローチはWindowsでのみ機能します。