大华相机C#学习之IStream类

获取方式

IDevice.StreamGrabber

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


常用属性

IsStart

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

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()

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

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

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

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

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

连续抓图
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即可。


单张抓图
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后,给对应通道的线信号既可以执行单张取图。


多张取图
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()参数中添加要采图张数即可。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分治】Leetcode 数组中的第K个最大元素

题目讲解 数组中的第K个最大元素 算法讲解 堆排序&#xff1a;1. 寻找最后一个节点的父亲&#xff0c;依次向上遍历&#xff0c;完成小堆的建立&#xff1b;2. 从最后一个元素开始&#xff0c;和堆顶的数据做交换&#xff0c;此时最小的数据在对后面&#xff0c;然后对剩下的…

sql知识总结二(接上)

2.updatexml报错注入 &#xff08;1&#xff09;判断字符型/数字型 如果是字符型再判断闭合方式&#xff08;备注&#xff1a;结尾加--看是否闭合&#xff0c;若页面正常执行则闭合完成&#xff09; ?id1") and 1updatexml(1,concat(0x7e,(select group_concat(table_…

Go语言中栈和堆对数据密集型应用程序性能的影响

在 Go 中,变量可以被分配在栈上或堆上。这两种类型的内存在根本上是不相同的,它们可以显著影响数据密集型应用程序的性能。 1. 栈 vs 堆 首先,让我们讨论一下栈和堆的区别。栈是默认内存;它是一种后进先出(LIFO)的数据结构,用于存储特定 goroutine 的所有局部变量。当一…

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言&#xff0c;这使我们只要生成一个可执行程序即…

【React】Sigma.js框架网络图-入门篇

一、介绍 Sigma.js是一个专门用于图形绘制的JavaScript库。 它使在Web页面上发布网络变得容易&#xff0c;并允许开发人员将网络探索集成到丰富的Web应用程序中。 Sigma.js提供了许多内置功能&#xff0c;例如Canvas和WebGL渲染器或鼠标和触摸支持&#xff0c;以使用户在网页上…

Echarts-丝带图

Echarts-丝带图 demo地址 打开CodePen 什么是丝带图&#xff1f; 丝带图是Power BI中独有额可视化视觉对象&#xff0c;它的工具提示能展示指标当期与下期的数据以及排名。需求&#xff1a;使用丝带图展示"2022年点播订单表"不同月份不同点播套餐对应订单数据。 …

vim之一键替换

Vim的substitute命令是一个非常强大的文本替换工具&#xff0c;它允许用户在整个文件或指定范围内执行文本替换操作。 命令格式 substitute命令的基本格式如下&#xff1a; :[range]s[ubstitute]/{pattern}/{string}/[flags] 其中&#xff1a; [range] 指定替换操作的范围…

搭建HBase2.x完全分布式集群(CentOS 9 + Hadoop3.x)

Apache HBase™是一个分布式、可扩展、大数据存储的Hadoop数据库。 当我们需要对大数据进行随机、实时的读/写访问时&#xff0c;可以使用HBase。这个项目的目标是在通用硬件集群上托管非常大的表——数十亿行X数百万列。Apache HBase是一个开源、分布式、版本化的非关系数据库…

宝塔手动安装grafana

1.下载 # 进入目标目录 cd /data/prometheus/ # 下载 wget https://dl.grafana.com/oss/release/grafana-8.0.4-1.x86_64.rpm # 安装 sudo yum install grafana-8.0.4-1.x86_64.rpm 2.运行项目 # 启动 /etc/init.d/grafana-server start 3.修改配置文件全局搜索 defaults.i…

【AIGC调研系列】llama 3与GPT4相比的优劣点

Llama 3与GPT-4相比&#xff0c;各有其优劣点。以下是基于我搜索到的资料的详细分析&#xff1a; Llama 3的优点&#xff1a; 更大的数据集和参数规模&#xff1a;Llama 3基于超过15T token的训练&#xff0c;这相当于Llama 2数据集的7倍还多[1][3]。此外&#xff0c;它拥有4…

