Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现双快门采集两张曝光时间非常短的图像(C++)

news2024/11/17 4:39:24

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现双快门采集两张曝光时间非常短的图像(C++)

  • Baumer工业相机
  • Baumer工业相机定序器功能的技术背景
  • Baumer工业相机通过NEOAPI SDK使用定序器功能
    • 预期的相机动作
    • 技术限制
    • 定序器的工作原理
  • Baumer工业相机通过NEOAPI SDK使用定序器功能具体实现方法
    • 第一组定序器
    • 第二组定序器
    • 1.引用合适的类文件
    • 2.通过NEOAPI SDK开启两组定序器功能
  • Baumer工业相机使用定序器实现双快门采集两张曝光时间非常短的图像的优势
  • Baumer工业相机使用定序器实现双快门采集两张曝光时间非常短的图像的行业应用

Baumer工业相机

Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。

Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。

Baumer工业相机由于其性能和质量的优越和稳定,常用于高速同步采集领域,通常使用各种图像算法来提高其捕获的图像的质量。

Baumer工业相机NEOAPI SDK是用于Baumer工业相机的一款最新的软件开发工具包(SDK)。它为开发人员提供了一系列API和工具,用于与Baumer工业相机进行通信和控制,控制方式极为便捷类似Halcon的相机助手类控制方式。​

Baumer工业相机堡盟相机在SDK中提供了一种在收到单个触发信号时记录多张图像的方法。。

Baumer工业相机定序器功能的技术背景

Baumer工业相机的NEOAPI SDK是Baumer公司开发的针对其相机产品系列的一套软件开发工具包。该SDK提供了一组API,使开发人员可以编写专业应用程序,从而控制、捕获、处理和显示Baumer相机的图像和数据。BGAPI SDK支持多种编程语言,包括C++、C#、Visual Basic、LabVIEW、Matlab等,并提供了大量示例代码和文档,以帮助用户轻松上手,快速完成应用程序的开发。

NEOAPI SDK提供了丰富的功能,可以控制Baumer相机的所有参数,包括曝光时间、增益、白平衡、触发模式等,以及支持各种数据格式,例如Raw、BMP、JPG等,同时还提供了实时显示、数据采集、图像处理等功能,为开发人员提供了高度定制化的解决方案。此外,BGAPI SDK还支持多相机系统的开发,并可支持各种计算机操作系统,如Windows、Linux、Mac OS等。

工业相机的 定序器Sequencer 功能是一种高级的编程功能,允许用户将多种拍摄参数设置成独立的序列,实现对相机的自动切换控制以满足多种不同的应用需求。使用 Sequencer 功能可以实现在一个拍摄周期内,完成多个曝光、图像传输和处理任务,从而提高工程效率和质量。

Baumer工业相机通过NEOAPI SDK使用定序器功能


下面介绍在C#里Baumer工业相机如何通过NEOAPI进行定序器编程:借助双快门,可在较短的时间间隔内采集两张曝光时间非常短的图像。

预期的相机动作

从理论上讲,该方法首先要求相机设置为触发模式,当每次收到触发信号时,在同样的曝光时间内采集两张图像。

技术限制

双快门方法要使用闪光灯,因此在采集每张图像时都需要闪光,这样环境光将被抑制。

图像曝光时间非常短”意味着设定的曝光时间和相机内部处理时间比传感器的读取时间短。在此,设定的第二次曝光时间应大于等于传感器的读取时间。

为了避免传感器的读取时间超过第二次曝光时间,需要再进行一次短促的闪光,同时必须避免所有环境光。

定序器的工作原理

考虑到定序器的基本原理以及双快门的技术限制,定序器的参数设置比预想的要复杂得多:

由于第一张图像的采集由硬件触发,随后必须在不同的曝光时间内立即自动采集第二张图像,因此两组不同的定序器必不可少。
第一组定序器(Set0)包含用于配置TriggerMode的必要参数,以及第一张图像的预期曝光时间。
第二组定序器(Set1)将相机重新设置为自由运行操作模式。设定的曝光时间将大于等于传感器的读取时间。
此外,两组定序器都需要提供定序器组及路径的相关信息。

Baumer工业相机通过NEOAPI SDK使用定序器功能具体实现方法

