目录

  • 前言
  • 正文
    • 初始化配置信息
    • 创建Xml节点
    • 创建节点下面的Attribute
  • 总结

前言

这一部分的内容放在如何生成大恒相机的参数,但其实难点并不在我接下去写的部分。难点在于你获得了这个节点的Name,Attribute,你该如何根据节点的类型,从而得到对于的Item,也就是这个节点是Number型你就该生成一个Number型的Item,QString类型就生成QString类型的Item。这才是难点,不过,这篇文章并不打算讲这个,这篇文章涉及到的内容主要是你该如何生成那个节点而已,以后关于那个有机会再出一篇文章,但那是后话了。

正文

初始化配置信息

首先,先让整个函数,然后再慢慢解析,你可以先瞄个大概:

//初始化配置信息
void MConfigureDahengG3UC::InitConfigure(QString index,MDeviceAbstract *pDev)
{m_cCameraID = index;m_pDevice = dynamic_cast<MDeviceDahengG3UC*>(pDev);m_pNodeMap = new MNodeMap();m_pNodeMap->SetDeviceId(m_cCameraID);m_pNodeMap->SetConfigureObject(this);m_pSimplyNodeMap = new MNodeMap();m_pSimplyNodeMap->SetDeviceId(m_cCameraID);CreateDocXml();             //创建docCreateSimplyDocXml();       //创建simply_doc
}

开始解析

  1. m_pNodeMap = new MNodeMap();整个语句是创建出整个节点。
  2. m_pNodeMap->SetConfigureObject(this);整个是创建出那个配置对象。
  3. 至于这里的Simply的类你们就不要管了 ,那个其实在把配置参数分成两个部分,一种是较为完整的,一种是除去一部分不常用的。

创建Xml节点

先给出完整的函数:

//创建doc
bool  MConfigureDahengG3UC::CreateDocXml()
{bool ret = false;
#ifdef WIN32_DAHENG_GEVif((Q_NULLPTR == m_pNodeMap)){qDebug()<<"MConfigureDahengG3UC::CreateDocXml m_pNodeMap is null";return ret;}if(m_pDevice->m_objDevicePtr.IsNull()){qDebug()<<"MConfigureDahengG3UC::CreateDocXml m_pDevice->m_objDevicePtr.IsNull";return ret;}GxIAPICPP::gxstring_vector featureNameList;GxIAPICPP::gxstring_vector featureRemoteNameList;CGXFeatureControlPointer featureControl = m_pDevice->m_objDevicePtr->GetFeatureControl();if(!featureControl.IsNull())featureControl->GetFeatureNameList(featureNameList);//获取第一个属性参数集合featureNameListCGXFeatureControlPointer featureControl2 = m_pDevice->m_objDevicePtr->GetRemoteFeatureControl();if(!featureControl2.IsNull())featureControl2->GetFeatureNameList(featureRemoteNameList);//获取第二个属性参数集合featureRemoteNameList//开始创建xml文件QDomDocument *m_doc = new QDomDocument();QDomProcessingInstruction instruction;instruction = m_doc->createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");m_doc->appendChild(instruction);//create root elementQDomElement root = m_doc->createElement(XML_TAG_CONFIGUR);m_doc->appendChild(root);//包含一些本地属性,不同类型的设备具备的功能也不一样for(size_t i=0;i<featureNameList.size();i++){GxIAPICPP::gxstring  name = featureNameList.at(i);QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);if(CreateElement(name,m_pNodeMap,param,featureControl)){root.appendChild(param);}}//包含主要设备信息,比如宽高、曝光增益等,一般用户主要使用此属性控制器即可。for(size_t i=0;i<featureRemoteNameList.size();i++){GxIAPICPP::gxstring  name = featureRemoteNameList.at(i);QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);if(CreateElement(name,m_pNodeMap,param,featureControl2)){root.appendChild(param);}}ret = m_pNodeMap->SetDocument(m_doc);
#endifreturn ret;
}
  1. 这个函数的作用是生成xml文件的头部的一些信息和root节点,然后递归求接下去的所有节点。然后节点里面的attribute再采用另一个属性去进行设置。
  2. 首先,我们先获取它的属性集合:
featureControl->GetFeatureNameList(featureNameList);//获取第一个属性参数集合
  1. 创建xml文件的头部信息;
QDomDocument *m_doc = new QDomDocument();
QDomProcessingInstruction instruction;
instruction = m_doc->createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
m_doc->appendChild(instruction);
  1. 接下来就是递归创建一些节点了,虽然之前的有些节点有group类型的,但我这里就统一将所有节点都归为Parameter节点进行创建。注意,它有两个属性节点集合,所以用了两个循环,具体函数如下:
 //包含一些本地属性,不同类型的设备具备的功能也不一样for(size_t i=0;i<featureNameList.size();i++){GxIAPICPP::gxstring  name = featureNameList.at(i);QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);if(CreateElement(name,m_pNodeMap,param,featureControl)){root.appendChild(param);}}//包含主要设备信息,比如宽高、曝光增益等,一般用户主要使用此属性控制器即可。for(size_t i=0;i<featureRemoteNameList.size();i++){GxIAPICPP::gxstring  name = featureRemoteNameList.at(i);QDomElement param = m_doc->createElement(XML_TAG_PARAMETER);if(CreateElement(name,m_pNodeMap,param,featureControl2)){root.appendChild(param);}}