Ceph学习 -11.块存储RBD接口

文章目录 RBD接口1.基础知识1.1 基础知识1.2 简单实践1.3 小结 2.镜像管理2.1 基础知识2.2 简单实践2.3 小结 3.镜像实践3.1 基础知识3.2 简单实践3.3 小结 4.容量管理4.1 基础知识4.2 简单实践4.3 小结 5.快照管理5.1 基础知识5.2 简单实践5.3 小结 6.快照分层6.1 基础知识6.2…

【Python】上下文管理协议__enter__和__exit__函数

部分程序中&#xff0c;可能事先要准备资源&#xff0c;事后做清理工作。 with方法就是python的非常酷的语句&#xff0c;安全可靠&#xff0c;方便。我们自己的类如何具备with的能力?必须拥有__enter__()函数和一个__exit__()函数&#xff0c;本章节介绍两个函数的能力。 对于…

微信小程序使用 Vant Weapp 中 Collapse 折叠面板 的问题!

需求&#xff1a;结合Tab 标签页 和 Collapse 折叠面板 组合成显示课本和章节内容&#xff0c;并且用户体验要好点&#xff01; 如下图展示&#xff1a; 问题&#xff1a;如何使用Collapse 折叠面板 将内容循环展示出来&#xff1f; js中的数据是这样的 代码实现&#xff1…

draw.io: 开启图表绘制的无限可能

图表是沟通和呈现复杂信息的有效工具&#xff0c;在工作、学习甚至生活中都有广泛的应用。作为一款在线图表软件&#xff0c;draw.io提供了简单、直观又功能丰富的界面&#xff0c;让任何人都可以轻松创建专业水准的图表。接下来&#xff0c;我将分享我深入使用draw.io的经验&a…

【C语言】归并排序算法实现

一、归并排序原理二、归并排序实现三、归并排序优化四、总结 归并排序&#xff08;Merge Sort&#xff09;是一种经典的排序算法&#xff0c;由于其采用了分治策略&#xff0c;因此在处理大数据集时表现出了较好的性能。本文将详细介绍归并排序的原理、实现以及优化方法&#x…

Python | Leetcode Python题解之第39题组合总和

题目&#xff1a; 题解&#xff1a; from typing import Listclass Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:def dfs(candidates, begin, size, path, res, target):if target < 0:returnif target 0:res.append(p…

Stability AI 发布 SD3 API:开启人工智能新篇章

文章目录 1.Stable Diffusion 3 API开放了! 2.Stability AI Document地址3.获取API Key4.API方式调用SD3出图接口地址接口请求规范接口请求响应结果 5.Stable Diffusion 3.0、Stable Image Core、Fooocus 2.3.1、MidJounery效果查看 1.Stable Diffusion 3 API开放了! Stabilit…

竞态问题 + axios 取消请求

目录 1&#xff0c;问题描述2&#xff0c;解决1&#xff0c;丢弃错误的结果2&#xff0c;取消之前的请求在页面中使用 3&#xff0c;其他4&#xff0c;潜在的问题 1&#xff0c;问题描述 在日常开发中&#xff0c;可能会有以下场景&#xff1a; 有多个 tab 页&#xff0c;每个…

react 响应式栅格布局

遇到一个小问题 , 有很多的下拉框放在了一行的盒子里 用到了栅格思路 , 但响应式处理屏幕时候右侧的按钮会覆盖掉样式 之前我的思路是子绝父相 , 将按钮定在最右侧 , 按钮和下拉框都在同一盒子中 , 且做了栅格处理没想到还是会覆盖解决 : 后来我用到了 margin-left: auto 来让…

蓝桥杯 BASIC-25 基础练习 回形取数

蓝桥杯 BASIC-25 基础练习 回形取数 问题描述 回形取数就是沿矩阵的边取数&#xff0c;若当前方向上无数可取或已经取过&#xff0c; 则左转90度。一开始位于矩阵左上角&#xff0c;方向向下。 输入格式 输入第一行是两个不超过200的正整数m, n&#xff0c;表示矩阵的行和列。 …