下面介绍在C++里Baumer工业相机如何通过NEOAPI SDK使用定序器实现双快门采集两张曝光时间非常短的图像.

在收到触发信号后,序列便会开始运行,因此必须将TriggerSource设置为Line0。

第一组定序器

Set0提供由定序器控制的相机功能:ExposureTime和已开启的TriggerMode。

定序器组及路径相关功能:

SequencerPathSelector = 0
对切换至下一组定序器的路径进行定义,本例中为Path0。

SequencerTriggerSource = ExposureActive
对用作定序器触发源的内部或外部信号进行定义,本例中为内部信号ExposureActive。

SequencerTriggerActivation = RisingEdge
对触发切换至下一组定序器的信号状态变化进行定义,本例中为RisingEdge。

SequencerSetNext = 1
定义本路径中的下一组定序器,本例中为Set1。

第二组定序器

Set1中的ExposureTime更长,并关闭了TriggerMode。该组定序器及路径相关功能:

SequencerPathSelector = 0
对切换至下一组定序器的路径进行定义,使用Path0返回至Set0。

SequencerTriggerSource = ExposureActive
对用作定序器触发源的内部或外部信号进行定义,本例中为内部信号ExposureActive。

SequencerTriggerActivation = RisingEdge
对触发切定序器组切换的信号状态变化进行定义,本例中为RisingEdge。

SequencerSetNext = 0
定义相关路径中的下一组定序器。使用Set0返回。

本示例介绍了如何通过硬件触发实现双快门操作的定序器编程。双快门操作旨在在很短的时间内采集2张图像。该操作使用了一种特殊的技术,让相机还在读取第一张图像的时候可以采集第二张图像。

下图所示为以信号曲线表示的双快门效果:在第二次曝光的最终阶段消除外界光(曝光信号中的灰色阴影区域),可确保相机实现预期动作。

在这里插入图片描述

1.引用合适的类文件

代码如下(示例):

#include <stdio.h>
#include <iostream>
#include "bgapi2_genicam/bgapi2_genicam.hpp"
#include <iostream>
#include <iostream>
#include "neoapi.hpp"

2.通过NEOAPI SDK开启两组定序器功能

Baumer工业相机设置定序器功能模式核心代码如下所示:

NeoAPI::Cam camera = NeoAPI::Cam();
camera.Connect();
camera.f().ExposureTime.Set(10000);

int width = static_cast<int>(camera.f().Width);
int height = static_cast<int>(camera.f().Height);