创建节点下面的Attribute

xml文件的基本结构是这样的:

<Parameter Visibility="Beginner" Enable="1" Hide="0" Type="Combo" Id="Standbystate" Combo="Disable;Enable" Value="Disable" Name="Standby state" Step="1"/></Group>

这里的难点其实是你要理清楚这之前的关系,从而把参数往底下传。我们看一下完整的函数,但我只列出一部分就好,不然太长了。

//创建doc树下的元素
bool MConfigureDahengG3UC::CreateElement(GxIAPICPP::gxstring gxName,MNodeMap *nodeMap,QDomElement &element,CGXFeatureControlPointer featureControl)
{bool ret = false;
#ifdef WIN32_DAHENG_GEVqint32 iVisibility = 0;QString name = QString::fromStdString(gxName.c_str());QString displayName= name;bool enable = false;bool hide = false;GX_XML_InterfaceType eType;GX_FEATURE_TYPE gxType = featureControl->GetFeatureType(gxName);Mc::VisibilityEnums visb = (Mc::VisibilityEnums)iVisibility;QString visbStr =  MEnumToString<Mc::VisibilityEnums>(visb);element.setAttribute(XML_KEY_NAME,name);element.setAttribute(XML_KEY_DISPLAYNAME,displayName);element.setAttribute(XML_KEY_STEP,1);element.setAttribute(XML_KEY_HIDE,hide);element.setAttribute(XML_KEY_VISIBILITY,visbStr);try{if(gxType==GX_FEATURE_INT){bool gxIsWriteable = featureControl->IsWritable(gxName);bool bIsReadable = featureControl->IsReadable(gxName);//查询是否可读if(gxIsWriteable)enable = true;CIntFeaturePointer objIntPtr = featureControl->GetIntFeature(gxName);int64_t valueInt;int64_t valueMinInt;int64_t valueMaxInt;if(bIsReadable){valueInt = objIntPtr->GetValue();valueMinInt = objIntPtr->GetMin();valueMaxInt = objIntPtr->GetMax();element.setAttribute(XML_KEY_MIN,QString::number(valueMinInt,10));element.setAttribute(XML_KEY_MAX,QString::number(valueMaxInt,10));element.setAttribute(XML_KEY_VALUE,QString::number(valueInt,10));}element.setAttribute(XML_KEY_ENABLE,enable);element.setAttribute(XML_KEY_TYPE,XML_TYPE_NUMBER);element.setAttribute(XML_KEY_DECIMALS,0);element.setAttribute(XML_KEY_UNIT,"");eType = IFT_IInteger;ret = true;}else if(gxType == GX_FEATURE_FLOAT){bool gxIsWriteable = featureControl->IsWritable(gxName);//查询是否可写bool bIsReadable = featureControl->IsReadable(gxName);//查询是否可读if(gxIsWriteable)enable = true;CFloatFeaturePointer objFloatPtr = featureControl->GetFloatFeature(gxName);double valueFloat;double valueMinFloat;double valueMaxFloat;if(bIsReadable){valueFloat = objFloatPtr->GetValue();valueMinFloat = objFloatPtr->GetMin();valueMaxFloat = objFloatPtr->GetMax();element.setAttribute(XML_KEY_MIN,valueMinFloat);element.setAttribute(XML_KEY_MAX,valueMaxFloat);element.setAttribute(XML_KEY_VALUE,valueFloat);}element.setAttribute(XML_KEY_ENABLE,enable);element.setAttribute(XML_KEY_TYPE,XML_TYPE_NUMBER);element.setAttribute(XML_KEY_DECIMALS,3);element.setAttribute(XML_KEY_UNIT,"");eType = IFT_IFloat;ret = true;}
}catch(...){qDebug()<< "-->Error CreateElement: "<<name;ret = false;}if(ret){MNode *temp;nodeMap->CreateNode(&temp,Mc::NodeEnums(eType));if(temp){temp->SetElement(element,false);nodeMap->Insert(name,temp);}}#endifreturn ret;
}

上面只列举了两种类型的数据,所以但其他数据就基本上是依照这个去写的。难度也不大,我觉得也没必要详细讲,主要就是你要分清函数的形参代表的意思是什么,应该就可以写出来了。

上面已经成功讲了如何创建了,但其实还得有更新的函数,就是当你每次修改参数时,要能让参数自动射下去。这样就是比较完整的功能实现。但其实是跟上面上不多的,换汤不换药,我这里就懒得赘述了,没啥必要。

总结

