Basler Blaze

您所在的位置:网站首页 巴斯勒工业相机官网中国官方网站 Basler Blaze

Basler Blaze

2024-07-09 19:24| 来源: 网络整理| 查看: 265

目录 前言效果图环境安装SDK下载 正文相机的初始化实时采图开始抓图抓图函数停止抓图 总结

前言

关于Basler的相机还是很常见的,网上也有很多代码可以参考,但这个相机的版本是Blaze101。相信看到这篇文章的应该都知道,关于这个相机的资料确实很少,所以,我这里也是完成了这个相机的实时采图、触发采图、参数设置,三种功能。这里把一些资料也都发出来,希望能对看到这篇文章的人有所帮助。

效果图

在这里插入图片描述 上面这个效果图都是在相机没有加光源以及没有加镜头的情况下进行采集的。这里的触发采集会比较糊,我也不知道为啥,我自己录起来是没事的,但是放在CSDN就这样了。反正图像也还行。

环境安装 SDK下载

这里直接给出下载路径:Basler Blaze101sdk下载链接,这里注意,你进去官网,自己找的话,如果是关于这个相机的话,你要把页面调整成英文模式,才会出现这个相机SDK。 里面的那些库在软件的安装目录之下,这个自己去找下就行。 使用的lib文件是: 在这里插入图片描述 这些lib文件所需要依赖的dll文件为(也就是运行时所需要依赖的dll文件,注意要将这些文件放在你程序的运行目录之下): 在这里插入图片描述

正文 相机的初始化

a. 先给出这部分函数的代码:

bool MDeviceBlaze3d::InitDevice(QString index,QString identifier) { m_cCameraID = index; m_cIdentifier = identifier; bool ret = false; m_iFinishAcqFlag = false;//标志AcquisitionStop是否执行的标志 m_iGrabStopFlag = false;//标志GrabThreadStop是否执行的标志 m_iGrabThreadStopNumber = 0;//标志GrabThreadStop是在第几次执行的数量标识 m_iAcqStartNumber = 0;//标志AcquisitionStart是在第几次执行的数量标识 //上面这几个标识在后面进行主动操作与触发操作进行切换时,为保证功能切换完美,所需进行的操作。 #ifdef WIN_BLAZE_3D if(DeviceLoading(m_cIdentifier)) { m_pConfigureObj = new MConfigureBlaze3d();//配置参数的对象初始化 m_pConfigureObj->InitConfigure(m_cCameraID,(MDeviceAbstract*)this); m_pConfigureObj->RegisterConfigureCallback(m_fXmlChange,m_pCallUser); QVariant wVal; QVariant hVal; QVariant pixelForamt; QVariant frameRate; this->GetParameter("Width",wVal); this->GetParameter("Height",hVal); this->GetParameter("PixelFormat",pixelForamt); this->GetParameter("AcquisitionFrameRate",frameRate); m_iWidth = wVal.toInt();//这个m_iWidth以及m_iHeight对图像后面的显示很有用,如果你先做的实时采图,那这两个值应该先赋值 m_iHeight = hVal.toInt(); m_cPixelFormat = pixelForamt.toString(); m_fFrameRate = frameRate.toFloat(); m_pGralObj = new MGrabBlaze3d(); if(m_pGralObj) { m_pGralObj->InitGrab(index,(MDeviceAbstract*)this);//这个是对抓图对象的初始化 m_pGralObj->SetPixelFormat(m_cPixelFormat); } //m_pGralObj->RegisterCallBackFunEx(m_pCallUser,m_fGrabCallbackEx); ret = true; } #endif return ret; }

这部分是对一些类的对象入配置参数的对象以及采集抓图的函数进行初始化,以及对许多变量进行初始化。

下面这个是一些通过EnumerateCameras从而得到相机的许多信息,例如序列号,用户号,等等。先给出整个函数: bool MDeviceBlaze3d::DeviceLoading(QString identifier) { m_bLoaded = false; #ifdef WIN_BLAZE_3D try { //CameraList list = CGenTLCamera::EnumerateCameras(); CameraList list = CBlazeCamera::EnumerateCameras();//这个是获取相机信息的语句 qDebug()cFormat = PIXEL_FROMAT_MONO16; info->fFrameRate = m_fFrameRate; QImage::Format format = QImage::Format_Grayscale16; //判断图片缓存是否正确 if((img->width() !=m_iWidth) || (img->height() !=m_iHeight) || (img->format() !=format) ) { qDebug()setColorTable(m_vColorTabel); } uint16_t* pIntensity = (uint16_t*)parts[1].pData;//把这个数据的buffer地址的数据传到img所指向的指针 if(img->byteCount() >= info->nFramerLen) memcpy(img->bits(),pIntensity,info->nFramerLen); else memcpy(img->bits(),pIntensity,img->byteCount()); ret = RETURN_OK; } else { qDebug()nFramerLen = parts[1].size; info->cFormat = PIXEL_FROMAT_MONO16; info->fFrameRate = m_fFrameRate;

至于这里为啥part[1],而不是part[0],我也不知道,但好像partp[0]我是没办法拿到比较好的数据的,所以,你可以试一下。

接下来的这个操作比较常见: uint16_t* pIntensity = (uint16_t*)parts[1].pData;//把这个数据的buffer地址的数据传到img所指向的指针 if(img->byteCount() >= info->nFramerLen) memcpy(img->bits(),pIntensity,info->nFramerLen); else memcpy(img->bits(),pIntensity,img->byteCount());

因为我们这里要把pData的数据给img,所以,肯定要考虑哪个的buf会大一点,别最后弄得,有些数据都丢失了,就尴尬了。

停止抓图

这里基本上跟前面的开始抓图比较相似,我这里设置的是当那个采集按钮再按一次就执行关闭实时采图的功能。这里给出该函数的代码:

qint32 MDeviceBlaze3d::AcquisitionStop() { qint32 ret = RETURN_FAIL; #ifdef WIN_BLAZE_3D QVariant triggerMode; this->GetParameter("TriggerMode",triggerMode); QString triggerMode2 = triggerMode.toString(); try { if(m_bLoaded) { if(!m_bStopWork) { m_bStopWork = true; m_iFinishAcqFlag = true; if(m_pGralObj!=NULL && m_pGralObj->isRunning()) { qDebug()UpdateConfigureFromDevice()) m_pConfigureObj->SlotConfigChanged(); if(m_pConfigureObj->UpdateSimplyConfigureFromDevice()) m_pConfigureObj->SlotSimplyConfigChanged(); } ret = RETURN_OK; } } } catch(GenICam::GenericException &e) { qDebug()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3