if (camera.IsConnected())
{		
		
	//  停止启动并加载默认参数
	camera.f().AcquisitionStop.Execute();  
	camera.f().UserSetSelector.SetString("Default");//选择相机Default设置 
	camera.f().UserSetLoad.Execute();				//执行Default载入 
		           
	
	// 配置硬件触发输入
	// 这需要在配置定序器之前完成
	camera.f().TriggerMode.SetString("On");
	camera.f().TriggerSource.SetString("Line0");
	camera.f().TriggerActivation.SetString("RisingEdge");
	camera.f().TriggerDelay.Set(0.0);
	camera.f().LineSelector.SetString("Line0");	
	camera.f().LineInverter.Set("false");
	camera.f().LineDebouncerHighTimeAbs.Set(1.0); // in µsec
	camera.f().LineDebouncerLowTimeAbs.Set(1.0); // in µsec
	
	// 为闪光灯配置计时器
	// 每次开始曝光时启动计时器,持续时间为 100 微秒
	camera.f().TimerSelector.SetString("Timer1");
	camera.f().TimerTriggerSource.SetString("ExposureStart");
	camera.f().TimerTriggerActivation.SetString("RisingEdge");
	camera.f().TimerDelay.Set(0.0);
	// (闪光灯的)定时器持续时间等于下面的 Set0 曝光时间
	camera.f().TimerDuration.Set(100.0);

	// 配置 GPIO "线路 3",用于控制闪存
	camera.f().LineSelector.SetString("Line3");
	camera.f().LineSource.ValueString.SetString("Timer1Active");
	// 当之前设置的定时器 1 工作时,3 号线为高电平
	camera.f().LineInverter.Set("false");	
	
	// 切换到定序器设置模式	
	camera.f().SequencerConfigurationMode.SetString("On");
	


	// 设置第一组定序器功能Set0
	camera.f().SequencerSetSelector.Set(0);
	camera.f().SequencerSetLoad.Execute();	//执行第一组定序器参数载入   
	
	// 设置第一组定序器Set0的曝光参数
	// Set0 的曝光时间 =(闪光灯的)定时器持续时间
	camera.f().ExposureTime.Set(100.0);		
	camera.f().SequencerPathSelector.Set(0);
	camera.f().SequencerTriggerSource.SetString("ExposureActive");
	camera.f().SequencerTriggerActivation.SetString("RisingEdge");
	// 下一个定序器步骤将是下面设置的 Set1
	camera.f().SequencerSetNext.Set(1);
	camera.f().SequencerSetSave.Execute();	//执行第一组定序器参数保存
	
	// 设置第二组定序器功能Set1
	camera.f().SequencerSetSelector.Set(1);
	camera.f().SequencerSetLoad.Execute();	//开启第二组定序器参数    
	// 将触发模式(TriggerMode)设置为关,否则相机将等待下一次硬件触发,这是不可取的。将触发模式(TriggerMode)更改为关(Off)将使摄像机返回自由运行模式,曝光一次后,我们将回到设置 0,此时触发模式(TriggerMode)将再次打开,以便相机等待下一次硬件触发。   
	camera.f().TriggerMode.SetString("Off");
	// 这里是双快门技巧,对于第二次曝光,我们将曝光时间设置为 
	// 与第一幅图像的读出时间相同(由相机计算得出)。这样 
	// 相机将识别到,只有在第一幅图像的读出时间结束后,第二幅图像才可以读出。
	// 第一幅图像的读出完成后,第二幅图像才可以读出,因此会立即开始曝光。
	// 而不是等待第一幅图像完成读出
	// 设置第二组定序器Set1的曝光参数
    double fReadOutTime_Set1 = (double )camera.f().ReadOutTime.Get();   
	camera.f().ExposureTime.Set(fReadOutTime_Set1 );
	
	camera.f().SequencerPathSelector.Set(0);
	camera.f().SequencerTriggerSource.SetString("ExposureActive");
	camera.f().SequencerTriggerActivation.SetString("RisingEdge");
	// 定序器的下一步将再次是Step0
	camera.f().SequencerSetNext.Set(0);
	camera.f().SequencerSetSave.Execute();	//执行第二组定序器参数保存
	// 从 Set0 开始
	camera.f().SequencerSetStart.Set(0);

	// 定序器参数设置结束
	camera.f().SequencerConfigurationMode.SetString("Off");
	camera.f.SequencerConfigurationMode.ValueString  =  "Off";

	// 开启相机定序器功能
	camera.f().SequencerMode.SetString("On");
	camera.f().AcquisitionStart.Execute();
	

	// 开始双快门采集图像

	// 停止相机定序器功能
	camera.f().AcquisitionStop.Execute();  
	camera.f().SequencerMode.SetString("Off");	
	
}

Baumer工业相机使用定序器实现双快门采集两张曝光时间非常短的图像的优势

使用工业相机的定序器功能实现双快门采集两张曝时间非常短的图像有以下优势:

  1. 高速度: 双快门采集允许瞬间拍摄两张曝时间非常短的图像,使相机能够在极其短的时间内捕捉高速运动或快速变化的场景,有助于保持图像清晰度和准确度。

  2. 减少模糊: 通过使用定序器实现双快门采集,可以避免在移动或高速运动场景下因快门曝光时间长导致的运动模糊问题。两个瞬间的曝光时间可以在快速变化的情况下捕捉图像并有效减少图像模。

  3. 提高精度: 双快门采集可以在同一位置获得两个不同曝光时间的图像,结合和分析这两幅图,能提高图像处理的精度和准确性,尤其在要求测量和分辨率要求的应用场景下有很大的帮助。

  4. 灵活性: 使用定序器实现双快门采集,可以根据不同需求调整两张图像之间的曝光时间差和参数设置,灵可以适应不同的拍摄场景和要求。

  5. 数据多样性: 通过实施定序器功能和双快门采集,可以获取同一场景下不同曝光下的图像,有助于在后续处理和分析中增加数据的多样性和信息量。

