海康威视相机C#二次开发指图像采集

文章目录

海康威视相机C#二次开发环境配置

本节的目的是实现海康威视GigE相机的图像采集功能,示例如下

布局很简单,左侧四个按钮,右侧是个Image。

创建并打开相机

海康威视的C#套件提供两种创建相机实例的方案,分别是基于设备信息和基于IP。

由于前面我们已经实现了设备枚举,故而通过前面枚举到的设备信息来创建。创建完成后,对于GigE相机和USB相机,需要额外进行些许配置。在创建、配置完成之后,即可开启设备,代码如下

cs 复制代码
IDevice device;
private void btnOpenCam_Click(object sender, RoutedEventArgs e)
{
    var devInfo = cbList.SelectedItem as IDeviceInfo;
    IDevice device = DeviceFactory.CreateDevice(devInfo);
    if (device is IGigEDevice)
    {
        IGigEDevice gigEDevice = device as IGigEDevice;
        int packetSize;
        gigEDevice.GetOptimalPacketSize(out packetSize);
        gigEDevice.Parameters.SetIntValue("GevSCPSPacketSize", packetSize);
    }
    else if (device is IUSBDevice)
    {
        IUSBDevice usbDevice = device as IUSBDevice;
        usbDevice.SetSyncTimeOut(1000);
    }
    int ret = device.Open();
    if (ret != MvError.MV_OK)
        MessageBox.Show("相机打开失败");
}

【DeviceFactory.CreateDevice】即为设备创建函数,输入参数是设备信息;另一种基于IP的函数是【DeviceFactory.CreateDeviceByIp】,输入参数是设备IP和本机IP。

GigE相机需要通过配置网口相机的最佳包大小;USB相机则需要设置USB同步读写超时时间。

【Open】是设备的内置方法,用于开启相机。

代码中,【device】被设为类成员,因为后续关闭相机、采集图像时,同样需要用到这个对象。

图像采集

海康威视SDK提供了回调函数,可以在获取图像的那一刻触发,示例如下

cs 复制代码
private void btnStartCam_Click(object sender, RoutedEventArgs e)
{
    device.StreamGrabber.SetImageNodeNum(5);        // 缓存节点数
    device.StreamGrabber.FrameGrabedEvent += StreamGrabber_FrameGrabedEvent;
    var ret = device.StreamGrabber.StartGrabbing();
    if (ret != MvError.MV_OK)
        MessageBox.Show("图像采集失败");
}

private void StreamGrabber_FrameGrabedEvent(object? sender, FrameGrabbedEventArgs e)
{
    var img = (IImage)e.FrameOut.Image.Clone();
    try
    {
        int w = (int)img.Width;
        int h = (int)img.Height;
        byte[] rawData = e.FrameOut.Image.PixelData;
        var L = rawData.Length;
        Dispatcher.BeginInvoke(() =>
        {
            var _writeableBitmap = new WriteableBitmap(w, h, 96, 96, PixelFormats.Gray8, null);
            imShow.Source = _writeableBitmap;
            _writeableBitmap.WritePixels(new Int32Rect(0, 0, w, h), rawData, w, 0);
        });

    }
    catch{}
    finally
    {
        if(e.FrameOut is IDisposable disposable)
            disposable.Dispose();
    }

}

【FrameGrabedEvent】即获取图像的触发事件,在绑定回调函数后,即可采用【StartGrabbing】开启图像采集。

在回调函数中,参数【e】包含了我们需要的数据FrameOut,其中的Image就是图像数据。在海康威视新版SDK中,为Image提供了像素数据PixelData,有了这个,就不用像之前那样跑指针了。

停止采集和关闭相机

停止采集和关闭相机的触发函数如下,在停止采集的过程中,一方面需要调用【StopGrabbing】,另一方面需要注销回调函数,以防下次打开的时候回调函数混乱。

cs 复制代码
private void btnStopCam_Click(object sender, RoutedEventArgs e)
{
    device.StreamGrabber.StopGrabbing();
    device.StreamGrabber.FrameGrabedEvent -= StreamGrabber_FrameGrabedEvent;
}

private void btnCloseCam_Click(object sender, RoutedEventArgs e)
{
    int ret = device.Close();
    if (ret != MvError.MV_OK)
        MessageBox.Show("设备关闭失败");
    device.Dispose();
    device = null;
}

【Close】用于关闭设备;【Dispose】用于释放上位机的资源。

相关推荐
淡海水3 小时前
03-02-架构篇-Boehm GC架构解析
unity·架构·c#·gc·boehm
上海锝秉工控4 小时前
相机激光传感器 三维测量更精准
数码相机
FLJwu4 小时前
硬件器件选型实战电源篇 03:TVS 管选型踩坑复盘|盲目选大电压,静电打坏运动相机主控,客户批量退货
经验分享·数码相机·音视频·相机·运动相机
数字融合16 小时前
透明化视频孪生虚实映射一体化融合技术
人工智能·python·数码相机
samble21 小时前
从零搭建灌装监控系统(十八):自定义控件,三色灯与状态指示
c#·wpf·mvvm·modbus·工业控制
jun_bai21 小时前
使用Aspose实现word文档合并,内容替换
windows·c#·word
字节暗面1 天前
客户端上报不可信:游戏服务端数据校验与对局重演设计
c#·游戏开发·服务端校验·反作弊
沐欣工作室_lvyiyi1 天前
基于机器视觉的物流分拣装置设计(论文+源码)
机器视觉·plc仿真·物流分拣·plc毕业设计·兰州工业学院·江苏理工学院
chingho1 天前
GitHub上这10个C#项目,不仅实用,还怪好玩的
c#·github·.net·开源项目
LabVIEW开发1 天前
IMAQdx 报 0xBFF69011 取属性失败
数码相机·labview·labview知识·labview功能·labview程序