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工业相机全帧率保存图像的行业应用

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


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


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


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


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


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

目录
相关文章
|
3月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Force IP强制修改网口IP功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用Force IP强制修改网口IP功能(C++)
44 0
|
3月前
|
监控 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取每张图像的微秒时间和FrameID功能(C++)
59 0
|
7天前
|
C++ 容器
C++中自定义结构体或类作为关联容器的键
C++中自定义结构体或类作为关联容器的键
14 0
|
7天前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数
|
6天前
|
存储 安全 编译器
【C++】类和对象(下)
【C++】类和对象(下)
【C++】类和对象(下)
|
5天前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
5天前
|
编译器 C++
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
virtual类的使用方法问题之静态和非静态函数成员在C++对象模型中存放如何解决
|
5天前
|
编译器 C++
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
virtual类的使用方法问题之在C++中获取对象的vptr(虚拟表指针)如何解决
|
12天前
|
C++
C++ --> 类和对象(三)
C++ --> 类和对象(三)
26 9
|
6天前
|
编译器 C++
【C++】类和对象(中)
【C++】类和对象(中)