Visualization Tool Kit(VTK)など

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();

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー

チュートリアル

アルゴリズム(数学)

並列計算

STL

#include<memory> #include<string> #include<sstream> #include<algorithm> #include<functional> #include<numeric>

Media Foundation

【メニュー編集】
Wiki記法ガイド

メンバーのみ編集できます