1.客户端软件MVS的安装

1.1安装包的下载和解压

去 官网 下载两个软件安装,分别是客户端和开发环境。(这里我们下载V2.1.1(Linux)和Runtime组件包(Linux)):

工业相机文档/安装包中的不同安装版本安装包里有各个系统及arm开发板使用的安装包,选择相应的安装包进行安装(这里我们选择最后一个)

右键提取,进入提取后的文件夹,右键打开终端。

1.2安装步骤

Step1:切换root权限

rm@rm:~/下载/MVS-2.1.1_x86_64_20211224$ sudo su

Step2:运行安装脚本

rm@rm:~/下载/MVS-2.1.1_x86_64_20211224$ ./setup.sh

安装完成后,/opt路径下会生成MVS文件夹,包含以下内容:

1.3 MVS客户端的运行

进入bin目录,运行MVS,即可打开客户端 

连接海康工业相机之后,通过其官方提供的MVS客户端,我们可以设置相关相机参数,来调整图像,达到我们想要的效果,但是如此众多的相机参数,我们该如何集成进入我们程序呢,接下来就是我们的SDK二次开发

2.参数的设置

2.1 SDK 用户指南的阅读

  • 在 opt/MVS/doc 目录下,我们可以找到 工业相机Linux SDK用户指南V3.2.0(C).html ,经查询SDK文档,可以发现,他们提供了一套通用接口,来对相机进行参数获取与设置。

  • 通用接口把相机参数,分成六大类,除command参数外,每一类提供Set/Get接口来设置与获取相关节点

如整形数据的获取与设置

  • 相机所有开放的属性值都可参考 相机参数节点表 进行查询,此节点表对每个节点的名称、数据类型、数值范围定义、访问模式和节点描述进行了详细说明。对着表可以对参数进行详细的设置。

    2.2 MVS 客户端的联合使用

通过查表,我们可以知道key值该填什么,key值的属性是什么,但是,这样子太慢了。为确定我想调的参数在xml表的位置,还需要在MVS客户端中进行定位。那么有没有更为简单快速的方法? 通过观察MVS客户端,有一个更简单的方法能够知道相机参数的属性,类型等,可以快速方便的对参数进行操作

  • 在MVS中找到自己想要的参数,鼠标选中它,在MVS右下角,参数描述中,能看看该参数的节点名、类型、取值范围、步进等信息

其节点名为上图可知,图像宽度“Height”,类型是“int”,取值范围是32~2480,步进是2;根据类型,我们就可以选用 MV_CC_GetIntValue/MV_CC_SetIntValue来对该属性进行操作;

