大恒相机开发实践(3)——参数设置
目录
- 前言
- 正文
- 初始化配置信息
- 创建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
}
开始解析
m_pNodeMap = new MNodeMap();
整个语句是创建出整个节点。m_pNodeMap->SetConfigureObject(this);
整个是创建出那个配置对象。- 至于这里的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;
}
- 这个函数的作用是生成xml文件的头部的一些信息和root节点,然后递归求接下去的所有节点。然后节点里面的
attribute
再采用另一个属性去进行设置。 - 首先,我们先获取它的属性集合:
featureControl->GetFeatureNameList(featureNameList);//获取第一个属性参数集合
- 创建xml文件的头部信息;
QDomDocument *m_doc = new QDomDocument();
QDomProcessingInstruction instruction;
instruction = m_doc->createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");
m_doc->appendChild(instruction);
- 接下来就是递归创建一些节点了,虽然之前的有些节点有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)——实时采图
目录 前言 正文 准备工作 设备的初始化 设备信息的获取 实时采图 将采集到的Buffer传上显示层 总结 前言 本篇博客稍微记录一下我所写的插件.具体内容是有关于大恒相机的,关于这个相机,相信搜索到 ...
- 大恒相机开发实践(2)——触发采图
目录 前言 正文 开启采图模式 开启实时采图功能 点击触发按钮 总结 前言 这部分完成的功能是触发采图,所谓触发采图,基本的过程是在先开启连续采图,然后,在某个触发信号到来的时候,读取其中的某一帧的信 ...
- 大恒相机开发问题(错误码: -8)无法打开相机
前言: 记录一下大恒相机开发中的问题,如果能给和我一样正在摸索的小白一些帮助就更好了. 一.问题: 错误码: -8 错误描述信息: {Accessdenied:{1005}{GenICam::Clie ...
- 大恒相机开发(大恒SDK+opencv开发)笔记1
大恒相机开发(大恒SDK+opencv开发 一.项目简介 在大三上学期做过人脸识别的开发,刚好下学期老师手中有相机的项目,然后项目就到了我手上,下面是我开发这个项目的一些经历,进程还在调试中.笔记会按 ...
- vs+Qt+opencv+大恒相机开发(基础功能,适合初学者学习)
注:代码仅供参考,相互学习. 本意:帮助大家快速入手大恒相机,也留个记录后续优化. 配置环境:VS2019.OpenCV454.Qt5.14.2.大恒水星系列相机(gige) 优化: 2022/4/2 ...
- Qt+大恒相机+OpenCV+MinGW界面开发
Qt+大恒相机+OpenCV+MinGW界面开发 遇到的坑有哪些? 大恒相机接口的问题(C与C++选谁,傻傻分不清) OpenCV版本与MinGW编译平台适应性问题(编译通过,但是一运行就异常退出) ...
- 基于大恒相机SDK,二次开发
基于大恒相机SDK,二次开发(C#) 界面如下 有曝光.增益两个参数可以调整(平台是X64) 有问题可以问 看到就回答 using System; using System.Collections.G ...
- 大恒相机+VS开发+Qt 跑通示例工程
直接复制和调试大恒相机自带的C++开发软件开发说明书中的示例工程,报错众多,无从下手. 终于经过注释多处代码,跑通了!以此为记,再接再厉. #include <QDebug> #inclu ...
- QT调用大恒相机的开发教程
Qt(5.12.10) 调用大恒相机,实时显示图像,并保存bmp文件 文章导读:相机为大恒相机,接口是USB3.0,水星系列产品.本项目采用Qt5.12.10版本编码,编译器为MSVC2017,ope ...
最新文章
- Bootstrap 斜体、文本对齐、缩略图、地址、列表等
- Silverlight/Windows8/WPF/WP7/HTML5周学习导读(9月24日-9月30日)
- Nginx教程系列五:Nginx+Keepalived搭建高可用主从架构
- 计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...
- 创建设计模式 - 原型设计模式
- cocos2d-x学习之添加显示文字
- UI控件之UITextField
- it书籍分享免费下载
- 遗传算法原理与matlab,有关路径优化遗传算法原理(结合matlab代码)
- Android升级WebView浏览器内核版本
- 摄像头 - 双摄像头工作原理详解:RBG +RGB, RGB + Mono
- [Qt笔记]设置VS2015下的应用工程图标
- 用python做五子棋双人_python实现双人五子棋(终端版)
- win7共享网络的方法简述
- 磁盘读写的时间花费和调度算法(操作系统)
- 培根芦笋卷+蚝油家常豆腐+春笋甜椒拌饭
- jupyter notebook的安装与使用
- mysql:查询排名
- ssm+layui 超市管理系统 大学期末作业详解(1)
- python 如何创建文件夹(新建文件夹)