参数的创建基本就讲到这里,这样,相机的三大功能就基本完成了:实时采图,回调采图,参数设置。如果有需要可以去看看我的另外两篇文章。感谢您的观看~

大恒相机开发实践(1)——实时采图
大恒相机开发实践(2)——触发采图

若有错误,欢迎指出,感谢~

大恒相机开发实践(3)——参数设置相关推荐

  1. 大恒相机开发实践(1)——实时采图

    目录 前言 正文 准备工作 设备的初始化 设备信息的获取 实时采图 将采集到的Buffer传上显示层 总结 前言 本篇博客稍微记录一下我所写的插件.具体内容是有关于大恒相机的,关于这个相机,相信搜索到 ...

  2. 大恒相机开发实践(2)——触发采图

    目录 前言 正文 开启采图模式 开启实时采图功能 点击触发按钮 总结 前言 这部分完成的功能是触发采图,所谓触发采图,基本的过程是在先开启连续采图,然后,在某个触发信号到来的时候,读取其中的某一帧的信 ...

  3. 大恒相机开发问题(错误码: -8)无法打开相机

    前言: 记录一下大恒相机开发中的问题,如果能给和我一样正在摸索的小白一些帮助就更好了. 一.问题: 错误码: -8 错误描述信息: {Accessdenied:{1005}{GenICam::Clie ...

  4. 大恒相机开发(大恒SDK+opencv开发)笔记1

    大恒相机开发(大恒SDK+opencv开发 一.项目简介 在大三上学期做过人脸识别的开发,刚好下学期老师手中有相机的项目,然后项目就到了我手上,下面是我开发这个项目的一些经历,进程还在调试中.笔记会按 ...

  5. vs+Qt+opencv+大恒相机开发(基础功能,适合初学者学习)

    注:代码仅供参考,相互学习. 本意:帮助大家快速入手大恒相机,也留个记录后续优化. 配置环境:VS2019.OpenCV454.Qt5.14.2.大恒水星系列相机(gige) 优化: 2022/4/2 ...

  6. Qt+大恒相机+OpenCV+MinGW界面开发

    Qt+大恒相机+OpenCV+MinGW界面开发 遇到的坑有哪些? 大恒相机接口的问题(C与C++选谁,傻傻分不清) OpenCV版本与MinGW编译平台适应性问题(编译通过,但是一运行就异常退出) ...

  7. 基于大恒相机SDK,二次开发

    基于大恒相机SDK,二次开发(C#) 界面如下 有曝光.增益两个参数可以调整(平台是X64) 有问题可以问 看到就回答 using System; using System.Collections.G ...

  8. 大恒相机+VS开发+Qt 跑通示例工程

    直接复制和调试大恒相机自带的C++开发软件开发说明书中的示例工程,报错众多,无从下手. 终于经过注释多处代码,跑通了!以此为记,再接再厉. #include <QDebug> #inclu ...

  9. QT调用大恒相机的开发教程

    Qt(5.12.10) 调用大恒相机,实时显示图像,并保存bmp文件 文章导读:相机为大恒相机,接口是USB3.0,水星系列产品.本项目采用Qt5.12.10版本编码,编译器为MSVC2017,ope ...

最新文章

  1. Bootstrap 斜体、文本对齐、缩略图、地址、列表等
  2. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(9月24日-9月30日)
  3. Nginx教程系列五:Nginx+Keepalived搭建高可用主从架构
  4. 计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...
  5. 创建设计模式 - 原型设计模式
  6. cocos2d-x学习之添加显示文字
  7. UI控件之UITextField
  8. it书籍分享免费下载
  9. 遗传算法原理与matlab,有关路径优化遗传算法原理(结合matlab代码)
  10. Android升级WebView浏览器内核版本
  11. 摄像头 - 双摄像头工作原理详解:RBG +RGB, RGB + Mono
  12. [Qt笔记]设置VS2015下的应用工程图标
  13. 用python做五子棋双人_python实现双人五子棋(终端版)
  14. win7共享网络的方法简述
  15. 磁盘读写的时间花费和调度算法(操作系统)
  16. 培根芦笋卷+蚝油家常豆腐+春笋甜椒拌饭
  17. jupyter notebook的安装与使用
  18. mysql:查询排名
  19. ssm+layui 超市管理系统 大学期末作业详解(1)
  20. python 如何创建文件夹(新建文件夹)

热门文章

  1. Word文档太大怎样压缩变小?有没有简单的步骤讲解?
  2. 2020-4-20 深度学习笔记20 - 深度生成模型 3 (实值数据上的玻尔兹曼机)
  3. 什么是生态型平台企业?
  4. python学习(24) 使用Xpath解析并抓取美女图片
  5. android 4.0版本手机接受多条短信分析
  6. 《淘宝店铺营销推广一册通》一1.3 宝贝标题优化
  7. 模具行业ERP信息化(转)
  8. 吉他“和弦”是什么?
  9. 一个游戏程序员的学习资料(转)
  10. fatal error C1859的有效解决办法