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_OBJECTpublic:    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_Freerun        ptrTrigger->SetIntValue(0);#else //Software        ptrTrigger->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()); //数据指针        //单通道Momo    if(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/dow...