大恒相机实时采图

本文档详述了如何使用大恒相机的SDK进行设备初始化、主动采图、参数配置等关键功能的实现。通过设备的序列号打开设备,初始化流通道,设置采图参数,创建XML配置文件,获取并更新设备信息,以及软触发采图操作。此外,还提供了获取相机详细信息和创建XML文档的方法,为相机的程序开发提供了清晰的步骤和代码示例。
摘要由CSDN通过智能技术生成

前言

本篇博客稍微记录一下我所写的插件。具体内容是有关于大恒相机的,关于这个相机,相信搜索到这个博客的应该都有所了解了,关于这个插件,我所完成的功能是:利用该相机提供的SDK完成主动采图,回调采图,以及显示出该相机的参数列表这三个主要的功能。下面就是正文,我只会贴属于这个插件的代码,其他部分就不贴出来了。所以,应该只能给你编写的代码一些启示,但就目前这些代码,却没办法运行起来这个代码的,你应该根据软件的功能去继承一些虚函数,就可以完成这个插件啦,这个博客只是节省你看SDK文档的时间,挺多东西,你应该可以从这上面得到。注意,如果程序出现没有办法加载这个插件的话,要检查一下这个相机的SDK下的dll文件有没有放在程序的运行路径之下,这个很重要,有可能会导致你的插件无法加载。
我这篇文章是三个功能的集合,如果想要看比较详细的,可以移步到另外三篇文章,这里给出地址:

大恒相机开发实践(1)——实时采图
大恒相机开发实践(2)——触发采图
大恒相机开发实践(3)——参数设置

正文

准备工作

首先,开始写这个插件肯定是从下载这个相机的SDK开始的,下面就给出下载链接。
大恒相机SDK,我们需要从这个软件的安装目录中拿出我们所需要的东西,需要的东西我也打包成一个链接:
大恒相机必备材料。 如果没积分的话,私信或评论噢。

设备的初始化

MDeviceDahengG3UC.cpp
下面这个函数的主要功能就是完成设备的初始化工作,下面这个函数没有什么跟那个SDK挂上钩的地方,接下去的这个函数比较重要。

bool MDeviceDahengG3UC::InitDevice(QString index,QString identifier)
{
   
    m_cCameraID = index;
    m_cIdentifier = identifier;
    bool ret = false;
#ifdef WIN32_DAHENG_GEV
    if(DeviceLoading(m_cIdentifier))
    {
   
        m_pConfigureObj = new MConfigureDahengG3UC();
        m_pConfigureObj->InitConfigure(m_cCameraID,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);

        if(IsExistParameter("ResultingFrameRate"))
        {
   
            qDebug()<<"resultingFrameRate";
            this->GetParameter("ResultingFrameRate",frameRate);
        }
        else if(IsExistParameter("ResultingFrameRateAbs"))
        {
   
            this->GetParameter("ResultingFrameRateAbs",frameRate);
        }

        m_iWidth = wVal.toInt();
        m_iHeight = hVal.toInt();
        m_cPixelFormat = pixelForamt.toString();
        m_fFrameRate = frameRate.toFloat();
        ret = true;
    }
#endif
    return ret;
}

下面这个函数就有比较多值得学习的地方,以下讲的地方都是从SDK中得出的。

  1. 首先,是相机设备的初始化
IGXFactory::GetInstance().Init();//这个是进行实例的初始化
GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;
IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);
//通过这个就可以获得相关的设备信息vectorDeviceInfo
  1. 接下来,就是获得当前设备的所有信息,这里就列举一些信息的获得就好了。这里可以稍微注意一下,强制类型转换在这里的应用。
GxIAPICPP::gxstring SerialNumber;
QString SerialNumber2;
GX_DEVICE_CLASS_LIST gClass2 = vectorDeviceInfo[n].GetDeviceClass();
SerialNumber = vectorDeviceInfo[n].GetSN();
SerialNumber2 = static_cast<QString>(SerialNumber);
  1. 接下来,根据设备序列号打开设备并获得实例
