Baumer工业相机堡盟工业相机通过BGAPISDK使用图像回调函数全帧率保存图像(C++)

news2025/1/11 20:05:22

Baumer工业相机堡盟工业相机通过BGAPISDK使用图像回调函数全帧率保存图像(C++)

  • Baumer工业相机
  • Baumer工业相机全帧率保存的技术背景
  • Baumer工业相机通过BGAPISDK使用相机图像回调函数
    • 1.引用合适的类文件
    • 2.通过BGAPISDK在相机图像回调函数全帧率保存
  • Baumer工业相机全帧率保存图像的优势
  • Baumer工业相机全帧率保存图像的行业应用

Baumer工业相机

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

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

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

Baumer工业相机全帧率保存的技术背景

为什么有些应用需要使用工业相机全帧率将图像保存到硬盘空间?

因为工业相机的设计是为了捕捉具有高速和高分辨率的图像,并且能够产生具有高比特深度的未经压缩的图像。

这允许实时捕获详细和高质量的图像,这在制造业和科学研究等行业可能是必要的,因为准确和快速的图像数据采集是至关重要的。

此外,使用工业相机可以确保在图像采集和存储过程中没有图像质量的损失,从而获得更可靠和一致的结果。

本文这里介绍通过BGAPISDK使用图像回调函数进行全帧率保存的方法。

Baumer工业相机通过BGAPISDK使用相机图像回调函数

下面介绍在C++里Baumer工业相机如何使用BGAPISDK的相机图像回调函数

1.引用合适的类文件

代码如下(示例):


#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <set>
#include <vector>
#include <algorithm>
#include <string>
#include "bgapi2_genicam/bgapi2_genicam.hpp"

2.通过BGAPISDK在相机图像回调函数全帧率保存

//图像回调函数
//==================
void BGAPI2CALL BufferHandler( void * callBackOwner, Buffer * pBufferFilled )
{
	CGigeDemoDlg* pDlg = (CGigeDemoDlg*)callBackOwner;
	unsigned char* imagebuffer = NULL;
	USES_CONVERSION;
	try
	{
		if(pBufferFilled == NULL)
		{

		}
		else if(pBufferFilled->GetIsIncomplete() == true)
		{
			// queue buffer again
			pBufferFilled->QueueBuffer();
		}
		else
		{
			
			pDlg->FrameID= pBufferFilled->GetFrameID();                                                 //获取当前图像FrameID显示帧率
			int frameid1 = pBufferFilled->GetFrameID();    
			int width = 0, height = 0;
			width = (int)pBufferFilled->GetWidth();height = (int)pBufferFilled->GetHeight();			//获取当前图像像素长宽
			CString PixelFormat1 = (CString)pBufferFilled->GetPixelFormat();							//获取当前图像像素格式
			imagebuffer = (BYTE*)((bo_int64)pBufferFilled->GetMemPtr()+pBufferFilled->GetImageOffset());//获取当前图像数据
			
			#pragma region //保存图像功能已停用(抓拍功能)
			
			if(pDlg->m_bSaveImage &&!pDlg->m_strDirectory.IsEmpty())
			{
				CTime time = CTime::GetCurrentTime(); 
				CString strtime;
				strtime.Format(_T("\\%4d%2d%2d%2d%2d%2d"),time.GetYear(),time.GetMonth(),time.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond());
				CString  strpath = pDlg->m_strDirectory+strtime+"-";
				CString  strpath2;
				strpath2.Format(_T("%s%d%s"),strpath,frameid1,_T(".jpg"));
				//pDlg->FullFrameSaveImageName.Add(strpath2);
				pDlg->SaveImageMono(strpath2, imagebuffer,width,height);
				pDlg->TestNum0 =pDlg->TestNum0 +1;
				
				if(pDlg->TestNum0==60)
				{
					pDlg->m_bSaveImage = false;
				}
				
			}
			#pragma endregion 

							
			
			delete pDlg->m_pBitmap ;
			pDlg->m_pBitmap =NULL;


			// queue buffer again
			pBufferFilled->QueueBuffer();
		}
	}
	catch (BGAPI2::Exceptions::IException& ex)
	{
		CString str;
		str.Format(_T("ExceptionType:%s! ErrorDescription:%s in function:%s"),ex.GetType(),ex.GetErrorDescription(),ex.GetFunctionName());		
	}	
}

