Qt(C++)调用工业相机Basler的SDK使用示例
简介
由于公司采购的AVT相机不足,需要用Basler相机来弥补,所以我也了解了一下Basler这款相机的SDK。由于Basler这边的相机提供的没有提供Qt的示例,所以我做一个分享出来。
本篇的Demo采用的是工业黑白相机。工业应用中,如果我们要处理的是与图像颜色有关,那么我们最好采用彩色工业相机;如果不是,那么我们最好选用黑白工业相机,因为在同样分辨率下的工业相机,黑白工业教学精度比彩色工业相机高,尤其是在看图像边缘的时候,黑白工业相机的效果更好。
开发环境
- Qt: 5.6.2vc2013版
- Basler: 5.0.11版
效果图
上图只是做了SDK部分接口的获取和设置。相机的触发方式、曝光时间、增益、频率,以及图片的尺寸、灯的触发信号等。
Basler相机SDK接口调用控制类
#ifndefSBASLERCAMERACONTROL_H #defineSBASLERCAMERACONTROL_H #include#include #include #include #defineDOUBLE_MAX100000 #defineDOUBLE_MIN0 usingnamespacestd; usingnamespacePylon; usingnamespaceGenApi; classSBaslerCameraControl:publicQObject { Q_OBJECT public: explicitSBaslerCameraControl(QObject*parent=0); ~SBaslerCameraControl(); enumSBaslerCameraControl_Type{ Type_Basler_Freerun,//设置相机的内触发 Type_Basler_Line1,//设置相机的外触发 Type_Basler_ExposureTimeAbs,//设置相机的曝光时间 Type_Basler_GainRaw,//设置相机的增益 Type_Basler_AcquisitionFrameRateAbs,//设置相机的频率 Type_Basler_Width,//图片的宽度 Type_Basler_Height,//图片的高度 Type_Basler_LineSource,//灯的触发信号 }; voidinitSome(); voiddeleteAll(); QStringListcameras(); intOpenCamera(QStringcameraSN); intCloseCamera(); voidsetExposureTime(doubletime);//设置曝光时间 intgetExposureTime();//获取曝光时间 intgetExposureTimeMin();//最小曝光时间 intgetExposureTimeMax();//最大曝光时间 voidsetFeatureTriggerSourceType(QStringtype);//设置种类 QStringgetFeatureTriggerSourceType();//获取种类:软触发、外触发等等 voidsetFeatureTriggerModeType(boolon);//设置模式触发 boolgetFeatureTriggerModeType();//获取模式触发 voidSetCamera(SBaslerCameraControl::SBaslerCameraControl_Typeindex,doubletmpValue=0.0);//设置各种参数 doubleGetCamera(SBaslerCameraControl::SBaslerCameraControl_Typeindex);//获取各种参数 longGrabImage(QImage&image,inttimeout=2000); longStartAcquire();//开始采集 longStopAcquire();//结束采集 signals: voidsigCameraUpdate(QStringListlist); voidsigSizeChange(QSizesize); voidsigCameraCount(intcount); voidsigCurrentImage(QImageimg); private: voidUpdateCameraList(); voidCopyToImage(CGrabResultPtrpInBuffer,QImage&OutImage); privateslots: voidonTimerGrabImage(); private: CInstantCameram_basler; QStringListm_cameralist; QStringm_currentMode; boolm_isOpenAcquire=false;//是否开始采集 boolm_isOpen=false;//是否打开摄像头 QSizem_size; }; #endif//SBASLERCAMERACONTROL_H
源文件:
#include"sbaslercameracontrol.h" #include#include SBaslerCameraControl::SBaslerCameraControl(QObject*parent):QObject(parent) { } SBaslerCameraControl::~SBaslerCameraControl() { } voidSBaslerCameraControl::initSome() { qDebug()<<"SBaslerCameraControl:PylonInitializeinitSome"; PylonInitialize(); CTlFactory&TlFactory=CTlFactory::GetInstance(); TlInfoList_tlstInfo; intn=TlFactory.EnumerateTls(lstInfo); TlInfoList_t::const_iteratorit; for(it=lstInfo.begin();it!=lstInfo.end();++it){ qDebug()<<"FriendlyName:"< GetFriendlyName()<<"FullName:"< GetFullName(); qDebug()<<"VendorName:"< GetVendorName()<<"DeviceClass:"< GetDeviceClass(); } UpdateCameraList(); emitsigCameraCount(n); qDebug()<<"SBaslerCameraCount:"< EnumerateDevices(devices); CInstantCameraArraycameraArray(devices.size()); if(n==0){ qDebug()<<"CannotfindAnycamera!"; return; } for(inti=0;i GetBuffer(); intnHeight=pInBuffer->GetHeight(); intnWidth=pInBuffer->GetWidth(); if(m_size!=QSize(nWidth,nHeight)){ m_size=QSize(nWidth,nHeight); emitsigSizeChange(m_size); } QImageimgBuff(buff,nWidth,nHeight,QImage::Format_Indexed8); OutImage=imgBuff; if(pInBuffer->GetPixelType()==PixelType_Mono8){ uchar*pCursor=OutImage.bits(); if(OutImage.bytesPerLine()!=nWidth){ for(inty=0;y FromString("FrameStart"); CEnumerationPtrptrTrigger=cameraNodeMap.GetNode("TriggerMode"); ptrTrigger->SetIntValue(1); CEnumerationPtrptrTriggerSource=cameraNodeMap.GetNode("TriggerSource"); String_tstr=ptrTriggerSource->ToString(); m_currentMode=QString::fromLocal8Bit(str.c_str()); returnm_currentMode; } voidSBaslerCameraControl::setFeatureTriggerModeType(boolon) { INodeMap&cameraNodeMap=m_basler.GetNodeMap(); CEnumerationPtrptrTriggerSel=cameraNodeMap.GetNode("TriggerSelector"); ptrTriggerSel->FromString("FrameStart"); CEnumerationPtrptrTrigger=cameraNodeMap.GetNode("TriggerMode"); ptrTrigger->SetIntValue(on?1:0); } boolSBaslerCameraControl::getFeatureTriggerModeType() { INodeMap&cameraNodeMap=m_basler.GetNodeMap(); CEnumerationPtrptrTriggerSel=cameraNodeMap.GetNode("TriggerSelector"); ptrTriggerSel->FromString("FrameStart"); CEnumerationPtrptrTrigger=cameraNodeMap.GetNode("TriggerMode"); returnptrTrigger->GetIntValue()==1; } voidSBaslerCameraControl::SetCamera(SBaslerCameraControl::SBaslerCameraControl_Typeindex,doubletmpValue) { INodeMap&cameraNodeMap=m_basler.GetNodeMap(); switch(index){ caseType_Basler_Freerun:{ CEnumerationPtrptrTriggerSel=cameraNodeMap.GetNode("TriggerSelector"); ptrTriggerSel->FromString("FrameStart"); CEnumerationPtrptrTrigger=cameraNodeMap.GetNode("TriggerMode"); #ifdefReal_Freerun ptrTrigger->SetIntValue(0); #else//Software ptrTrigger->SetIntValue(1); CEnumerationPtrptrTriggerSource=cameraNodeMap.GetNode("TriggerSource"); ptrTriggerSource->FromString("Software"); #endif }break; caseType_Basler_Line1:{ CEnumerationPtrptrTriggerSel=cameraNodeMap.GetNode("TriggerSelector"); ptrTriggerSel->FromString("FrameStart"); CEnumerationPtrptrTrigger=cameraNodeMap.GetNode("TriggerMode"); ptrTrigger->SetIntValue(1); CEnumerationPtrptrTriggerSource=cameraNodeMap.GetNode("TriggerSource"); ptrTriggerSource->FromString("Line1"); }break; caseType_Basler_ExposureTimeAbs:{ constCFloatPtrexposureTime=cameraNodeMap.GetNode("ExposureTimeAbs"); exposureTime->SetValue(tmpValue); }break; caseType_Basler_GainRaw:{ constCIntegerPtrcameraGen=cameraNodeMap.GetNode("GainRaw"); cameraGen->SetValue(tmpValue); }break; caseType_Basler_AcquisitionFrameRateAbs:{ constCBooleanPtrframeRate=cameraNodeMap.GetNode("AcquisitionFrameRateEnable"); frameRate->SetValue(TRUE); constCFloatPtrframeRateABS=cameraNodeMap.GetNode("AcquisitionFrameRateAbs"); frameRateABS->SetValue(tmpValue); }break; caseType_Basler_Width:{ constCIntegerPtrwidthPic=cameraNodeMap.GetNode("Width"); widthPic->SetValue(tmpValue); }break; caseType_Basler_Height:{ constCIntegerPtrheightPic=cameraNodeMap.GetNode("Height"); heightPic->SetValue(tmpValue); }break; caseType_Basler_LineSource:{ CEnumerationPtrptrLineSource=cameraNodeMap.GetNode("LineSource"); ptrLineSource->SetIntValue(2); }break; default: break; } } doubleSBaslerCameraControl::GetCamera(SBaslerCameraControl::SBaslerCameraControl_Typeindex) { INodeMap&cameraNodeMap=m_basler.GetNodeMap(); switch(index){ caseType_Basler_ExposureTimeAbs:{ constCFloatPtrexposureTime=cameraNodeMap.GetNode("ExposureTimeAbs"); returnexposureTime->GetValue(); }break; caseType_Basler_GainRaw:{ constCIntegerPtrcameraGen=cameraNodeMap.GetNode("GainRaw"); returncameraGen->GetValue(); }break; caseType_Basler_AcquisitionFrameRateAbs:{ constCBooleanPtrframeRate=cameraNodeMap.GetNode("AcquisitionFrameRateEnable"); frameRate->SetValue(TRUE); constCFloatPtrframeRateABS=cameraNodeMap.GetNode("AcquisitionFrameRateAbs"); returnframeRateABS->GetValue(); }break; caseType_Basler_Width:{ constCIntegerPtrwidthPic=cameraNodeMap.GetNode("Width"); returnwidthPic->GetValue(); }break; caseType_Basler_Height:{ constCIntegerPtrheightPic=cameraNodeMap.GetNode("Height"); returnheightPic->GetValue(); }break; default: return-1; break; } } longSBaslerCameraControl::StartAcquire() { m_isOpenAcquire=true; qDebug()<<"SBaslerCameraControlIsGrabbing"; try{ qDebug()<<"SBaslerCameraControlStartAcquire"< GrabSucceeded()){ if(!ptrGrabResult.IsValid()){OutputDebugString(L"GrabResultnotValidError\n");return-1;} EPixelTypepixelType=ptrGrabResult->GetPixelType(); switch(pixelType){ casePixelType_Mono8:{ CopyToImage(ptrGrabResult,image); }break; casePixelType_BayerRG8:{qDebug()<<"what:PixelType_BayerRG8";}break; default:qDebug()<<"what:default";break; } }else{ OutputDebugString(L"GrabError!!!"); return-3; } }catch(GenICam::GenericException&e){ OutputDebugString(L"GrabImageError\n"); return-2; }catch(...){ OutputDebugString(L"ZP11ShotGetParamTry12NoknowError\n"); return-1; } return0; }
如何调用
#ifndefMAINWINDOW_H #defineMAINWINDOW_H #include#include"BaslerCamera/sbaslercameracontrol.h" namespaceUi{ classMainWindow; } classMainWindow:publicQMainWindow { Q_OBJECT public: explicitMainWindow(QWidget*parent=0); ~MainWindow(); privateslots: voidon_pushButton_GetExTime_clicked(); voidon_pushButton_SetExTime_clicked(); voidon_pushButton_SetMode_clicked(); voidon_pushButton_GetMode_clicked(); voidon_pushButton_CFMode_clicked(); voidon_comboBox_CFMode_activated(intindex); voidon_pushButton_Start_clicked(); voidon_pushButtonRotate_clicked(); private: Ui::MainWindow*ui; SBaslerCameraControl*m_control=Q_NULLPTR; QMatrixm_matrix; }; #endif//MAINWINDOW_H
源文件:
#include"mainwindow.h" #include"ui_mainwindow.h" #includeMainWindow::MainWindow(QWidget*parent): QMainWindow(parent), ui(newUi::MainWindow) { ui->setupUi(this); m_control=newSBaslerCameraControl(this); m_control->initSome(); connect(m_control,&SBaslerCameraControl::sigCurrentImage,[=](QImageimg){ QPixmappix=QPixmap::fromImage(img).transformed(m_matrix); ui->label->setPixmap(pix); ui->widget_pic->setFixedSize(pix.size()); }); connect(m_control,&SBaslerCameraControl::sigSizeChange,[=](QSizesize){ //默认大小641,494 ui->label_size->setText(QString("\345\260\272\345\257\270:%0*%1").arg(QString::number(size.width())).arg(QString::number(size.height())));//尺寸 ui->widget_pic->setFixedSize(size); }); m_control->OpenCamera(m_control->cameras().first()); } MainWindow::~MainWindow() { m_control->CloseCamera(); m_control->deleteAll(); deleteui; } voidMainWindow::on_pushButton_GetExTime_clicked() { ui->label_exTime->setText(QString::number(m_control->getExposureTime())); } voidMainWindow::on_pushButton_SetExTime_clicked() { m_control->setExposureTime(ui->lineEdit_exTime->text().toDouble()); } voidMainWindow::on_pushButton_SetMode_clicked() { m_control->setFeatureTriggerSourceType(ui->lineEdit_SetMode->text()); } voidMainWindow::on_pushButton_GetMode_clicked() { ui->label_Mode->setText(m_control->getFeatureTriggerSourceType()); } voidMainWindow::on_pushButton_CFMode_clicked() { ui->label_CFMode->setText(m_control->getFeatureTriggerModeType()?"Open":"Close"); } voidMainWindow::on_comboBox_CFMode_activated(intindex) { m_control->setFeatureTriggerModeType(index==0); } voidMainWindow::on_pushButton_Start_clicked() { if(ui->pushButton_Start->text()=="\345\274\200\345\247\213\351\207\207\351\233\206"){//开始采集 m_control->StartAcquire(); ui->pushButton_Start->setText("\347\273\223\346\235\237\351\207\207\351\233\206");//结束采集 }else{ m_control->StopAcquire(); ui->pushButton_Start->setText("\345\274\200\345\247\213\351\207\207\351\233\206");//开始采集 } } voidMainWindow::on_pushButtonRotate_clicked() { m_matrix.rotate(90); }
pro文件
(注意:引用库文件的路径哦)
#------------------------------------------------- # #ProjectcreatedbyQtCreator2017-12-14T17:55:52 # #------------------------------------------------- QT+=coregui greaterThan(QT_MAJOR_VERSION,4):QT+=widgets TARGET=Demo_BaslerCamera TEMPLATE=app CONFIG+=c++11 #--------------------------------------------Basler------------------------------------------- INCLUDEPATH+=$$PWD/include LIBS+=-L$$PWD/lib/Win32-lGCBase_MD_VC120_v3_0_Basler_pylon_v5_0-lGenApi_MD_VC120_v3_0_Basler_pylon_v5_0-lPylonBase_MD_VC120_v5_0-lPylonC_MD_VC120-lPylonGUI_MD_VC120_v5_0-lPylonUtility_MD_VC120_v5_0 #---------------------------------------------------------------------------------------------- SOURCES+=main.cpp\ mainwindow.cpp\ BaslerCamera/sbaslercameracontrol.cpp HEADERS+=mainwindow.h\ BaslerCamera/sbaslercameracontrol.h FORMS+=mainwindow.ui
我把源码已经上传到码云和Github
码云
https://gitee.com/ShaShiDiZhuanLan/Demo_BaslerCamera
Github
https://github.com/ShaShiDiZhuanLan/Demo_BaslerCamera_Qt
到此这篇关于Qt(C++)调用工业相机Basler的SDK使用示例的文章就介绍到这了,更多相关Qt调用Basler的SDK内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。