Baumer工业相机
Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。
Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。
Baumer工业相机的具有彩色工业相机和黑白工业相机两种类型,适用于多种场合,专门用于各种工业应用的成像设备,如质量控制、自动化、检查和机器视觉。它们通常被设计成在极端条件下工作,如高温、潮湿、灰尘和振动。
Baumer工业相机的彩色和黑白成像的技术背景
堡盟工业相机有彩色和黑白两种类型。这两类相机的主要区别在于它们捕捉和处理图像的方式。
彩色相机配备有拜耳滤光片,这是一种放置在相机图像传感器前的类似棋盘的彩色滤光片。这种滤镜将光线分离成红、绿、蓝三色成分,然后由相机的图像处理器进行处理,形成全彩图像。
黑白相机通常使用没有拜耳滤镜的单色图像传感器。这些传感器捕获的图像是灰度的,没有色彩信息。
就应用而言,彩色相机通常用于色彩准确性和差异性很重要的场合,如产品检验或质量控制。黑白相机通常用于需要高对比度和清晰度的情况,如机器视觉应用或低光环境中。
最终,是选择彩色还是黑白堡盟工业相机将取决于相关应用的具体需求。
Baumer工业相机通过BGAPI SDK在回调函数里显示图像
Baumer彩色工业相机和黑白工业相机的像素格式有所不同,因此在SDK回调函数里进行格式转换显示图像时也会有所不同,下面介绍在C#里Baumer彩色工业相机和黑白工业相机的不同的显示图像的方式
彩色工业相机在BufferEvent显示图像
在回调函数里显示图像,C++调用代码如下所示:
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 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+".jpg"; pDlg->SaveImageColor(strpath, imagebuffer,width,height); pDlg->m_bSaveImage = false; } #pragma endregion Gdiplus::Rect rc = Gdiplus::Rect(0,0,width,height); #pragma region 彩色相机代码 if(pDlg->m_pBitmap == NULL) { pDlg->m_pBitmap = new Gdiplus::Bitmap(width,height, PixelFormat24bppRGB); //pDlg->m_pBitmap = new Gdiplus::Bitmap(width, height, PixelFormat8bppIndexed);//黑白相机修改为8bpp } Gdiplus::BitmapData lockedbits; Gdiplus::Status ret = pDlg->m_pBitmap->LockBits(&rc,Gdiplus::ImageLockModeWrite,PixelFormat24bppRGB,&lockedbits); //Gdiplus::Status ret = pDlg->m_pBitmap->LockBits(&rc, Gdiplus::ImageLockModeWrite, PixelFormat8bppIndexed, &lockedbits);//黑白相机修改为8bpp BYTE* pixels = (BYTE*)lockedbits.Scan0; BYTE* src = (BYTE*)imagebuffer; for (int row = 0; row < height; ++row) { CopyMemory(pixels, src, lockedbits.Stride); pixels += width*3; src += width*3; } pDlg->m_pBitmap->UnlockBits(&lockedbits); #pragma endregion #pragma region //将图像显示在PictureControl控件上 HDC hDC = ::GetDC(pDlg->m_stcPicture.m_hWnd); Gdiplus::Graphics GdiplusDC(hDC); CRect rcControl; pDlg->m_stcPicture.GetWindowRect(&rcControl); Gdiplus::Rect rtImage(0,0,rcControl.Width(),rcControl.Height()); GdiplusDC.DrawImage(pDlg->m_pBitmap,rtImage,0,0,width,height, Gdiplus::UnitPixel); ::ReleaseDC(pDlg->m_stcPicture.m_hWnd,hDC); delete pDlg->m_pBitmap ; pDlg->m_pBitmap =NULL; #pragma endregion // 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()); } }
黑白工业相机在BufferEvent显示图像
在回调函数里显示图像,C++调用代码如下所示:
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 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+".jpg"; pDlg->SaveImageMono(strpath, imagebuffer,width,height); pDlg->m_bSaveImage = false; } #pragma endregion Gdiplus::Rect rc = Gdiplus::Rect(0,0,width,height); #pragma region 黑白相机代码:像素格式为mono时转Bitmap的代码,彩色相机此处代码不同 if(pDlg->m_pBitmap == NULL) { pDlg->m_pBitmap = new Gdiplus::Bitmap(width,height,PixelFormat8bppIndexed); } Gdiplus::BitmapData lockedbits; Gdiplus::ColorPalette * pal = (Gdiplus::ColorPalette*)new BYTE[sizeof(Gdiplus::ColorPalette)+255*sizeof(Gdiplus::ARGB)]; pal->Count=256; for(UINT i=0;i<256;i++) { UINT color=i*65536+i*256+i; color= color|0xFF000000; pal->Entries[i]=color; } pDlg->m_pBitmap->SetPalette(pal); Gdiplus::Status ret = pDlg->m_pBitmap->LockBits(&rc,Gdiplus::ImageLockModeWrite,PixelFormat8bppIndexed,&lockedbits); BYTE* pixels = (BYTE*)lockedbits.Scan0; BYTE* src = (BYTE*)imagebuffer; for (int row = 0; row < height; ++row) { CopyMemory(pixels, src, lockedbits.Stride); pixels += width; src += width; } pDlg->m_pBitmap->UnlockBits(&lockedbits); #pragma endregion #pragma region //将图像显示在PictureControl控件上 HDC hDC = ::GetDC(pDlg->m_stcPicture.m_hWnd); Gdiplus::Graphics GdiplusDC(hDC); CRect rcControl; pDlg->m_stcPicture.GetWindowRect(&rcControl); Gdiplus::Rect rtImage(0,0,rcControl.Width(),rcControl.Height()); GdiplusDC.DrawImage(pDlg->m_pBitmap,rtImage,0,0,width,height, Gdiplus::UnitPixel); delete []pal; ::ReleaseDC(pDlg->m_stcPicture.m_hWnd,hDC); delete pDlg->m_pBitmap ; pDlg->m_pBitmap =NULL; #pragma endregion // 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()); } }
Baumer工业相机使用BGAPISDK的C++平台的优势
C++是一种强大的、面向对象的编程语言,为使用SDK的工业相机提供了若干优势。为此,使用C++的一些好处包括:
性能: 与其他编程语言如Java、Python或C#相比,C++具有更好的性能。这在处理工业相机时很重要,因为工业相机会产生大量的数据,需要快速处理。
跨平台的兼容性: C++可以在不同的平台上使用,如Windows、Linux和macOS,使其成为创建兼容不同操作系统的SDK的理想选择。
灵活性: 在编程方面,C++提供了很大的灵活性,使其易于用于不同种类的工业相机。此外,C++编程可用于集成不同的API,这使得为特定相机型号开发定制解决方案成为可能。
面向对象的方法: C++是一种面向对象的编程语言,这意味着它为组织代码提供了一个清晰的结构。这有利于创建可重复使用的代码,并促进模块化,使其更容易建立易于维护的复杂软件。
库和框架的可用性: 在C++中,有许多库和框架可以用来创建工业相机的SDK。这包括图像处理、计算机视觉、网络编程等方面的库。这些库使创建复杂的应用程序更加容易,而不必从头开始重写代码。
总之,C++平台为创建工业相机的SDK提供了许多优势。它的性能、跨平台兼容性、灵活性、面向对象的方法以及可用的库和框架使其成为开发工业相机软件的理想选择。
Baumer工业相机的的彩色相机和黑白相机分别的优势
堡盟彩色工业相机的优势:
由于使用了先进的彩色滤光片,色彩再现的精度更高。
能够提供更多的图像细节,更好地区分复杂场景中的物体。
更具视觉吸引力的图像,对检查和质量控制等任务很有用。
可用于机器视觉和交通监控等应用。
堡盟的黑白工业相机的优势:
由于没有彩色滤光片,提供更高的分辨率和更清晰的图像。
对光有更高的敏感性,使其成为低光照条件下的理想应用。
可以捕获更快的帧率,使其成为高速应用的理想选择,如生产线监控。
与彩色摄像机相比,成本降低,使它们成为某些应用中更经济的选择。
Baumer彩色工业相机和黑白工业相机在图像处理上的不同点
彩色工业相机和黑白(单色)工业相机在其图像处理能力上有所不同。
彩色工业相机被设计用来捕捉全彩图像,这意味着它们必须处理和分析来自多个颜色通道(通常是红色、绿色和蓝色)的数据。这需要更多的计算能力和专门的算法来从原始图像数据中提取准确的颜色信息。
黑白工业相机只捕获灰度图像,这意味着它们不需要处理多个颜色通道。这简化了图像处理任务,从而使帧率更快,分辨率更高,噪音更低。
这两种的区别也在导致上面再回调函数里进行显示图像时也有所不同的原因。
就应用而言,彩色工业相机是需要准确识别颜色的任务的理想选择,如质量控制、颜色分类和印刷材料的检查。黑白工业相机更适合于需要高灵敏度的任务,如低光成像或运动检测。