//将图像数据保存在本地
bool CGigeDemoDlg::SaveImageMono(CString str,BYTE* bdata,int width,int height)
{		
	if (str.IsEmpty()) return false;
	
	HANDLE hFile = CreateFile(str,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
	//DWORD dwError = GetLastError();
	if (!hFile || hFile == INVALID_HANDLE_VALUE) 
		return false;
	
	// 
	BITMAPFILEHEADER	FileHeader;
	BITMAPINFOHEADER	InfoHeader;
	RGBQUAD rgbQuad[256];

	DWORD dwImageSize				= width*height;
	FileHeader.bfType				= 0x4D42; // "BM"
	FileHeader.bfSize				= sizeof(FileHeader) + sizeof(InfoHeader) + dwImageSize;
	FileHeader.bfReserved1			= FileHeader.bfReserved2 = 0;
	FileHeader.bfOffBits			= sizeof(FileHeader) + sizeof(InfoHeader);
	
	ZeroMemory(&InfoHeader, sizeof(InfoHeader));
	InfoHeader.biWidth				= width;
	InfoHeader.biHeight				= -height;
	InfoHeader.biSizeImage			= dwImageSize;
	InfoHeader.biBitCount			= 8;
	InfoHeader.biCompression		= BI_RGB;
	InfoHeader.biPlanes				= 1;
	InfoHeader.biSize				= sizeof(BITMAPINFOHEADER);
	InfoHeader.biXPelsPerMeter		= 0xEC4;
	InfoHeader.biYPelsPerMeter		= 0xEC4;

	for ( int i=0;i<256; i++ )
	{
		rgbQuad[i].rgbBlue = (BYTE)i;
		rgbQuad[i].rgbGreen = (BYTE)i;
		rgbQuad[i].rgbRed = (BYTE)i;
		rgbQuad[i].rgbReserved = 0;
	}

	DWORD Written;
	WriteFile(hFile, (LPVOID)&FileHeader,sizeof(BITMAPFILEHEADER),&Written, NULL);
	WriteFile(hFile, (LPVOID)&InfoHeader,sizeof(BITMAPINFOHEADER),&Written, NULL);
	WriteFile(hFile, (LPVOID)rgbQuad,256*sizeof(RGBQUAD),&Written,NULL);
	BYTE* src = bdata;
	//int stride = m_Width*4;
	

	//DWORD bytes = m_Width * 4;
	//for (unsigned long y = 0; y < NHEIGHT; y++) {
	WriteFile(hFile, (LPVOID)src,dwImageSize,&Written,NULL);
	//}
	CloseHandle(hFile);
	return true;
}

呈现效果如下所示:
在这里插入图片描述

如上测试结果显示可以全帧率保存60张图片,适当修改可以实现定制化需求。

Baumer工业相机全帧率保存图像的优势

1、能够清晰、精确地捕捉快速移动的物体,这对制造业和体育等行业非常重要。

2、通过高速拍摄,工业相机可以捕捉到运动中部件和产品的图像,从而可以发现缺陷和质量问题。

3、这项技术对于分析运动员和动物的运动也是至关重要的,可以为训练员和教练员提供深入了解。

4、高速拍摄功能允许慢动作回放,使人们能够进一步分析所拍摄的画面。

5、包括能够捕捉快速移动物体的图像而不产生运动模糊,提高测量物体速度和位置的准确性,以及实时检测和分析快速过程和变化的能力。

6、这些相机可以在各种行业中发挥作用,包括制造业、自动化、机器人技术等。

7、高速成像可以为流程提供有价值的见解,并帮助公司优化其运营,以提高效率和生产力。

Baumer工业相机全帧率保存图像的行业应用

机器视觉: 全帧率保存图像的工业相机可用于机器视觉应用,以捕获快速移动的物体或过程的图像。这可用于制造、质量控制或检查应用。

机器人技术:全帧率保存图像的工业相机可用于机器人技术应用,以捕捉快速移动物体的图像或跟踪机器人的运动。这可用于制造、装配或取放应用。

医学成像: 全帧率保存图像的工业相机可用于医疗成像应用,以捕捉内部器官的高速图像或跟踪手术器械的运动。这可用于微创手术或诊断成像。

体育分析: 全帧率保存图像的工业相机可用于体育分析应用,捕捉运动员运动时的高速图像。这可用于训练或体育广播应用。

航空航天: 全帧率保存图像的工业相机可用于航空航天领域,捕捉高速事件的图像,如火箭发射或飞机测试。

总之,工业相机的全帧率保存图像功能是任何需要高速图像采集、高效数据传输和实时图像分析的应用的理想选择。

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

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

相关文章

LabVIEWCompactRIO 开发指南31 在LabVIEW FPGA中使用DMA FIFO

LabVIEWCompactRIO 开发指南31 在LabVIEW FPGA中使用DMA FIFO 要为流数据创建DMA缓冲区&#xff0c;请右键单击FPGA目标并选择New...FIFO。为FIFO结构指定一个描述性名称&#xff0c;并选择“target to host”作为类型。这意味着数据应该通过这个DMA FIFO从FPGA目标流向实时主…

“饶派杯”XCTF车联网安全挑战赛战队巡礼!

2023年5月31日&#xff0c;“饶派杯” XCTF车联网安全挑战赛将于江西省上饶市重磅开赛。本届大赛由江西省委网信办、江西省工信厅、上饶市人民政府主办&#xff0c;旨在深入贯彻落实国家网络强国和交通强国战略部署&#xff0c;推动智能网联汽车技术与产业发展、加快该领域人才…

大数据(三)大数据技术栈发展史

-系列目录- 大数据(一)背景和概念 大数据(二)大数据架构发展史 大数据(三)大数据技术栈发展史 前两章&#xff0c;我们分析了大数据相关的概念和发展史&#xff0c;本节我们就讲一讲具体的大数据领域的常见技术栈发展史。对主流技术栈有一个初步的认知。 一、总览 大数据技术栈…

课程分享:鸿蒙HarmonyOS系统及物联网开发实战课程(附课程视频及源码下载)

课程名称&#xff1a; 鸿蒙HarmonyOS系统及物联网开发实战课程 课程介绍&#xff1a; HarmonyOS 是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上&#xff0c;HarmonyOS 提出了基于同一套系统能力、适配多种终端形态的分布式理念&#xff0c…

设计模式之【状态模式】,如何设计一个“状态管理大师”

文章目录 一、什么是状态模式1、状态模式使用场景2、状态模式优缺点3、状态模式的三大角色4、状态模式与责任链模式的区别5、状态模式与策略模式的区别 二、实例1、状态模式的一般写法&#xff08;1&#xff09;简单写法&#xff08;2&#xff09;进阶写法&#xff08;3&#x…

redis的优化和持久化

持久化的功能&#xff1a;Redis是内存数据库&#xff0c;数据都是存储在内存中&#xff0c;为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失&#xff0c;需要定期将Redis中的数据以某种形式&#xff08;数据或命令&#xff09;从内存保存到硬盘&#xff1b;当下…

在 Android 手机上恢复出厂设置后恢复照片的 4 种简单方法(新方法)

“嗨&#xff0c;谁能帮我恢复我的照片&#xff0c;因为我不小心恢复了出厂设置&#xff0c;而且我没有做备份&#xff1f;几个月来我一直试图通过使用恢复软件来恢复我的照片&#xff0c;root 了一个深扫描&#xff0c;但没用……” 恢复出厂设置可以清除电子设备的所有信息并…

【arxiv】找论文idea : 关于 SAM 的论文扫读(二)

文章目录 一、A Comprehensive Survey on Segment Anything Model for Vision and Beyond二、Segment Anything Model (SAM) Enhanced Pseudo Labels for Weakly Supervised Semantic Segmentation三、How Segment Anything Model (SAM) Boost Medical Image Segmentation?四、…

OJ万题详解––组合线段(C++详解)

好久没有更新博文了&#xff0c;我上一篇博文的发布时间还是&#xff1a; 题目 这是我们周考的第二道题&#xff0c;乍一看&#xff0c;很简单&#xff0c;仔细做&#xff0c;更简单。&#xff08;我都没做起&#xff09; 分析 我相信&#xff0c;很多人第一次看到这个题目就…

Nginx安装与使用

文章目录 1. &#x1fa90;Nginx-概述1.1 介绍1.2 下载和安装1.2.1 官网下载1.2.2 网盘下载1.2.3 安装 1.3 目录结构 2. &#x1fa90;Nginx-命令2.1 常用命令2.2 环境变量配置 3. &#x1fa90;Nginx-应用3.1 配置文件结构3.2 部署静态资源3.2.1 介绍3.2.2 测试 3.3 反向代理3…

conda 笔记 conda命令收集

1 conda相关命令 conda info 判断conda是否正常安装检查conda版本号 conda update -n base conda 将conda更新到当前版本 conda update anaconda 将所有的package尽量更新到最新的版本加尽量的原因是&#xff0c;包裹之间可能会有冲突&#xff0c;所以需要优先保证packa…

玩转ChatGPT:制作思维导图

一、写在前面 最近&#xff0c;在学习深度学习图像识别的相关知识和代码&#xff0c;想着能否用小Chat搞一个思维导图。 简单问小Chat&#xff1a; 咒语&#xff1a;我怎么使用你做一个思维导图&#xff1f;需要配合什么软件生成&#xff1f;&#xff1f; 大意就是&#xff…

JavaEE(系列11) -- 多线程案例4(线程池)

目录 1. 线程池 2. 创建线程池 2.1 Executors类 2.2 ThreadPoolExecutor类 3. 自己实现线程池 1. 线程池 线程池是一种多线程处理形式&#xff0c;处理过程中将任务添加到队列&#xff0c;然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈…

百分位数、数据分布、直方图、正态数据分布

目录 1、百分位数 2、数据分布 3、正态数据分布 1、百分位数 统计学中使用百分位数&#xff08;Percentiles&#xff09;提供一个数字&#xff0c;该数字描述了给定百分比值小于的值。 例如&#xff1a;假设我们有一个数组&#xff0c;包含一时刻一条街上人的年龄 arr […

搜索二维矩阵——力扣74

文章目录 题目描述法一&#xff09;一次二分查找法二&#xff09;两次二分查找法三&#xff09;抽象二叉搜索树BST解法 题目描述 法一&#xff09;一次二分查找 首先分析题目&#xff1a;由于①每行的整数从左到右升序&#xff1b;②每行的第一个整数>前一行的最后一个整数&…

AC和AP和STA信息查询

AC和AP和STA信息查询 1、AC的运行统计信息1.1、查看设备的部件类型及状态信息 2、AP的运行统计信息2.1、AP的运行信息 / 查看RU的运行信息2.2、AP性能统计信息2.3、AP的射频信息2.4、AP重启失败的记录2.5、非法AP的存在情况2.6、设备信道切换的记录信息2.7、查看指定AP射频上的…

自助式数据分析工具:jvs-sdw(数据智仓)图表配置说明和实现效果

图表的查询条件配置示例说明 在JVS数据分析图表中&#xff0c;是支持查询条件进行多个数据展示组件的联动查询&#xff0c;实现的方式是设置统一的查询条件&#xff0c;在每个图表组件中&#xff0c;设置对应的查询字段去关联查询条件&#xff0c;那么下面我们逐步介绍配置方式…

CMOS摄像头驱动分析

CMOS摄像头驱动分析 文章目录 CMOS摄像头驱动分析ov2640_probe_dt从设备树中获取ov2640的GPIO引脚并进行初始化v4l2_i2c_subdev_init初始化v4l2子设备v4l2_ctrl_new_std添加vflip控制器 ov2640_probe_dt从设备树中获取ov2640的GPIO引脚并进行初始化 ov2640_probe_dt从设备树中…

设计模式剖析,授之以渔(java代码)

创建型模式 简单工厂模式 public class FoodFactory {public static Food makeFood(String name) {if (name.equals("noodle")) {Food noodle new LanZhouNoodle();noodle.addSpicy("more");return noodle;} else if (name.equals("chicken")…

【论文阅读笔记】BaFFLe: Backdoor Detection via Feedback-based Federated Learning

个人阅读笔记&#xff0c;如有错误欢迎指出 会议&#xff1a;2021 IEEE 41st International Conference on Distributed Computing Systems (ICDCS) BaFFLe: Backdoor Detection via Feedback-based Federated Learning | IEEE Conference Publication | IEEE Xplore 问题&am…