大华相机C#学习之IStream类

获取方式

IDevice.StreamGrabber

设备实例对象的StreamGrabber属性可以返回IStream对象。


常用属性

IsStart

判断是否开启捕获码流,是,返回true;否,返回false。

cs 复制代码
private void test_Click(object sender, EventArgs e)
{
    List<IDeviceInfo> devices = Enumerator.EnumerateDevices();
    IDevice device = Enumerator.GetDeviceByGigeIP("192.168.0.11");          
    device.Open();

    IStream stream = device.StreamGrabber;
    Console.WriteLine("执行start方法前,是否开启捕获码流:"+stream.IsStart);
    stream.Start();
    Console.WriteLine("执行start方法后,是否开启捕获码流:" + stream.IsStart);
    stream.Stop();
    Console.WriteLine("执行stop方法后,是否开启捕获码流:" + stream.IsStart);

    device.Close();
}

运行结果:
执行start方法前,是否开启捕获码流:False
执行start方法后,是否开启捕获码流:True
执行stop方法后,是否开启捕获码流:False

常用方法

getStatisticsInfo()

获取码流的统计信息,可以获取带宽,频率,获取错误图像,接受图像数据,丢包数等数据。

cs 复制代码
private void button1_Click(object sender, EventArgs e)
{
    List<IDeviceInfo> lst=Enumerator.EnumerateDevices();
    IDevice device = Enumerator.GetDeviceByGigeIP("192.168.0.10");           

    device.Open();
    IStream stream = device.StreamGrabber;
    Console.WriteLine("打开相机后device的IsOpen属性" + device.IsOpen);           
    Console.WriteLine("打开相机后stream的IsStart属性" + stream.IsStart);

    stream.ImageGrabbed += Stream_ImageGrabbed;

    //stream.Start();
    device.GrabUsingGrabLoopThread();
    Console.WriteLine("stream使用GrabUsingGrabLoopThread()方法后stream的IsStart属性" + stream.IsStart);

    Thread.Sleep(3000);

    IStreamStatisticsInfo streamInfo = stream.getStatisticsInfo();
    Console.WriteLine("stream的带宽:" + streamInfo.Bandwidth);
    Console.WriteLine("stream的帧率:" + streamInfo.Fps);
    Console.WriteLine("stream的错误图像:" + streamInfo.ImageError);
    Console.WriteLine("stream获取图像" + streamInfo.ImageReceived);
    Console.WriteLine("stream丢包帧数" + streamInfo.LostPacketBlock);

    stream.Stop();
    Console.WriteLine("stream使用stop()方法后stream的IsStart属性" + stream.IsStart);

    device.Close();
}

private void Stream_ImageGrabbed(object sender, GrabbedEventArgs e)
{
    Console.WriteLine("触发抓图事件");
}

运行结果:
打开相机后device的IsOpen属性True
打开相机后stream的IsStart属性False
stream使用GrabUsingGrabLoopThread()方法后stream的IsStart属性True
触发抓图事件
触发抓图事件
触发抓图事件
...
省略一大段
...
触发抓图事件
触发抓图事件
触发抓图事件
stream的带宽:850.29892944
stream的帧率:20.02
stream的错误图像:0
stream获取图像60
stream丢包帧数0
线程 '[线程已销毁]' (23160) 已退出,返回值为 0 (0x0)。
stream使用stop()方法后stream的IsStart属性False

resetStatisticsInfo()

重置码流统计信息。


SetBufferCount(int nCount)

设置帧缓存大小。帧缓存大小的计算方式这里就不叙述了,有需要请自行百度。


setInterPacketTimeout(int nTimeout)

设置驱动包间隔超时时间(ms),仅支持GigE设备。


setMaxLostPacketNum(int nMaxLostPacketNum)

设置同一帧最大丢包的数量,仅对GigE设备有效。


setSingleResendMaxPacketNum(int nMaxPacketNum)

设置单次重传最大包个数,仅对GigE设备有效。


Start()

开始捕获码流,如果没有设置Trigger模式,那么码流一直在抓图,一直触发ImageGrabbed事件。


Start(long maxImages)

开始捕获码流,并且获取maxImages设置的帧数图像。


Stop()

停止码流。


常用事件

GrabStarted

当开始捕获码流时,触发该事件。


GrabStoped

当停止捕获码流时,触发该事件。

cs 复制代码
private void test_Click(object sender, EventArgs e)
{
    List<IDeviceInfo> devices = Enumerator.EnumerateDevices();
    IDevice device = Enumerator.GetDeviceByGigeIP("192.168.0.11");          
    device.Open();

    IStream stream = device.StreamGrabber;
    stream.GrabStarted += Stream_GrabStarted;
    stream.GrabStoped += Stream_GrabStoped;

    stream.Start();
    stream.Stop();

    device.Close();
}

private void Stream_GrabStoped(object sender, EventArgs e)
{
    Console.WriteLine("发生码流停止事件");
}

private void Stream_GrabStarted(object sender, EventArgs e)
{
    Console.WriteLine("发生码流开启事件");
}

运行结果:
发生码流开启事件
发生码流停止事件

ImageGrabbed

当码流采集图像时,触发此事件。抓图可以分为连续抓图,单张抓图和多张抓图。