2.3 六类参数的获取和设置(例)

  • 获取/设置 Bool 类型节点值

        // 获取bool型变量// get IBoolean variablebool bGetBoolValue = false;nRet = MV_CC_GetBoolValue(handle, "ReverseX", &bGetBoolValue);if (MV_OK == nRet){if (0 != bGetBoolValue){printf("ReverseX current is true\n\n");}else{printf("ReverseX current is false\n\n");}}// 设置bool型变量// set IBoolean variableint nSetBoolValue;bool bSetBoolValue;printf("please input the ReverseX to set(bool): ");scanf("%d", &nSetBoolValue);if (0 != nSetBoolValue){bSetBoolValue = true;}else{bSetBoolValue = false;}nRet = MV_CC_SetBoolValue(handle, "ReverseX", bSetBoolValue);if (MV_OK == nRet){printf("Set ReverseX OK!\n\n");}else{printf("Set ReverseX Failed! nRet = [%x]\n\n", nRet);}
  • 获取/设置 Enum 类型节点值

        // 获取enum型变量// get IEnumeration variableMVCC_ENUMVALUE stTriggerMode = {0};nRet = MV_CC_GetEnumValue(handle, "TriggerMode", &stTriggerMode);if (MV_OK == nRet){printf("TriggerMode current value:%d\n", stTriggerMode.nCurValue);printf("supported TriggerMode number:%d\n", stTriggerMode.nSupportedNum);for (unsigned int i = 0; i < stTriggerMode.nSupportedNum; ++i){printf("supported TriggerMode [%d]:%d\n", i, stTriggerMode.nSupportValue[i]);}printf("\n");}else{printf("get TriggerMode failed! nRet [%x]\n\n", nRet);}// 设置enum型变量// set IEnumeration variableunsigned int nTriggerMode = 0;printf("please input the TriggerMode to set:");scanf("%d", &nTriggerMode);nRet = MV_CC_SetEnumValue(handle, "TriggerMode", nTriggerMode);if (MV_OK == nRet){printf("set TriggerMode OK!\n\n");}else{printf("set TriggerMode failed! nRet [%x]\n\n", nRet);}
  • 获取/设置 Float 类型节点值

        // 获取float型变量// get IFloat variableMVCC_FLOATVALUE stExposureTime = {0};nRet = MV_CC_GetFloatValue(handle, "ExposureTime", &stExposureTime);if (MV_OK == nRet){printf("exposure time current value:%f\n", stExposureTime.fCurValue);printf("exposure time max value:%f\n", stExposureTime.fMax);printf("exposure time min value:%f\n\n", stExposureTime.fMin);}else{printf("get exposure time failed! nRet [%x]\n\n", nRet);}// 设置float型变量// set IFloat variablefloat fExposureTime = 0.0f;printf("please input the exposure time to set: ");scanf("%f", &fExposureTime);nRet = MV_CC_SetFloatValue(handle, "ExposureTime", fExposureTime);if (MV_OK == nRet){printf("set exposure time OK!\n\n");}else{printf("set exposure time failed! nRet [%x]\n\n", nRet);}
  • 获取/设置 Int 类型节点值

        // 获取int型变量// get IInteger variableMVCC_INTVALUE stHeight = {0};nRet = MV_CC_GetIntValue(handle, "Height", &stHeight);if (MV_OK == nRet){printf("height current value:%d\n", stHeight.nCurValue);printf("height max value:%d\n", stHeight.nMax);printf("height min value:%d\n", stHeight.nMin);printf("height increment value:%d\n\n", stHeight.nInc);}else{printf("get height failed! nRet [%x]\n\n", nRet);}// 设置int型变量// set IInteger variableunsigned int nHeightValue = 0;printf("please input the height to set:");scanf("%d", &nHeightValue);// 宽高设置时需考虑步进(2),即设置宽高需2的倍数// Step (16) should be considered when setting width and height, that is the width and height should be a multiple of 2nRet = MV_CC_SetIntValue(handle, "Height", nHeightValue);    if (MV_OK == nRet){printf("set height OK!\n\n");}else{printf("set height failed! nRet [%x]\n\n", nRet);}
  • 获取/设置 String 类型节点值

        // 获取string型变量// get IString variableMVCC_STRINGVALUE stStringValue = {0};nRet = MV_CC_GetStringValue(handle, "DeviceUserID", &stStringValue);if (MV_OK == nRet){printf("Get DeviceUserID [%s]\n\n", stStringValue.chCurValue);}else{printf("Get DeviceUserID Failed! nRet = [%x]\n\n", nRet);}// 设置string型变量// set IString variableunsigned char strValue[256];printf("please input the DeviceUserID to set(string):");scanf("%s", strValue);nRet = MV_CC_SetStringValue(handle, "DeviceUserID", (char*)strValue);if (MV_OK == nRet){printf("Set DeviceUserID OK!\n\n");}else{printf("Set DeviceUserID Failed! nRet = [%x]\n\n", nRet);}
  • 设置 Command 类型节点值

        nRet = MV_CC_SetCommandValue(pUser, "TriggerSoftware");if(MV_OK != nRet){printf("failed in TriggerSoftware[%x]\n", nRet);}nRet = MV_CC_GetOneFrameTimeout(pUser, pData, nDataSize, &stImageInfo, 1000);if (nRet == MV_OK){printf("GetOneFrame, Width[%d], Height[%d], nFrameNum[%d]\n", stImageInfo.nWidth, stImageInfo.nHeight, stImageInfo.nFrameNum);}else{printf("Get One Frame failed![%x]\n", nRet);}

3.开发过程中遇到的问题

3.1 SDK 文档中参数的节点名、类型、取值范围、步进等信息与MVS 客户端中不同

在参数设置过程中会发现SDK 文档中参数的节点名、类型、取值范围、步进等信息与MVS 客户端中不同,比如帧率的类型,宽度和高度的步进,或者缺少水平合并和垂直合并等,在这里我们以MVS客户端 中的数据为准。这里就更体现了 2.2MVS客户端联合使用的必要性。

3.2 错误码的解读

  • 所有工业相机SDK接口都会返回相应的值。如果函数正常完成而没有检测到任何错误,则返回值为MV_OK,否则返回错误码 。

  • SDK 文档中已经有对于错误码的必要介绍,更详细请访问链接海康工业相机SDK错误码常见场景解析

