📄 main.cpp
字号:
* Test a camera's pan/tilt properties
*
* See also:
*
* IAMCameraControl Interface
* http://msdn2.microsoft.com/en-us/library/ms783833.aspx
* PROPSETID_VIDCAP_CAMERACONTROL
* http://msdn2.microsoft.com/en-us/library/aa510754.aspx
*/
HRESULT test_pan_tilt(IBaseFilter *pBaseFilter)
{
HRESULT hr = 0;
IAMCameraControl *pCameraControl = NULL;
ControlInfo panInfo = { 0 };
ControlInfo tiltInfo = { 0 };
ControlInfo zoomInfo = { 0 };
ControlInfo focusInfo = { 0 };
long value = 0, flags = 0;
printf(" Reading pan/tilt property information ...\n");
// Get a pointer to the IAMCameraControl interface used to control the camera
hr = pBaseFilter->QueryInterface(IID_IAMCameraControl, (void **)&pCameraControl);
if(hr != S_OK)
{
fprintf(stderr, "ERROR: Unable to access IAMCameraControl interface.\n");
return hr;
}
// Retrieve information about the pan and tilt controls
hr = pCameraControl->GetRange(CameraControl_Pan, &panInfo.min, &panInfo.max, &panInfo.step, &panInfo.def, &panInfo.flags);
if(hr != S_OK)
{
fprintf(stderr, "ERROR: Unable to retrieve CameraControl_Pan property information.\n");
return hr;
}
printf(" Pan control:\n");
print_control_info(&panInfo);
hr = pCameraControl->GetRange(CameraControl_Tilt, &tiltInfo.min, &tiltInfo.max, &tiltInfo.step, &tiltInfo.def, &tiltInfo.flags);
if(hr != S_OK)
{
fprintf(stderr, "ERROR: Unable to retrieve CameraControl_Tilt property information.\n");
return hr;
}
printf(" Tilt control:\n");
print_control_info(&tiltInfo);
hr = pCameraControl->GetRange(CameraControl_Zoom, &zoomInfo.min, &zoomInfo.max, &zoomInfo.step, &zoomInfo.def, &zoomInfo.flags);
if(hr != S_OK)
{
fprintf(stderr, "ERROR: Unable to retrieve CameraControl_Zoom property information.\n");
return hr;
}
printf(" Zoom control:\n");
print_control_info(&zoomInfo);
hr = pCameraControl->GetRange(CameraControl_Focus, &focusInfo.min, &focusInfo.max, &focusInfo.step, &focusInfo.def, &focusInfo.flags);
if(hr != S_OK)
{
fprintf(stderr, "ERROR: Unable to retrieve CameraControl_Focus property information.\n");
return hr;
}
printf(" Focus control:\n");
print_control_info(&focusInfo);
int j,k,t=-1;
set_mechanical_pan_relative(pCameraControl, -180);
Sleep(2000);
set_mechanical_tilt_relative(pCameraControl, -180);
Sleep(2000);
set_mechanical_pan_relative(pCameraControl, 180);
Sleep(2000);
set_mechanical_tilt_relative(pCameraControl, 180);
Sleep(2000);
for(j=tiltInfo.min;j<0;j+=tiltInfo.step)
{
for(k=panInfo.min;k<0;k+=panInfo.step)
{
set_mechanical_pan_relative(pCameraControl, t);
Sleep(250);
printf("Set Pan: %d\n",k);
}
set_mechanical_pan_relative(pCameraControl, 0);
for(k=0;k<panInfo.max;k+=panInfo.step)
{
set_mechanical_pan_relative(pCameraControl, t);
Sleep(250);
printf("Set Pan: %d\n",k);
}
set_mechanical_tilt_relative(pCameraControl,1);
Sleep(500);
set_mechanical_pan_relative(pCameraControl,180);
t=-t;
Sleep(500);
printf("Set Tilt: %d\n",j);
}
//printf(" Resetting pan/tilt/zoom ...\n");
//reset_machanical_pan_tilt(pCameraControl);
//reset_digital_pan_tilt(pCameraControl);
//reset_digital_zoom(pCameraControl);
//Sleep(3000);
///*/
////*/
//printf(" Testing mechanical pan ...\n");
//set_mechanical_pan_relative(pCameraControl, 40);
//set_mechanical_pan_relative(pCameraControl, 20);
//set_mechanical_pan_relative(pCameraControl, -20);
//set_mechanical_pan_relative(pCameraControl, -40);
//Sleep(3000);
////*/
////*/
//printf(" Testing mechanical tilt ...\n");
//set_mechanical_tilt_relative(pCameraControl, 20);
//set_mechanical_tilt_relative(pCameraControl, 10);
//set_mechanical_tilt_relative(pCameraControl, -10);
//set_mechanical_tilt_relative(pCameraControl, -20);
//Sleep(3000);
////*/
////*/
//printf(" Testing digital pan/tilt/zoom ...\n");
//set_digital_zoom_absolute(pCameraControl, 100); // Zoom to 200%
//Sleep(1000);
//set_digital_pan_absolute(pCameraControl, 40);
//Sleep(1000);
//set_digital_pan_absolute(pCameraControl, 80);
//Sleep(1000);
//set_digital_zoom_absolute(pCameraControl, 200); // Zoom to 400%
//Sleep(1000);
//set_digital_tilt_absolute(pCameraControl, 40);
//Sleep(1000);
//set_digital_tilt_absolute(pCameraControl, 60);
//Sleep(1000);
//
//reset_digital_pan_tilt(pCameraControl);
//Sleep(1000);
//reset_digital_zoom(pCameraControl);
//Sleep(3000);
////*/
////*/
//printf(" Testing digital zoom ...\n");
//for(int i = zoomInfo.min; i <= zoomInfo.max; i += zoomInfo.step)
//{
// set_digital_zoom_absolute(pCameraControl, i);
// Sleep(10);
//}
//Sleep(1000);
//for(int i = zoomInfo.max; i >= zoomInfo.min; i -= zoomInfo.step)
//{
// set_digital_zoom_absolute(pCameraControl, i);
// Sleep(10);
//}
//Sleep(3000);
////*/
/*printf(" Testing focus ...\n");
Sleep(1000);
for(int i = focusInfo.max; i >= focusInfo.min; i -=focusInfo.step)
{
set_focus_absolute(pCameraControl, i);
printf("setting focus to: %d \n",i);
Sleep(100);
}
for(int i = focusInfo.min; i < focusInfo.max; i +=focusInfo.step)
{
set_focus_absolute(pCameraControl, i);
printf("setting focus to: %d \n",i);
Sleep(100);
}
set_autofocus_absolute(pCameraControl, 0);
system("pause");
//*/
return S_OK;
}
/*
* Do something with the filter. In this sample we just test the pan/tilt properties.
*/
void process_filter(IBaseFilter *pBaseFilter)
{
test_pan_tilt(pBaseFilter);
}
/*
* Enumerate all video devices
*
* See also:
*
* Using the System Device Enumerator:
* http://msdn2.microsoft.com/en-us/library/ms787871.aspx
*/
int enum_devices()
{
HRESULT hr;
printf("Enumerating video input devices ...\n");
// Create the System Device Enumerator.
ICreateDevEnum *pSysDevEnum = NULL;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void **)&pSysDevEnum);
if(FAILED(hr))
{
fprintf(stderr, "ERROR: Unable to create system device enumerator.\n");
return hr;
}
// Obtain a class enumerator for the video input device category.
IEnumMoniker *pEnumCat = NULL;
hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
if(hr == S_OK)
{
// Enumerate the monikers.
IMoniker *pMoniker = NULL;
ULONG cFetched;
while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
{
IPropertyBag *pPropBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
(void **)&pPropBag);
if(SUCCEEDED(hr))
{
// To retrieve the filter's friendly name, do the following:
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if (SUCCEEDED(hr))
{
// Display the name in your UI somehow.
wprintf(L" Found device: %s\n", varName.bstrVal);
}
VariantClear(&varName);
// To create an instance of the filter, do the following:
IBaseFilter *pFilter;
hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
(void**)&pFilter);
process_filter(pFilter);
//Remember to release pFilter later.
pPropBag->Release();
}
pMoniker->Release();
}
pEnumCat->Release();
}
pSysDevEnum->Release();
return 0;
}
int wmain(int argc, wchar_t* argv[])
{
int result;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
result = enum_devices();
CoUninitialize();
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -