OpenCVで2台以上のUSBカメラを同時にうまく扱えなかったのでMedia Foundationについて調べてみた.
つながってるキャプチャデバイスの列挙や画像の取得ができ,画像をcv::Matに転送することに成功した.
//おまじない
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
MFStartup(MF_VERSION);
//デバイスの準備
IMFMediaSource *src;
IMFAttributes *attr;
IMFActivate **devices;
UINT32 count = 0;
IMFAttributes *attributes = nullptr;
attributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID);
MFEnumDeviceSources(attributes, &devices, &count);
//devices : 見つかったキャプチャーデバイスのアレイ
//count : 見つかったキャプチャーデバイスの数
//キャプチャーデバイスの初期化
IMFSourceReader *reader;
IMFMediaSource *source = nullptr;
devices[0]->ActivateObject( __uuidof(IMFMediaSource), (void**)&source);
MFCreateSourceReaderFromMediaSource(source, NULL, &reader);
//キャプチャ
IMFSample *sample;
reader->ReadSample((DWORD)MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, NULL, NULL, NULL, &sample);
if(sample)
{
IMFMediaBuffer* buffer;
BYTE* data;
DWORD max, current;
sample->GetBufferByIndex(0, &buffer);
buffer->Lock(&data, &max, &cur);
//
// OpenCVに渡すならここで画素値をcv::Matにコピー.
// YUY2(YUV422)だったりしたらYUV444に変換してcv::cvtColorしよう.
//
buffer->UnLock();
SafeRelease(&buffer);
}
SafeRelease(&sample);
//終了処理(足りてるか不明)
SafeRelease(&source);
MFShutdown();
CoUninitialize();