OpenCVで2台以上のUSBカメラを同時にうまく扱えなかったのでMedia Foundationについて調べてみた.
つながってるキャプチャデバイスの列挙や画像の取得ができ,画像をcv::Matに転送することに成功した.
つながってるキャプチャデバイスの列挙や画像の取得ができ,画像を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();
コメントをかく