CUSB摄像机虚拟云台控制

科技玩点原始事 2024-03-08 23:43:11

仅有USB连接的摄像机,通常没有云台(PTZ)控制功能。即便是带云台的摄像机,也需要红外遥控器、网络,或者RS-232(485)进行控制,仅通过USB是无法控制的。

但是在摄像机的属性菜单中,是可以进行“虚拟”云台的控制。这时的缩放、左右(上下)平移,是图像被数字放大后,可视窗口“漫游”的结果。

这种“虚拟”云台的控制,可对USB摄像机云台控制稍作弥补,对低分辨率、低像素的摄像机实用价值就不大了。具体实现如下:

1、添加AForge库的引用

2、关键代码

//定义摄像头设备云台控制public FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);public FilterInfo info = null;public VideoCaptureDevice videoCaptureDevice = null;……List<string> VideoList = GetVideoInDevicesList();VideolistBox.DataSource = VideoList;List<string> AudioList = GetAudioInDevicesList();AudiolistBox.DataSource = AudioList;……this.VideolistBox.Text = VideoDriveName;this.AudiolistBox.Text = AudioDriveName;……/// <summary>/// 获取摄像头列表/// </summary>/// <returns></returns>public static List<string> GetVideoInDevicesList(){List<string> devicesList = new List<string>();try{var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);foreach (FilterInfo device in videoDevices){devicesList.Add(device.Name);}}catch (Exception ex){Console.WriteLine(ex.Message);}return devicesList;}/// <summary>/// 获取音频设备列表/// </summary>/// <returns></returns>public static List<string> GetAudioInDevicesList(){List<string> devicesList = new List<string>();try{var videoDevices = new FilterInfoCollection(FilterCategory.AudioInputDevice);//输入设备foreach (FilterInfo device in videoDevices){devicesList.Add(device.Name);}}catch (ApplicationException){Console.WriteLine("No local capture devices");}return devicesList;}……//摄像头云台控制初始化info = videoDevices[VideolistBox.SelectedIndex];videoCaptureDevice = new VideoCaptureDevice(info.MonikerString);PTZReset();

3、调用系统控制面板

try{videoCaptureDevice.DisplayPropertyPage(this.Handle);}catch{MessageBox.Show("所选视频设备不支持设置页面","出错",MessageBoxButtons.OK,MessageBoxIcon.Error,MessageBoxDefaultButton.Button1);}

4、“缩放”代码(必须先缩放,否则其它平移功能无效)

//放大int PropertyValue = 0;CameraControlFlags cameraControlFlags = CameraControlFlags.Manual;videoCaptureDevice.GetCameraProperty(CameraControlProperty.Zoom, out PropertyValue, out cameraControlFlags);Console.Write(PropertyValue);if (PropertyValue < 400){PropertyValue = PropertyValue + 1;}try{videoCaptureDevice.SetCameraProperty(CameraControlProperty.Zoom, PropertyValue, CameraControlFlags.Manual);}catch{}//缩小……if (PropertyValue > 100){PropertyValue = PropertyValue - 1;}try{videoCaptureDevice.SetCameraProperty(CameraControlProperty.Zoom, PropertyValue, CameraControlFlags.Manual);}……

5、上下平移

//上移int PropertyValue = 0;CameraControlFlags cameraControlFlags = CameraControlFlags.Manual;videoCaptureDevice.GetCameraProperty(CameraControlProperty.Tilt, out PropertyValue, out cameraControlFlags);Console.Write(PropertyValue);if (PropertyValue > -16){PropertyValue = PropertyValue - 1;}elsetry{videoCaptureDevice.SetCameraProperty(CameraControlProperty.Tilt, PropertyValue, CameraControlFlags.Manual);}//下移……if (PropertyValue < 16){PropertyValue = PropertyValue + 1;}try{videoCaptureDevice.SetCameraProperty(CameraControlProperty.Tilt, PropertyValue, CameraControlFlags.Manual);}……

6、左右平移

//向右int PropertyValue = 0;CameraControlFlags cameraControlFlags = CameraControlFlags.Manual;videoCaptureDevice.GetCameraProperty(CameraControlProperty.Pan, out PropertyValue, out cameraControlFlags);if (PropertyValue < 16){PropertyValue = PropertyValue + 1;}try{videoCaptureDevice.SetCameraProperty(CameraControlProperty.Pan, PropertyValue, CameraControlFlags.Manual);}//向左……if (PropertyValue > -16){PropertyValue = PropertyValue - 1;}try{videoCaptureDevice.SetCameraProperty(CameraControlProperty.Pan, PropertyValue, CameraControlFlags.Manual);}……

7、复位

videoCaptureDevice.SetCameraProperty(CameraControlProperty.Zoom, 100, CameraControlFlags.Manual);videoCaptureDevice.SetCameraProperty(CameraControlProperty.Tilt, 0, CameraControlFlags.Manual);videoCaptureDevice.SetCameraProperty(CameraControlProperty.Pan, 0, CameraControlFlags.Manual);
0 阅读:0

科技玩点原始事

简介:感谢大家的关注