[视觉实战案例]Qt调用Basler网口工业相机SDK实现采图和相机参数设置
文章目录
- 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实现采图和相机参数设置相关推荐
- 海康工业相机SDK + OpenCV实例(4):相机参数设置详解
海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 文章目录 海康工业相机SDK + OpenCV实例(4): 相机参数设置详解 前言 一.相机参数基本接口 二.自动曝光时间调整亮度 ...
- [视觉实战案例]Qt下BYTE、QImage、HObject、Mat等图像格式的转换和图像显示方法
文章目录 一.图像格式间相互转换 1.BYTE转QImage.HObject和Mat 2.QImage.HObject和Mat的相互转换 二.图像显示方法 1.QLabel显示QPixmap图像 2. ...
- (一)Qt+OpenCV调用海康工业相机SDK示例开发
系列文章目录 提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 文章目录 系列文章目录 ...
- 海康工业相机SDK + OpenCV实例(5):相机双线程读写缓存策略
海康工业相机SDK + OpenCV实例(5): 相机双线程读写缓存策略 文章目录 海康工业相机SDK + OpenCV实例(5): 相机双线程读写缓存策略 前言 一.双线程 二.缓存区容量为2的生产 ...
- 海康工业相机SDK + OpenCV实例(3):相机初始化Bug调试
海康工业相机SDK + OpenCV实例(3): 相机初始化Bug调试 文章目录 海康工业相机SDK + OpenCV实例(3): 相机初始化Bug调试 前言 一.心跳时间设置 二.相机先关闭再打开 ...
- qt调用海康工业相机踩坑全纪录
方法一,使用qt中的QCameraInfo::availableCameras()调用海康摄像头 结论,失败 想的太天真 #include "mainwindow.h" #incl ...
- 《机器人构建实战》——2.2 利用舵机专用测试软件测试舵机及进行参数设置...
本节书摘来异步社区<机器人构建实战>一书中的第2章,第2.2节,作者:丘柳东 ,王牛 ,李瑞峰 ,陈阳,更多章节内容可以访问云栖社区"异步社区"公众号查看. 2.2 利 ...
- python调用Gige网口工业相机 opencv
目录 原理 色彩空间 Bayer 与 deBayer 图像数据处理 代码实现 前期准备 完整代码 原理 色彩空间 图片信息的表示不止只有我们熟知的RGB,还有HLS.HSV.YUV.bayer,由于 ...
- 【Pytorch神经网络实战案例】21 基于Cora数据集实现Multi_Sample Dropout图卷积网络模型的论文分类
Multi-sample Dropout是Dropout的一个变种方法,该方法比普通Dropout的泛化能力更好,同时又可以缩短模型的训练时间.XMuli-sampleDropout还可以降低训练集和 ...
最新文章
- 返回用户指定页面的web服务器
- springboot打印sql日志_Spring boot 工程,http打印日志太多
- 一个大浪Java罢工(一个)安装JDK和环境变量配置
- 如何将ISE的库和vivado的库都加入modelsim.ini
- 计算机英语关于网络的演讲稿,关于网络好处的英语短文(我要像演讲稿的)
- php连接plc,PLC 几种常见的连接口和通讯协议
- 端口和进程的关系(详解)
- leetcode981. 基于时间的键值存储(treemap)
- codevs 1283 等差子序列
- paip.c++ 操作360浏览器总结..
- VoLTE呼叫SIP信令分析
- Android之shape属性设置
- 香橙派3LTS部署ROS2阿克曼开源平台
- 地理坐标定位和计算距离
- Elastic-Job原理--任务失败转移(五)
- 个人独资企业,核定征收;怎么申请?
- 【统计学习方法】朴素贝叶斯
- 服务器配置文件的英文表达,服务器配置 英文
- 开放科研:数据科学场景下如何让研究更加开放?
- 数组 (1)一维数组
热门文章
- C#利用开源库OpenHardwareMonitor获取CPU或显卡温度、使用率、时钟频率
- 函数周期表丨时间丨表丨CALENDARAUTO
- KeyStore秘钥库
- 支付宝新年五福新玩法,我用Python百行代码来实现!
- PAT乙级1005,用C语言进行编程,继续卡拉兹猜想
- 公司 • Google财报-历年营收数据及业务占比
- k8s部署java项目
- LabVIEW 严格类型VI
- hive中出现rg.apache.hadoop.hive.ql.exec.mr.MapRedTask错误
- 峰面积峰高半峰宽_峰高峰面积的计算方法