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

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

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;
}

呈现效果如下所示:


5.png

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


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

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


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


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


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


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


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


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


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

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


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


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


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


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


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

目录
相关文章
|
6月前
|
存储 数据采集 数据可视化
【C++】医院PACS医学图像存储和传输系统源码
图像后处理与重建 •MPR\CPR(三维多平面重建) •VRT(三维容积重建) •SSD(三维表面重建) •VE(虚拟内窥镜) •MIP(最大密度投影)、MinIP(最小密度投影) •CalSCore(心脏图像冠脉钙化积分)
95 3
|
3月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
238 0
|
3月前
|
传感器 定位技术 C++
基于C++的GDAL用空白栅格填充长时间序列遥感影像中的缺失图像
然后,定义需要处理的遥感影像路径列表,和识别数据缺失的逻辑。这里我们简化处理,假设已经知道哪一幅图像是缺失的,因此直接跳过识别步骤。
59 1
|
5月前
|
算法 Java API
在VC++中使用CxImage库读写图像实现像素操作
在VC++中使用CxImage库读写图像实现像素操作
37 0
|
6月前
|
存储 算法 数据可视化
|
6月前
|
C++ 计算机视觉 Python
【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)
【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)
182 0
【Py调用C++】使用使用python调用C++生成dll处理图像(OPENCV)
|
10天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
39 4
|
11天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
35 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
1月前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4