综上所述,使用工业相机的定序器功能实现双快门采集两张曝时间非常短的图像可以显著提高图像捕捉速度和准确性,并适用于对快速运动进行高精度和清晰度要求的场景。

Baumer工业相机使用定序器实现双快门采集两张曝光时间非常短的图像的行业应用

工业相机使用定序器实现双快门采集两张曝光时间非常短的图像在许多行业中具有重要应用价值,以下是一些典型的行业应用:

  1. 制造业: 在制造业中,双快门采集可用于捕捉快速运动的生产线以及高精度的零件、机器、设备等图像,有助于质量控制和产品检验。

  2. 机器视觉: 工业相机的双快门采集可应用于机器视觉系统中,对运动中的物体进行高速拍摄和分析,用于自动化生产、无人驾驶车辆和智能机器人等应用。

  3. 医疗影像: 在医学影像领域,双快门采集可用于捕捉活体器官、血流等的快速变化图像,有助于医学影像诊断和手术支持。

  4. 军事与航空航天: 在军事和航空航天领域,工业相机的双快门采集可用于高速飞行器、导弹、火箭等的图像捕捉和分析,有助于飞行器性能测试和目标跟踪等应用。

  5. 科学研究: 在科学研究领域,双快门采集可用于快速动态现象的记录和分析,如化学反应过程、生物学事件等,有助于科学实验和研究。

通过工业相机的定序器实现双快门采集两张曝光时间非常短的图像,可以满足许多行业对高速运动和瞬时事件的图像捕捉需求,为各种应用提供了高速、精度和数据多样性的图像采集解决方案。

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

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

相关文章

【CSP试题回顾】201712-1-最小差值

CSP-201712-1-最小差值 完整代码 #include<iostream> #include<vector> #include<cmath> using namespace std;int n, minDelta 10005;int main() { cin >> n;vector<int>arr(n);for (int i 0; i < n; i){cin >> arr[i];}for (i…

OD_2024_C卷_200分_7、5G网络建设【JAVA】【最小生成树】

package odjava;import java.util.Scanner;public class 七_5G网络建设 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt(); // 基站数量&#xff08;节点数&#xff09;int m sc.nextInt(); // 基站对数量&#xff08;边数&…

26-1 SQL 注入攻击 - delete注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、注入原理: 对于后台来说,delete操作通常是将对应的id传递到后台,然后后台会删除该id对应的数据。 如果后台没有对接收到的 id 参数进行充分的验证和过滤,恶意用户可能会…

应用程序角度来看linux闲余内存

第三行所指的是从应用程序角度来看&#xff0c;对于应用程序来说&#xff0c;buffers/cached 是等于可用的&#xff0c;因为buffer/cached是为了提高文件读取的性能&#xff0c;当应用程序需在用到内存的时候&#xff0c;buffer/cached会很快地被回收。 所以从应用程序的角度来…

让LED安全生产记录显示屏成为员工安全意识的警钟

随着科技的不断发展和进步&#xff0c;LED安全生产记录显示屏作为一种新型的安全生产管理工具&#xff0c;正在逐渐被各行各业广泛应用。在工厂、建筑工地、仓库等各类生产场所&#xff0c;LED安全生产记录显示屏的出现&#xff0c;不仅为管理者提供了实时监控和数据显示的便利…

