Существует несколько API от Microsoft, которые предоставляют доступ к данным изображения.
- Твен: используется для захвата одного изображения со сканеров и т. Д.
- WIA: похоже, выродилась в одну библиотеку кодеков изображений.
- VfW: очень старый (Win16) API, который действительно работает только для кодирования / декодирования видеофайлов, но имеет поддержку для некоторого захвата видео.
- DirectShow: ранее входил в DirectX SDK, в настоящее время в Platform SDK. Это место для текущих (общих) потоковых решений.
- Windows Media / Media Foundation: похоже, это больше подходит для воспроизведения / перекодирования видео.
- Специальные библиотеки производителя: Pylon / Halcon / Imaging Control /...
DirectShow конкретно:
Для создания устройств получения изображений под Windows вы должны предоставить либо устройство (драйвер), которое реализует интерфейсы потоковых классов (или более новый Avstream), либо вы должны написать COM-объект пользовательского режима, который должен быть добавлен в перечислитель VideoInputCategory.
Образец Avstream предоставляет все для реального устройства получения изображений. Только нижний слой для реального устройства действительно отсутствует.
Если вы можете спроектировать устройство, вы должны создать DCAM или UVC-совместимое устройство. Для обоих есть встроенные драйверы от Windows.
Как написать программный источник устройства:
Вы должны создать фильтр DirectShow, который обеспечивает как минимум один выходной контакт, и зарегистрировать его в VideoInputCategory. Может быть несколько интерфейсов, которые определенные приложения требуют от приложения захвата, но они зависят от самого приложения. Простыми приложениями для проверки фильтров являются GraphEdit и AMCap, которые поставляются в Plattform SDK.
Код:
#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, созданный для этой записи «виртуального устройства».