连续抓图
cs 复制代码
private void button1_Click(object sender, EventArgs e)
{
    List<IDeviceInfo> devices=Enumerator.EnumerateDevices();
    IDevice device = Enumerator.GetDeviceByGigeIP("192.168.0.10");

    device.Open();
    ITrigger trigger = device.TriggerSet;

    trigger.Open(TriggerSourceEnum.Software);
    trigger.Close();
    Console.WriteLine("device.isTriggerOn"+device.IsTriggerOn);

    IStream stream= device.StreamGrabber;
    stream.GrabStarted += Stream_GrabStarted;
    stream.GrabStoped += Stream_GrabStoped;
    stream.ImageGrabbed += Stream_ImageGrabbed;

    stream.Start();
    Thread.Sleep(1000);
    stream.Stop();
}

private void Stream_ImageGrabbed(object sender, GrabbedEventArgs e)
{
    Console.WriteLine("抓图事件触发");
}

private void Stream_GrabStoped(object sender, EventArgs e)
{
    Console.WriteLine("---------------------------------");
    Console.WriteLine("码流停止事件触发");
}

private void Stream_GrabStarted(object sender, EventArgs e)
{
    Console.WriteLine("---------------------------------");
    Console.WriteLine("码流启动事件触发");
}

运行结果:
device.isTriggerOn:False
---------------------------------
码流启动事件触发
抓图事件触发
抓图事件触发
···
省略
...
抓图事件触发
抓图事件触发
抓图事件触发
线程 '[线程已销毁]' (1220) 已退出,返回值为 0 (0x0)。
---------------------------------
码流停止事件触发

如上,如果希望stream调用start()函数以后连续抓图,那么需要trigger调用close()函数,把device的IsTriggerOn属性设为false即可。


单张抓图
cs 复制代码
private void button1_Click(object sender, EventArgs e)
{
    List<IDeviceInfo> devices=Enumerator.EnumerateDevices();
    IDevice device = Enumerator.GetDeviceByGigeIP("192.168.0.10");

    device.Open();
    ITrigger trigger = device.TriggerSet;

    trigger.Open(TriggerSourceEnum.Software);
    Console.WriteLine("device.isTriggerOn:"+device.IsTriggerOn);

    IStream stream= device.StreamGrabber;
    stream.GrabStarted += Stream_GrabStarted;
    stream.GrabStoped += Stream_GrabStoped;
    stream.ImageGrabbed += Stream_ImageGrabbed;

    stream.Start();
    trigger.ExecuteSoftwareTrigger();
    Thread.Sleep(1000);
    stream.Stop();
}

事件函数不变。

运行结果:
device.isTriggerOn:True
---------------------------------
码流启动事件触发
抓图事件触发
线程 '[线程已销毁]' (15084) 已退出,返回值为 0 (0x0)。
---------------------------------
码流停止事件触发

如上,如果需要软件触发就采图一次的话,那么需要trigger调用Open()方法,并把触发源,设为Software,设置好以后,在stream打开以后,trigger执行一次ExecuteSoftwareTrigger(),就会采一张图。如果需要信号线控制采图,那么只要在Open()方法里面设置对应的通道,然后打开stream后,给对应通道的线信号既可以执行单张取图。


多张取图
cs 复制代码
private void button1_Click(object sender, EventArgs e)
{
    List<IDeviceInfo> devices=Enumerator.EnumerateDevices();
    IDevice device = Enumerator.GetDeviceByGigeIP("192.168.0.10");

    device.Open();
    ITrigger trigger = device.TriggerSet;

    trigger.Open(TriggerSourceEnum.Software,5);
    Console.WriteLine("device.isTriggerOn:"+device.IsTriggerOn);

    IStream stream= device.StreamGrabber;
    stream.GrabStarted += Stream_GrabStarted;
    stream.GrabStoped += Stream_GrabStoped;
    stream.ImageGrabbed += Stream_ImageGrabbed;

    stream.Start();
    trigger.ExecuteSoftwareTrigger();
    Thread.Sleep(1000);
    stream.Stop();
}

事件代码不变

运行结果:
device.isTriggerOn:True
---------------------------------
码流启动事件触发
抓图事件触发
抓图事件触发
抓图事件触发
抓图事件触发
抓图事件触发
线程 '[线程已销毁]' (3936) 已退出,返回值为 0 (0x0)。
---------------------------------
码流停止事件触发

如上,只要在trigger的Open()参数中添加要采图张数即可。


相关推荐
人工智能AI技术16 分钟前
【C#程序员入门AI】本地大模型落地:用Ollama+C#在本地运行Llama 3/Phi-3,无需云端
人工智能·c#
友思特 智能感知1 小时前
友思特案例 | 金属行业视觉检测案例三:彩涂钢板表面纹理检测
人工智能·视觉检测
格林威4 小时前
Baumer相机铆钉安装状态检测:判断铆接是否到位的 5 个核心算法,附 OpenCV+Halcon 的实战代码!
人工智能·opencv·算法·计算机视觉·视觉检测·工业相机·堡盟相机
MyBFuture4 小时前
C#数组详解:一维二维与交错数组
开发语言·windows·c#·visual studio·vision pro
有来技术5 小时前
ASP.NET Core 权限管理系统(RBAC)设计与实现|vue3-element-admin .NET 后端
vue.js·后端·c#·asp.net·.net
沃达德软件6 小时前
视频侦查图像清晰化技术
图像处理·人工智能·目标检测·机器学习·计算机视觉·视觉检测·超分辨率重建
张人玉7 小时前
C#WinFrom中show和ShowDialog的区别
开发语言·microsoft·c#
m0_748233177 小时前
C#:微软的现代编程利器
开发语言·microsoft·c#
Traced back7 小时前
SQL Server数据自动清理系统最终版(C# WinForms完整源码)
数据库·c#·.net
人工智能AI技术8 小时前
【C#程序员入门AI】Microsoft Extensions for AI (MEAI):统一LLM调用接口,告别厂商绑定
人工智能·c#