【智能算法】蜻蜓算法(DA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2016年&#xff0c;Mirjalili受到蜻蜓静态和动态集群行为启发&#xff0c;提出了蜻蜓算法(Dragonfly algorithm, DA)。 2.算法原理 2.1算法思想 蜻蜓集群有两种行为目的&#xff1a;狩猎&#xf…

Oracle Primavera P6 Analytics 是什么,与P6的关系?

前言 Oracle Primavera P6 Analytics 是与P6有关的一个相对较新的模块&#xff0c;Primavera 用户社区在很大程度上尚未对其进行探索。 那么它到底有什么作用呢&#xff1f; 通过了解得知它旨在通过深入了解组织的项目组合绩效&#xff0c;帮助高级管理层对其项目组合做出更好…

[Linux] 进程间通信基础

&#x1f4bb;文章目录 &#x1f4c4;前言进程间通信基础概念 管道概念管道的工作原理模拟实现shell中的管道 共享内存概念接口的介绍共享内存的使用 &#x1f4d3;总结 &#x1f4c4;前言 你是否了解进程间是如何通信的呢&#xff1f;你是否知道管道的工作原理呢&#xff1f;管…

LeetCode142:环形链表

题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内…

TSINGSEE青犀智能分析网关V4有限空间作业监护AI算法介绍及应用

在现代工业生产中&#xff0c;有限空间作业是一种常见的生产方式。然而&#xff0c;这种作业环境由于空间有限、出入口较为狭窄、人员操作复杂等因素&#xff0c;往往存在着较高的安全风险&#xff0c;因为自然通风不良&#xff0c;作业人员不能长时间在内工作。为了保障作业人…

linux环境基础开发工具2(gcc/g++ 、 make/ Makefile)

目录 Linux编译器-gcc/g使用 Linux项目自动化构建工具-make/Makefile Linux编译器-gcc/g使用 1. 背景知识 1.2 gcc/g -v 查看当前服务器的编译器版本 1.3 安装gcc / g sudo yum install -y gcc-c 1.4 预处理 -> 编译 -> 汇编 -> 链接 [wxqVM-4-9-centos Test]$ to…

如何在Windows搭建WebDav服务,并外网可访问

目录 1. 安装IIS必要WebDav组件 2. 客户端测试 3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网 3.1 打开Web-UI管理界面 3.2 创建隧道 3.3 查看在线隧道列表 4. 公网远程访问 4.1 浏览器访问测试 4.2 映射本地盘符访问 4.3 安装Raidrive客户端 总结&…

Could not use APOC procedures

报错内容&#xff1a; Traceback (most recent call last):File "/root/anaconda3/envs/sakura/lib/python3.9/site-packages/langchain_community/graphs/neo4j_graph.py", line 205, in __init__self.refresh_schema()File "/root/anaconda3/envs/sakura/lib…

基于ACM32 MCU的两轮车充电桩方案介绍,有利于打造高效安全的电池管理

随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及&#xff0c;越来越多的人选择了电动车作为代步工具&#xff0c;而两轮电动车的出行半径较短&#xff0c;需要频繁充电&#xff0c;因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决两轮车…

C语言--sprintf()函数的用法

一.sprintf()语法 sprintf&#xff08;&#xff09; 是一个 C 语言中的函数&#xff0c;用于将格式化的数据写入一个字符串中。它的用法与 printf() 函数相似&#xff0c;printf&#xff08;&#xff09;函数是将内容输出到屏幕上&#xff0c;而sprintf()函数是将格式化的内容输…

基于大模型和向量数据库的 RAG 示例

1 RAG 介绍 RAG是一种先进的自然语言处理方法&#xff0c;它结合了信息检索和文本生成技术&#xff0c;用于提高问答系统、聊天机器人等应用的性能。 2 RAG 的工作流程 文档加载&#xff08;Document Loading&#xff09; 从各种来源加载大量文档数据。这些文档…

基于微信小程序的校园跑腿小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

SpringBoot(接受参数相关注解)

文章目录 1.基本介绍2.PathVariable 路径参数获取信息1.代码实例1.index.html2.ParameterController.java3.测试 2.细节说明 3.RequestHeader 请求头获取信息1.代码实例1.index.html2.ParameterController.java3.测试 2.细节说明 4.RequestParameter 请求获取参数信息1.代码实例…

08-java基础-锁之AQSReentrantLockBlockingQueueCountDownLatchSemapho

文章目录 0&#xff1a;AQS简介-常见面试题AQS具备特性state表示资源的可用状态AQS定义两种资源共享方式AQS定义两种队列自定义同步器实现时主要实现以下几种方法&#xff1a;同步等待队列条件等待队列 1&#xff1a;AQS应用之ReentrantLockReentrantLock如何实现synchronized不…

如何选购自助咖啡机?这三点是关键!

在竞争激烈的咖啡市场中&#xff0c;既有知名咖啡连锁品牌&#xff0c;也有众多咖啡馆和小型连锁店&#xff0c;无人智能饮品机要想在激烈的竞争中脱颖而出&#xff0c;发挥自身优势&#xff1a;快速便捷是关键&#xff0c;同时好的口感才能留客&#xff0c;因此饮品机的选购成…