m_objDevicePtr  = IGXFactory::GetInstance().OpenDeviceBySN(strSN,GX_ACCESS_EXCLUSIVE);
  1. 打开流对象
 m_objStreamPtr = m_objDevicePtr->OpenStream(0);
  1. 下面这个就是比较完整的函数了。
bool MDeviceDahengG3UC::DeviceLoading(QString identifier)
{
   
    m_bLoaded = false;
    bool bIsDeviceOpen = false;              ///< 设备是否已打开标识
    bool bIsStreamOpen = false;              ///< 设备流是否已打开标识
#ifdef WIN32_DAHENG_GEV
    int nRet = -1;
    IGXFactory::GetInstance().Init();
    GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;
    IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);
    //判断当前设备连接个数

    if (vectorDeviceInfo.size() <= 0)
    {
   
        qDebug()<<"No Device!";
        return m_bLoaded;
    }
    else
    {
   
        for (uint n = 0; n < vectorDeviceInfo.size(); n++)
        {
   
            //判断枚举到的设备是否为Gige
            bool accessStatus = vectorDeviceInfo[n].GetAccessStatus();

            if(accessStatus)
            {
   
                GxIAPICPP::gxstring SerialNumber;
                QString SerialNumber2;

                GX_DEVICE_CLASS_LIST gClass2 = vectorDeviceInfo[n].GetDeviceClass();
                SerialNumber = vectorDeviceInfo[n].GetSN();
                SerialNumber2 = static_cast<QString>(SerialNumber);

                if(SerialNumber2.length()>=16)
                    SerialNumber2 = SerialNumber2.left(16);

                if(identifier.contains(SerialNumber2))
                {
   
                    m_cSerialNumber = SerialNumber2;
                    m_cModelName = static_cast<QString>(vectorDeviceInfo[n].GetModelName());
                    m_cCameraVendor = vectorDeviceInfo[n].GetVendorName();
                    m_cUserDefine = vectorDeviceInfo[n].GetUserID();
                    m_cDeviceVersion = vectorDeviceInfo[n].GetDisplayName();
                    GxIAPICPP::gxstring strSN  = vectorDeviceInfo[n].GetSN();
                    m_objDevicePtr  = IGXFactory::GetInstance().OpenDeviceBySN(strSN,GX_ACCESS_EXCLUSIVE);
                    m_objStreamPtr = m_objDevicePtr->OpenStream(0);
                    m_pCaptureEventHandler = new CSampleCaptureEventHandler();
                    m_bLoaded = true;
                    bIsDeviceOpen = true;
                    break;
                }

            }
        }
    }
    return m_bLoaded;
#endif
}

设备信息的获取

MDeviceDahengG3UCInfo.cpp
下面这个函数主要是获取根据SDK获取对象的相机信息,并且是相对上面那个函数会较全。

  1. 首先也是要进行初始化,并获得设备信息对象。
IGXFactory::GetInstance().Init();
GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;
IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);
  1. 然后就是获取设备信息的那部分了。注意一些强制类型转换。
  2. 下面这个就是比较完整的函数了。
bool MDeviceDahengG3UCInfo::SearchDeviceInfos(QStringList &lInfo)
{
   
    bool ret = false;
#ifdef WIN32_DAHENG_GEV
    int nRet = -1;
    IGXFactory::GetInstance().Init();
    GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;
    IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);

    if(vectorDeviceInfo.size()>0)
    {
   
        for (uint32_t i = 0; i < vectorDeviceInfo.size(); i++)
        {
   
            if(vectorDeviceInfo[i].GetDeviceClass() == GX_DEVICE_CLASS_GEV||vectorDeviceInfo[i].GetDeviceClass()==GX_DEVICE_CLASS_U3V)
            {
   
                GxIAPICPP::gxstring ModelName = vectorDeviceInfo[i].GetModelName();
                QString ModelName2 = static_cast<QString>(ModelName)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值