文章目录

  • 1、采图UI显示
  • 2、硬件连接和IP配置
    • 2.1 外触发硬件接线
    • 2.2 IP配置
  • 3、代码实现
  • 4、源码下载

1、采图UI显示

2、硬件连接和IP配置

2.1 外触发硬件接线


根据相机接线图,连接相机的电源的触发信号输入;

2.2 IP配置

Gige网口相机需要电脑网卡和相机在同一ip段内,支持动态、静态等方式配置IP,打开Pylon IP Configurator来匹配IP,如下

3、代码实现

基本采图功能Balser都有对应的Demo进行参考,这里只截取相机采图和部分参数设置功能演示。

balser_gigeCamera.h

#ifndef BALSER_GIGECAMERA_H
#define BALSER_GIGECAMERA_H
/***************************
* @projectName   camera_test
* @brief         Basler相机图像采集及参数设置功能;
* @author        Alaric
* @date          2018-11-04
**************************/#include <QImage>
#include "balser_gigecamera_global.h"
#include <QObject>#include <pylon/PylonIncludes.h>
#include <pylon/BaslerUniversalInstantCamera.h>
#include <pylon/_BaslerUniversalCameraParams.h>
#include <QMutex>using namespace std;
using namespace Pylon;
using namespace GenApi;
using namespace Basler_UniversalCameraParams;class BALSER_GIGECAMERASHARED_EXPORT Balser_GigeCamera : public QObject, public CImageEventHandler
{Q_OBJECT
public:Balser_GigeCamera(QObject *parent = nullptr);~Balser_GigeCamera();enum BaslerCamera_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, //灯的触发信号};void initCamera();                   //初始化相机void OpenCamera();                   //打开相机void CloseCamera();                   //关闭相机void deleteAll();                    //删除相机int getExposureTime();                //获得曝光时间void setExposureTime(int time);       //设置曝光时间int getGain();                        //获得增益void setGain(int value);              //设置增益void setFrameRate(int value);         //设置帧率int getFrameRate();                   //获得帧率void OneKeyAutoExTime();              //一键自动曝光void SetCamera(Balser_GigeCamera::BaslerCamera_Type index, int tmpValue = 0); // 设置各种参数int GetCamera(Balser_GigeCamera::BaslerCamera_Type index); // 获取各种参数void AutoExposureOnce(CBaslerUniversalInstantCamera& camera);      //自动曝光void StartAcquire();  //开始采集void StopAcquire();   //结束采集void StartSnap();     //抓图bool GrabOnLine_Signal;     //实时采图信号signals:void canShowImg(QImage img);         //发送图像数据public slots:void WorkTypeSignal(int work_type);         //接收图像处理信号,0为Once,1为Online;
private:CBaslerUniversalInstantCamera m_basler;CGrabResultPtr m_ptrGrabResult;CImageFormatConverter m_formatConverter;//Basler 图片格式转换类CPylonImage pylonImage; //Basler 图像格式QMutex m_mutexLock;int TestImg_WorkType = -1;          //图像处理方式,默认-1为不处理,0为Once,1为Online;QImage CopyImgToQImage(CGrabResultPtr ptrGrabResult);protected:virtual void OnImageGrabbed(CInstantCamera &camera, const CGrabResultPtr &grabResult);
};#endif // BALSER_GIGECAMERA_H

这里balser采集到的BYTE格式的图像数据按照通道数转换成QImage格式,最后发送给UI线程进行显示。

balser_gigecamera.cpp

