Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现一次触发多张图像采集功能(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现一次触发多张图像采集功能(C++)

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工业相机如何通过BGAPISDK进行定序器编程:实现一次触发多张图像采集。

预期的相机动作

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

定序器的工作原理

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

考虑到定序器的基本原理,定序器的参数设置比预想的要复杂得多:

由于第一张图像的采集由硬件触发,随后必须在不同的曝光时间内立即自动采集第二张及更多图像,因此两组不同的定序器必不可少。

第一组定序器(Set0)包含用于配置TriggerMode的必要参数,以及第一张图像的预期曝光时间。

第二组定序器(Set1)将相机重新设置为自由运行操作模式,并对曝光时间及预期/所需计数器数据进行设置。

此外,两组定序器都需要提供定序器组及路径的相关信息。

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

下面介绍在C#里Baumer工业相机如何通过NEOAPI SDK使用定序器实现一次触发多次采集功能

在使用定序器时,可能需要提前设置,以便可视化显示在什么时间应当发生的事件。在本例中,设置非常简单:

第一张图像的采集由硬件触发(通过"Line0"输入实现)------Line0同时触发定序器启动

第一组定序器(Set0)开始配置并触发第二张图像的采集

第二组定序器组(Set1)开始配置并触发第三张图像的采集

1.引用合适的类文件

代码如下(示例):

cpp 复制代码
#include <stdio.h>
#include <iostream>
#include "bgapi2_genicam/bgapi2_genicam.hpp"
#include <iostream>
#include <iostream>
#include "neoapi.hpp"

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

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

cpp 复制代码
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
	
	// 设置GPIO "Line3"作为输出
	camera.f().LineSelector.SetString("Line3");
	camera.f().LineInverter.Set("false");
	camera.f().UserOutputSelector.SetString("UserOutput1");
	camera.f().UserOutputValue.Set("false");
	camera.f().LineSource.SetString("UserOutput1");
	
	// 开启定序器设置模式
	camera.f().SequencerConfigurationMode.SetString("On");
	
	// 设置第一组定序器功能Set0
	camera.f().SequencerSetSelector.Set(1.0);
	camera.f().SequencerSetLoad.Execute();	//执行第一组定序器参数载入   
	camera.f().TriggerMode.SetString("On");
	camera.f().CounterSelector.SetString("Counter1");
	camera.f().CounterEventSource.SetString("Off");
	
	
	// 设置第一组定序器Set0的曝光参数
	camera.f().ExposureTime.Set(15000.0);
	camera.f().SequencerPathSelector.Set(0);
	camera.f().SequencerTriggerSource.SetString("ExposureActive");
	camera.f().SequencerTriggerActivation.SetString("RisingEdge");
	camera.f().SequencerSetNext.Set(1);
	camera.f().SequencerSetSave.Execute();	//执行第一组定序器参数保存
	
	// 设置第二组定序器功能Set1
	camera.f().SequencerSetSelector.Set(1);
	camera.f().SequencerSetLoad.Execute();	//开启第二组定序器参数       
	camera.f().TriggerMode.SetString("Off");
	camera.f().CounterSelector.SetString("Counter1");
	camera.f().CounterEventSource.SetString("ExposureActive");
	camera.f().CounterEventActivation.SetString("RisingEdge");
	camera.f().CounterDuration.Set(2);
	camera.f().CounterResetSource.SetString("Counter1End");
	camera.f().CounterResetActivation.SetString("RisingEdge");

	

	// Set ExposureTime for Set1
	// 设置第二组定序器Set1的曝光参数
	camera.f().ExposureTime.Set(10000.0);
	camera.f().SequencerPathSelector.Set(0);
	camera.f().SequencerTriggerSource.SetString("Counter1End");
	camera.f().SequencerTriggerActivation.SetString("RisingEdge");
	camera.f().SequencerSetNext.Set(1);
	camera.f().SequencerSetSave.Execute();	//执行第二组定序器参数保存
	camera.f().SequencerSetStart.Set(0);


	// SEQUENCER CONFIG END
	// 定序器参数设置结束
	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. 医疗影像: 在医疗影像领域,工业相机的定序器功能可以用于多角度拍摄或同时拍摄不同模态的影像,例如X光片和红外影像,从而为医生提供更全面的影像信息来进行诊断和治疗。

  3. 交通监控: 工业相机在交通监控领域的应用也十分广泛。通过定序器功能,可以实现同时对车辆、行人和交通信号灯等进行多角度、多条件的监控拍摄,以提高交通监控系统的全面性和精度。

  4. 农业领域: 在农业领域,工业相机的定序器功能可用于同时采集植物生长过程中的多种图像信息,如植物生长的速度、形态学特征和病虫害检测等,以实现对植物生长情况的全面监测和分析。

  5. 机器人视觉: 在工业机器人视觉系统中,可以利用定序器功能实现机器人在执行任务时同时获取多种角度的图像,从而帮助机器人更准确地感知周围环境,提高工作效率和精度。

这些行业应用示例表明,工业相机使用定序器功能进行一次触发实现多种图像采集,可为许多行业带来更全面、高效的视觉检测和数据采集解决方案。

相关推荐
湫ccc1 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe1 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin1 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
Ysjt | 深2 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
珠海新立电子科技有限公司2 小时前
FPC柔性线路板与智能生活的融合
人工智能·生活·制造
ephemerals__2 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞2 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货2 小时前
Rust 的简介
开发语言·后端·rust