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

这篇具有很好参考价值的文章主要介绍了Linux下海康威视工业相机的SDK二次开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.客户端软件MVS的安装

1.1安装包的下载和解压

去 官网 下载两个软件安装,分别是客户端和开发环境。(这里我们下载V2.1.1(Linux)和Runtime组件包(Linux)):Linux下海康威视工业相机的SDK二次开发

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

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

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

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文件夹,包含以下内容:

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

1.3 MVS客户端的运行

 进入bin目录,运行MVS,即可打开客户端  Linux下海康威视工业相机的SDK二次开发

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

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

2.参数的设置

2.1 SDK 用户指南的阅读

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

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

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

如整形数据的获取与设置Linux下海康威视工业相机的SDK二次开发

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

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

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

    2.2 MVS 客户端的联合使用

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

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

Linux下海康威视工业相机的SDK二次开发其节点名为上图可知,图像宽度“Height”,类型是“int”,取值范围是32~2480,步进是2;根据类型,我们就可以选用 MV_CC_GetIntValue/MV_CC_SetIntValue来对该属性进行操作;

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

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

        // 获取bool型变量
        // get IBoolean variable
        bool 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 variable
        int 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 variable
        MVCC_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 variable
        unsigned 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 variable
        MVCC_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 variable
        float 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 variable
        MVCC_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 variable
        unsigned 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 2
        nRet = 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 variable
        MVCC_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 variable
        unsigned 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错误码常见场景解析文章来源地址https://www.toymoban.com/news/detail-491077.html

到了这里,关于Linux下海康威视工业相机的SDK二次开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 海康威视相机-LINUX SDK 开发

    相机: MV-CS020-10GC 系统:UBUNTU 22.04 语言:C++ 工具:cmake 海康官网下载SDK 运行下面的命令进行安装 安装完成后从在/opt/MVS 路径下就有了相关的库,实际上我们开发的时候只需要lib和include。有兴趣的同学也可以尝试以下Samples的例子。make一下就能生成可执行文件。如果make报错

    2024年02月11日
    浏览(29)
  • 海康威视监控相机的SDK与opencv调用(非工业相机)

    本篇主要对海康威视的监控相机的SDK回调进行研究,并于opencv结合,保存图像,以供后续其他处理,开发语言为C++ 2.1 海康SDK介绍 海康SDK下载地址 根据自身编译环境,下载对应的SDK,需要注意的是,不要和工业相机SDK相混淆,工业相机好像是MVS是什么玩意儿,现在暂时没研究

    2024年02月04日
    浏览(38)
  • 基于海康威视的SDK实现二次开发

    因为网上关于海康威视SDK这块的开发资源比较少,自己也是一步一步摸索过来,知道那种痛苦, 所以把自己的一些过来人的经验写出来供大家学习参考 进入海康威视官网 下载你所需要的SDK开发包(这里我就用windows来作为案列) 下载完SDK解压 里面有开发文档和SDK的动态库文

    2024年04月10日
    浏览(28)
  • WIN大恒工业相机SDK开发

    1、Galaxy的安装 Galaxy_windows2023年8月版本 下载完成后对软件进行安装,切记自己的安装目录 安装完成后,检查自己的相机是否是网口相机,如果是网口相机则需要进行IP配置,当相机与计算及网口处于同一网段下才可以打开相机并控制相机。 IPConfig工具可以查找到所有网段的设

    2024年02月14日
    浏览(29)
  • Dalsa线扫相机SDK二次开发

    要用回调函数取图:

    2024年02月12日
    浏览(30)
  • 【记录】海康相机(SDK)二次开发时的错误码

    在进行海康sdk二次开发的时候,经常碰到各种错误,遂结合官方文档和广大网友的一些经验,把这些错误码记录一下,方便查找。笔者使用的SDK版本是HCNetSDKV6.1.9.4。 错误类型 错误码 错误信息 NET_DVR_NOERROR 0 没有错误。 NET_DVR_PASSWORD_ERROR 1 用户名密码错误。注册时输入的用户名

    2024年04月08日
    浏览(65)
  • 巴斯勒相机基于SDK 二次开发C++程序

    巴斯勒相机在VS中如何进行连接调用呢(软触发调用) 1.查找巴斯勒相机网口; 2.调用巴斯勒相机提供的接口,连接巴斯勒相机; 3.初始化相机; (安装巴斯勒相机软件) 其他引用第三方库以及对应头文件 链接:https://pan.quark.cn/s/71bb1b3e0dad 提取码:JfM9

    2024年04月14日
    浏览(50)
  • 【重明】机器视觉QT/C++实现工业相机二次开发框架

    工业相机二次开发是机器视觉行业必不可少的技能之一。 而如何实现一个框架,能够兼容所有工业相机二次开发,从而支持多种类型的工业相机,就是机器视觉行业的进阶技能了。 重明工业相机二次开发项目就是在实现相机二开框架的基础上,完成了海康工业相机的二次开

    2024年02月02日
    浏览(35)
  • (一)Qt+OpenCV调用海康工业相机SDK示例开发

    提示:这里是该系列文章的所有文章的目录 第一章: (一)Qt+OpenCV调用海康工业相机SDK示例开发 第二章: (二)Qt多线程实现海康工业相机图像实时采集 近期在Qt环境下进行海康工业相机的使用开发,发现海康提供的示例没有Qt的demo,而其中有基于MFC框架的示例,所以在这

    2024年02月03日
    浏览(50)
  • C# 开源SDK 工业相机库 调用海康相机 大恒相机

    c# 相机库,含海康、大恒品牌2D相机的常用功能。 底层采用回调+信号量模式封装 ,最大程度减小线程资源,提高采图效率。 开源地址 :https://gitee.com/laomaogu/mgcamctrl 现只兼容了大恒和海康,都是常用的 其他相机,看我老板啥时候换品牌吧,或者换老板? 当然如果小伙伴感兴

    2024年04月26日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包