Linux下海康威视工业相机的SDK二次开发相关推荐

  1. 海康威视网络摄像机 SDK二次开发(JAVA)

    1.下载地址 https://www.hikvision.com/cn/download_more_406.html#prettyPhoto 根据各自情况,选择win32或者win64位 64位下载之 ...

  2. 海康威视网络摄像头SDK二次开发(QT版本)

    暂时使用到的主要功能有四个:1.连接相机,2.实时显示,3.取图(bmp格式),4.关闭相机 在官网下载对应的win64的SDK,在库文件中运行demo.exe确保硬件连接正常. 在程序中导入库 1. ...

  3. 海康威视工业相机SDK二次开发

    海康威视工业相机SDK二次开发 好气,第一次写文章,结果没不小心保存关掉,什么都没了. 本人是一名在读研究生,被导师分配了做项目中海康工业相机的二次开发.实现的需求是:实现八个相机同时打开视频,并且分 ...

  4. 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)

    最近在做一个项目,涉及到工业相机,需要对其进行二次开发.相机方面选择了海康威视,网上关于海康威视工业相机SDK的开发资料很少,官方文档里面虽然写的是支持C++开发的,但其实是C.自己也摸索了一段时间, ...

  5. 海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)

    Livox Lidar  + HIKROBOT Camera系列 最近在开发相机和激光雷达融合的slam算法,主要用于三维重建,想实时的得到彩色点云地图,传感器选择了海康威视的工业相机和大疆的固态激光 ...

  6. linux 下root 口令破解(二) ——说一下grub的密码和安全模式

    linux 下root 口令破解(二) ------说一下grub的密码和安全模式 我们都知道root的密码是保存在/etc/shadow下的,而/etc/passwd 则是用户信息文件,密码呢由于是 ...

  7. Linux下idea 配置Android SDK

    ==1==先来个SDK下载传送门:http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz 请选择对应版本 ==2==下载完成后,直接将压缩 ...

  8. 海康威视SDK二次开发通过云台参数设置控制摄像机的位置

    海康威视SDK二次开发通过云台参数设置控制摄像机的位置 由于最近在开发海康威视摄像头,特此记录一下通过云台参数控制摄像机的位置,我这里是通过properties配置文件输入的参数,也可以不用配置文件, ...

  9. 海康威视摄像机SDK二次开发--提取音频保存至文件

    由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中Came ...

最新文章

  1. 手把手Tinyxml入门,C++ VS2010
  2. HttpContext.Current.Request.Url 地址:获取域名
  3. OAuth 2.0 - Authorization Code授权方式详解
  4. 大神把可视化放进数据地图里,原来不敲代码一样能做
  5. Oracel官网下载各类版本的JDK
  6. java 异常返回json_Spring MVC全局异常后返回JSON异常数据
  7. xor(线性基的合并)
  8. linux内核长期支持版本,Linux Kernel 3.12长期支持分支迎来第63个维护版本
  9. QEventLoop进行函数运行进度控制
  10. 一个大图切成几个小图加载速度更快_谷歌SEO页面速度的重要性
  11. 5分钟带你入门vuex(vue状态管理)
  12. mq 2085 java_websphere mq 不能访问集群中其它节点对列
  13. 3D重建模的初步了解
  14. [JNI] 开发基础(4)函数指针及指针函数
  15. windows下安装ruby(一)
  16. Insyde uefi 隐藏设置_Android/iOS QQ 8.1.5测试版同时发布:私密会话可以隐藏
  17. 一位计算机专业硕士毕业生的求职经历和感想
  18. Mesh Shading
  19. grads 相关系数_气象统计方法实习报告材料
  20. 阿里云ECS学习资源

热门文章

  1. 视通科技知识产权保护中心审理庭解决方案
  2. [zz]澄清P问题、NP问题、NPC问题的概念
  3. 大学物理·第4章刚体的转动
  4. 1为数据库查询的数据中加一排序号,2判断为查询出来的字段赋值
  5. 游戏手柄全国产化电子元件推荐方案
  6. 我国首次评选30名国医大师 享省部级劳模待遇
  7. 【MongoDB】MacOS安装MongoDB完整收录
  8. TLS/SSL 协议详解 (30) SSL中的RSA、DHE、ECDHE、ECDH流程与区别
  9. c语言能运行情书,用C语言写的情书
  10. IDEA怎么使折叠合并的文件夹分开