#include "balser_gigecamera.h"
#include <QDebug>Balser_GigeCamera::Balser_GigeCamera(QObject *parent) : QObject(parent)
{}Balser_GigeCamera::~Balser_GigeCamera()
{}void Balser_GigeCamera::initCamera()
{PylonInitialize();m_basler.RegisterImageEventHandler(this, RegistrationMode_Append, Cleanup_Delete);m_basler.Attach(CTlFactory::GetInstance().CreateFirstDevice(),Cleanup_Delete);qDebug()<<"Using device " << m_basler.GetDeviceInfo().GetModelName()<<endl;m_basler.Open();if (!m_basler.IsOpen() || m_basler.IsGrabbing()){qDebug()<<"camera open failed"<<endl;return;}
}void Balser_GigeCamera::CloseCamera()
{if(m_basler.IsOpen()) {m_basler.DetachDevice();m_basler.Close();m_basler.DestroyDevice();m_ptrGrabResult.Release();}
}void Balser_GigeCamera::deleteAll()
{//停止采集if(GrabOnLine_Signal) {StopAcquire();}//关闭摄像头try{CloseCamera();m_basler.DeregisterImageEventHandler(this);//关闭库qDebug() << "SBaslerCameraControl deleteAll: PylonTerminate" ;PylonTerminate();}catch (const Pylon::GenericException& e){qDebug() << e.what();}
}int Balser_GigeCamera::getExposureTime()
{return GetCamera(Type_Basler_ExposureTimeAbs);
}void Balser_GigeCamera::setExposureTime(int time)
{SetCamera(Type_Basler_ExposureTimeAbs, time);
}void Balser_GigeCamera::setGain(int value)
{SetCamera(Type_Basler_GainRaw, value);
}int Balser_GigeCamera::getGain()
{return GetCamera(Type_Basler_GainRaw);
}int Balser_GigeCamera::getFrameRate()
{return GetCamera(Type_Basler_AcquisitionFrameRateAbs);
}void Balser_GigeCamera::setFrameRate(int value)
{SetCamera(Type_Basler_AcquisitionFrameRateAbs, value);
}void Balser_GigeCamera::OneKeyAutoExTime()
{AutoExposureOnce(m_basler);
}void Balser_GigeCamera::SetCamera(Balser_GigeCamera::BaslerCamera_Type index, int tmpValue)
{INodeMap &cameraNodeMap = m_basler.GetNodeMap();switch (index) {case Type_Basler_Freerun: {CEnumerationPtr  ptrTriggerSel = cameraNodeMap.GetNode ("TriggerSelector");ptrTriggerSel->FromString("FrameStart");CEnumerationPtr  ptrTrigger  = cameraNodeMap.GetNode ("TriggerMode");
#ifdef Real_FreerunptrTrigger->SetIntValue(0);
#else //SoftwareptrTrigger->SetIntValue(1);CEnumerationPtr  ptrTriggerSource = cameraNodeMap.GetNode ("TriggerSource");ptrTriggerSource->FromString("Software");
#endif} break;case Type_Basler_Line1: {CEnumerationPtr  ptrTriggerSel = cameraNodeMap.GetNode ("TriggerSelector");ptrTriggerSel->FromString("FrameStart");CEnumerationPtr  ptrTrigger  = cameraNodeMap.GetNode ("TriggerMode");ptrTrigger->SetIntValue(1);CEnumerationPtr  ptrTriggerSource = cameraNodeMap.GetNode ("TriggerSource");ptrTriggerSource->FromString("Line1");} break;case Type_Basler_ExposureTimeAbs: {const CFloatPtr exposureTime = cameraNodeMap.GetNode("ExposureTimeAbs");exposureTime->SetValue(tmpValue);} break;case Type_Basler_GainRaw: {const CIntegerPtr cameraGen = cameraNodeMap.GetNode("GainRaw");cameraGen->SetValue(tmpValue);} break;case Type_Basler_AcquisitionFrameRateAbs: {const CBooleanPtr frameRate = cameraNodeMap.GetNode("AcquisitionFrameRateEnable");frameRate->SetValue(TRUE);const CFloatPtr frameRateABS = cameraNodeMap.GetNode("AcquisitionFrameRateAbs");frameRateABS->SetValue(tmpValue);} break;case Type_Basler_Width: {const CIntegerPtr widthPic = cameraNodeMap.GetNode("Width");widthPic->SetValue(tmpValue);} break;case Type_Basler_Height: {const CIntegerPtr heightPic = cameraNodeMap.GetNode("Height");heightPic->SetValue(tmpValue);} break;case Type_Basler_LineSource: {CEnumerationPtr  ptrLineSource = cameraNodeMap.GetNode ("LineSource");ptrLineSource->SetIntValue(2);} break;default:break;}
}int Balser_GigeCamera::GetCamera(Balser_GigeCamera::BaslerCamera_Type index)
{INodeMap &cameraNodeMap = m_basler.GetNodeMap();switch (index) {case Type_Basler_ExposureTimeAbs: {const CFloatPtr exposureTime = cameraNodeMap.GetNode("ExposureTimeAbs");return exposureTime->GetValue();} break;case Type_Basler_GainRaw: {const CIntegerPtr cameraGen = cameraNodeMap.GetNode("GainRaw");return cameraGen->GetValue();} break;case Type_Basler_AcquisitionFrameRateAbs: {const CBooleanPtr frameRate = cameraNodeMap.GetNode("AcquisitionFrameRateEnable");frameRate->SetValue(TRUE);const CFloatPtr frameRateABS = cameraNodeMap.GetNode("AcquisitionFrameRateAbs");return frameRateABS->GetValue();} break;case Type_Basler_Width: {const CIntegerPtr widthPic = cameraNodeMap.GetNode("Width");return widthPic->GetValue();} break;case Type_Basler_Height: {const CIntegerPtr heightPic = cameraNodeMap.GetNode("Height");return heightPic->GetValue();} break;default:return -1;break;}
}void Balser_GigeCamera::OnImageGrabbed(CInstantCamera &camera, const CGrabResultPtr &grabResult)
{m_mutexLock.lock();qDebug() <<"Capturest"<<endl;if (grabResult->GrabSucceeded()){m_ptrGrabResult = grabResult;//将捕获到的图像传递出去qDebug() <<"Captureok"<<endl;QImage CurrentImg;CurrentImg = CopyImgToQImage(m_ptrGrabResult);if(TestImg_WorkType == 1){emit canShowImg(CurrentImg);//            startImgProcess(CurrentImg);qDebug() <<"Captureok"<<endl;}else{emit canShowImg(CurrentImg);}}m_mutexLock.unlock();
}void Balser_GigeCamera::StartAcquire()
{if ( !m_basler.IsGrabbing() ){qDebug()<<"grabstart"<<endl;GrabOnLine_Signal = true;m_basler.StartGrabbing(GrabStrategy_LatestImageOnly,GrabLoop_ProvidedByInstantCamera);}else {qDebug()<<"error"<<endl;}
}void Balser_GigeCamera::StartSnap()
{m_basler.StartGrabbing(1);CBaslerUniversalGrabResultPtr ptrGrabResult;m_basler.RetrieveResult( 5000, ptrGrabResult, TimeoutHandling_ThrowException);if (ptrGrabResult->GrabSucceeded()){qDebug()<<"snapok"<<endl;QImage CurrentImg = CopyImgToQImage(ptrGrabResult);emit canShowImg(CurrentImg);if(TestImg_WorkType == 0){//            startImgProcess(CurrentImg);TestImg_WorkType = -1;}}
}void Balser_GigeCamera::StopAcquire()
{if ( m_basler.IsGrabbing()){GrabOnLine_Signal = false;m_basler.StopGrabbing();  // 停止抓取图像}
}void Balser_GigeCamera::AutoExposureOnce(CBaslerUniversalInstantCamera& camera)
{if ( !camera.ExposureAuto.IsWritable()){cout << "The camera does not support Exposure Auto." << endl << endl;return;}camera.ExposureAuto.SetValue(ExposureAuto_Once);int n = 0;while (camera.ExposureAuto.GetValue() != ExposureAuto_Off){++n;//For demonstration purposes only. Wait until the image is shown.WaitObject::Sleep(100);//Make sure the loop is exited.if (n > 100){throw TIMEOUT_EXCEPTION( "The adjustment of auto exposure did not finish.");}}
}void Balser_GigeCamera::WorkTypeSignal(int work_type)
{TestImg_WorkType = work_type;
}QImage Balser_GigeCamera::CopyImgToQImage(CGrabResultPtr ptrGrabResult)
{QImage Qimg;//格式转换m_formatConverter.Convert(pylonImage, ptrGrabResult);uchar * din = (uchar *)(pylonImage.GetBuffer()); //数据指针//单通道Momoif(IsMono(pylonImage.GetPixelType())){qDebug()<<"黑白图像";Qimg = QImage(din, ptrGrabResult->GetWidth(), ptrGrabResult->GetHeight(), QImage::Format_Indexed8);}else{//此处可以根据相机的格式获取特定格式的彩色图像if(IsRGB(pylonImage.GetPixelType())){Qimg = QImage(din, ptrGrabResult->GetWidth(), ptrGrabResult->GetHeight(), QImage::Format_RGB888);}}return Qimg;
}

4、源码下载

相机采图及相机设置部分封装成动态库,可以在UI线程调用相机类来实现相机的加载,采图及参数设置操作。
源码下载:https://download.csdn.net/download/fengyaowuhui/85002116?spm=1001.2014.3001.5501

[视觉实战案例]Qt调用Basler网口工业相机SDK实现采图和相机参数设置相关推荐

  1. 海康工业相机SDK + OpenCV实例(4):相机参数设置详解

    海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 文章目录 海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 前言 一.相机参数基本接口 二.自动曝光时间调整亮度 ...

  2. [视觉实战案例]Qt下BYTE、QImage、HObject、Mat等图像格式的转换和图像显示方法

    文章目录 一.图像格式间相互转换 1.BYTE转QImage.HObject和Mat 2.QImage.HObject和Mat的相互转换 二.图像显示方法 1.QLabel显示QPixmap图像 2. ...

  3. (一)Qt+OpenCV调用海康工业相机SDK示例开发

    系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 文章目录 系列文章目录 ...

  4. 海康工业相机SDK + OpenCV实例(5):相机双线程读写缓存策略

    海康工业相机SDK + OpenCV实例(5): 相机双线程读写缓存策略 文章目录 海康工业相机SDK + OpenCV实例(5): 相机双线程读写缓存策略 前言 一.双线程 二.缓存区容量为2的生产 ...

  5. 海康工业相机SDK + OpenCV实例(3):相机初始化Bug调试

    海康工业相机SDK + OpenCV实例(3): 相机初始化Bug调试 文章目录 海康工业相机SDK + OpenCV实例(3): 相机初始化Bug调试 前言 一.心跳时间设置 二.相机先关闭再打开 ...

  6. qt调用海康工业相机踩坑全纪录

    方法一,使用qt中的QCameraInfo::availableCameras()调用海康摄像头 结论,失败 想的太天真 #include "mainwindow.h" #incl ...

  7. 《机器人构建实战》——2.2 利用舵机专用测试软件测试舵机及进行参数设置...

    本节书摘来异步社区<机器人构建实战>一书中的第2章,第2.2节,作者:丘柳东 ,王牛 ,李瑞峰 ,陈阳,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.2 利 ...

  8. python调用Gige网口工业相机 opencv

    目录 原理 色彩空间 Bayer 与  deBayer 图像数据处理 代码实现 前期准备 完整代码 原理 色彩空间 图片信息的表示不止只有我们熟知的RGB,还有HLS.HSV.YUV.bayer,由于 ...

  9. 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类

    Multi-sample Dropout是Dropout的一个变种方法,该方法比普通Dropout的泛化能力更好,同时又可以缩短模型的训练时间.XMuli-sampleDropout还可以降低训练集和 ...

最新文章

  1. 返回用户指定页面的web服务器
  2. springboot打印sql日志_Spring boot 工程,http打印日志太多
  3. 一个大浪Java罢工(一个)安装JDK和环境变量配置
  4. 如何将ISE的库和vivado的库都加入modelsim.ini
  5. 计算机英语关于网络的演讲稿,关于网络好处的英语短文(我要像演讲稿的)
  6. php连接plc,PLC 几种常见的连接口和通讯协议
  7. 端口和进程的关系(详解)
  8. leetcode981. 基于时间的键值存储(treemap)
  9. codevs 1283 等差子序列
  10. paip.c++ 操作360浏览器总结..
  11. VoLTE呼叫SIP信令分析
  12. Android之shape属性设置
  13. 香橙派3LTS部署ROS2阿克曼开源平台
  14. 地理坐标定位和计算距离
  15. Elastic-Job原理--任务失败转移(五)
  16. 个人独资企业,核定征收;怎么申请?
  17. 【统计学习方法】朴素贝叶斯
  18. 服务器配置文件的英文表达,服务器配置 英文
  19. 开放科研:数据科学场景下如何让研究更加开放?
  20. 数组 (1)一维数组

热门文章

  1. C#利用开源库OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率
  2. 函数周期表丨时间丨表丨CALENDARAUTO
  3. KeyStore秘钥库
  4. 支付宝新年五福新玩法,我用Python百行代码来实现!
  5. PAT乙级1005,用C语言进行编程,继续卡拉兹猜想
  6. 公司 • Google财报-历年营收数据及业务占比
  7. k8s部署java项目
  8. LabVIEW 严格类型VI
  9. hive中出现rg.apache.hadoop.hive.ql.exec.mr.MapRedTask错误
  10. 峰面积峰高半峰宽_峰高峰面积的计算方法