⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 Logitech USB PTZ Camera Control example for Windows DDK/SDK.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
 * 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 + -