画像データへのアクセスを提供する Microsoft の API がいくつかあります。
- Twain: スキャナーなどからの単一イメージのキャプチャーに使用されます。
- WIA: これは単一の画像コーデック ライブラリに退化したようです。
- VfW: 非常に古い (Win16) API で、実際には Video-File のエンコード/デコードのみを行いますが、一部のビデオ取得をサポートしています。
- DirectShow: 以前は DirectX SDK に含まれていましたが、現在は Platform SDK に含まれています。これは、現在の (一般的な) ストリーミング ソリューションの場所です。
- Windows Media/Media Foundation: これは、ビデオの再生/再エンコードを対象としているようです。
- メーカー固有のライブラリ: Pylon/Halcon/Imaging Control/...
DirectShow固有:
Windows で画像取得デバイスを作成するには、streamclasses インターフェイス (または新しい Avstream) を実装するデバイス (ドライバー) を提供するか、VideoInputCategory 列挙子に追加する必要があるユーザーモード COM オブジェクトを作成する必要があります。
Avstream サンプルは、実画像取得デバイスのすべてを提供します。実際に欠落しているのは、実際のデバイスの下層だけです。
デバイスを設計できる場合は、DCAM または UVC 互換のデバイスを作成する必要があります。どちらの場合も、Windows によって提供される組み込みドライバーがあります。
ソフトウェアソースデバイスの書き方:
少なくとも 1 つの出力ピンを提供する DirectShow フィルターを作成し、これを VideoInputCategory の下に登録する必要があります。特定のアプリケーションがキャプチャ アプリケーションから必要とするインターフェイスがいくつかある場合がありますが、これらはアプリケーション自体に依存します。フィルターを試すための簡単なアプリケーションは、Plattform SDK で提供される GraphEdit と AMCap です。
いくつかのコード:
#include <InitGuid.h>
#include <streams.h>
const AMOVIESETUP_MEDIATYPE s_VideoPinType =
{
&MEDIATYPE_Video, // Major type
&MEDIATYPE_NULL // Minor type
};
const AMOVIESETUP_PIN s_VideoOutputPin =
{
L"Output", // Pin string name
FALSE, // Is it rendered
TRUE, // Is it an output
FALSE, // Can we have none
FALSE, // Can we have many
&CLSID_NULL, // Connects to filter
NULL, // Connects to pin
1, // Number of types
&s_VideoPinType // Pin details
};
const AMOVIESETUP_FILTER s_Filter =
{
&CLSID_MyFilter, // Filter CLSID
L"bla", // String name
MERIT_DO_NOT_USE, // Filter merit
1, // Number pins
&s_VideoOutputPin // Pin details
};
REGFILTER2 rf2;
rf2.dwVersion = 1;
rf2.dwMerit = MERIT_DO_NOT_USE;
rf2.cPins = 1;
rf2.rgPins = s_Filter.lpPin;
HRESULT hr = pFilterMapper->RegisterFilter( CLSID_MyFilter, _FriendlyName.c_str(), 0,
&CLSID_VideoInputDeviceCategory, _InstanceID.c_str(), &rf2 );
if( FAILED( hr ) )
{
return false;
}
std::wstring inputCat = GUIDToWString( CLSID_VideoInputDeviceCategory );
std::wstring regPath = L"CLSID\\" + inputCat + L"\\Instance";
win32_utils::CRegKey hKeyInstancesDir;
LONG rval = openKey( HKEY_CLASSES_ROOT, regPath, KEY_WRITE, hKeyInstancesDir );
if( rval == ERROR_SUCCESS )
{
win32_utils::CRegKey hKeyInstance;
rval = createKey( hKeyInstancesDir, _InstanceID, KEY_WRITE, hKeyInstance );
....
_InstanceID は、この「仮想デバイス」エントリ用に作成された GUID です。