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