C# USB摄像机虚拟云台控制

仅有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;
}
else
try
{
    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);

猜你喜欢

转载自blog.csdn.net/dgnankai/article/details/129142868