• 海康工业相机连续存图、录像功能介绍



    在使用工业相机做日常的数据采集,分析过程中,存图、录像功能必不可少,但是在使用该功能中,会出现丢帧、少图等现象,本文简单介绍下存图、录像使用过程中的技术瓶颈与解决方法,本文以介绍连续抓图为主,录像功能原理基本一致;

    1.MVS连续存图功能基本使用方法

    i. MVS通用设置中,设置图像路径、存图格式
    在这里插入图片描述
    图1:MVS中设置存储路径
    在这里插入图片描述

    图2:MVS中设置图片格式
    
    • 1

    ii. MVS开启连续抓图功能后,开始取流存图
    在这里插入图片描述

    图3:MVS中设置图片格式
    
    • 1

    在这里插入图片描述

    图4:MVS中设置图片格式
    
    • 1

    2.抓图测试与实际问题分析

    a) 相机参数
    MV-CA050-20UM相机,图像分辨率为2048*2048,黑白mono8图像,存图格式为bmp
    采集帧率90fps,使用触发模式,单次触发,采集1023张图片
    b) 测试结果:
    在这里插入图片描述
    图4:MVS抓图结果
    在这里插入图片描述

    	图5:本地存图结果
    
    • 1

    预计采集1023张图片,实际抓图398张图片,丢帧帧数625帧,采集图像数1023张
    c) 原因分析
    在抓图过程中,缓存使用率会上升,那么,先增加缓存大小,在通用设置里面,设置缓存大小
    在这里插入图片描述

    图6:存图缓存节点设置
    
    • 1

    存图缓存节点设置到100后,再次测试
    在这里插入图片描述

    图7: MVS抓图结果
    
    • 1

    预计采集1023张图片,实际抓图475张图片,丢帧帧数546帧,采集图像数1021张
    继续增大缓存节点,对比不同缓存节点,对抓图数量的影响,如下表
    取流缓存节点 录像缓存节点 采集图像数 存图图像数 丢帧图像数

    取流缓存节点录像缓存节点采集图像数存图图像数丢帧图像数
    221023398625
    21001021475546
    25121008889119
    2800102210220
    30800102310230

    从结果来看,将缓存节点设置的足够大,能够满足一定时刻的抓图需求
    但是也存在两个问题:
    1.当缓存节点继续加大时,计算机内存占用很大(3.28G上升到6.5G)MVS会提示报错,由此可见,缓存不可无限加大
    在这里插入图片描述

    图8:存图缓存节点设置报错
    
    • 1

    2.图像在缓存里面,采集、存储耗时长,采集1024张图片,只需要11s左右,而完成存储需要30s以上

    d) 验证不同硬盘写入速度对图片保存的影响

    取流缓存节点录像缓存节点采集图像数存图图像数丢帧图像数
    221023398625
    21001021475546

    当设置录像缓存节点为100时,存图数量比节点1时,增加了76张
    那么当缓存节点小时,因素是什么?
    我们使用CrystalDiskMark8,来测试硬盘读写速度,结果如下:
    在这里插入图片描述

    图9:机械硬盘读写速度
    
    • 1

    硬盘写入速度为93.53M,而一张图像2048*2048,黑白mono8的bmp图像大小为4MB
    93.53M的写入速度,支持101.71/4=23.38,23.38张图片同时写入,而相机采集帧率为90fps,
    当写入速度,低于采集速度时,就会产生大量的丢帧

    那么换用ssd固态硬盘,来提高硬盘写入速度
    在这里插入图片描述

    图10:固态硬盘读写速度
    数据来看,这块SSD有点拉跨
    
    • 1
    • 2

    那么重复测试结果如下:

    取流缓存节点录像缓存节点采集图像数存图图像数丢帧图像数
    221023568455
    21001016522494
    25121014794220
    305121023910113

    从结果来看,
    提高硬盘读写速度,能够保存到更多的图片,但是还是会存在丢帧,需要配合缓存节点使用,才能保证不丢帧
    SSD写速度达到了123.10M,理论上能够存储30.75张图片,但是相较于相机90fps的帧率,还是远远不够的
    注意:这里有个误区,正常的SSD速度,一般在300、500MB/s,而本文中使用的ssd仅有123MB/s,原因在于工具中的参数,测试文件大小为16MB,而硬盘的读写速度与文件大小息息相关,而工业相机的图像大小通常在几百k~20M不等,因此,硬盘读写速度,一般都是低于理论值的;
    在这里插入图片描述

    图11:CrystalDiskMark工具参数介绍
    
    • 1

    如果要继续提升硬盘读写速度,那么就要考虑更高速的硬盘方案

    • PCIe 5.0 SSD 读取速度可达 10GB / s
    • RAID方案(RAID磁盘阵列(Redundant Array of Independent Disks)通过同时使用多个磁盘,提高了传输速率。RAID通过在多个磁盘上同时存储和读取数据来大幅提高存储系统的数据吞吐量,理论上读写速度是单片硬盘的N倍)

    e) 验证不同图片格式对图片保存的影响
    在MVS通用设置中,可以设置不同的图像保存格式
    在这里插入图片描述

     图12:MVS不同存图格式设置 
    
    • 1

    选择不同的图像格式,测试结果如下

    硬盘类型保存格式取流缓存节录像缓存节点采集图像数存图图像数丢帧图像数
    SSDBmp221023568455
    SSDJPEG221023600423
    SSDBmp302001023629394
    SSDJPEG302001023776247
    SSDBMP25121014794220
    SSDJPEG2512102310230
    SSDPNG25121022575447
    SSDTIFF2512101492094
    SSDRAW2512101391796

    不同的图像存储格式,对图片保存数量也是有影响的,如图所示,jpeg搭配高缓存节点可以完全保存下来,但是这里的结论并不充分,原因受篇幅限制,不详细展开

    总结

    • 取流速度:相机帧率90fps,那么每一帧的处理时间,只有小于1000/90=11ms,才能不丢帧的情况下,保存完所有图像
    • Jpeg、PNG,都是压缩图像数据的方法,把几MB大小的图片,压缩成几百kb的小文件,此时,硬盘读写速度不再是瓶颈,而压缩时间变成了新的瓶颈,缩短压缩数据的时间,只能提高cpu的性能,使用更快更强的CPU
    • 只有当(图像处理(压缩时间)+硬盘写入时间)<取流速度时,才能不丢帧
    • 当(图像处理(压缩时间)+硬盘写入时间)>取流速度时,就需要缓存节点,将待处理的图片,保存至内存中,待CPU空闲后,慢慢写入硬盘
    • 当(图像处理(压缩时间)+硬盘写入时间)>取流速度时,且图像数据源源不断,缓存溢出后,丢帧现象将不可避免

    3. SDK代码开发关键接口介绍

    相机参数设置:

    参数名称节点名称备注
    图像宽Width2048
    图像高Height2048
    图像格式PixelFormatMono8
    触发出图数AcquisitionBurstFrameCount1023收到一个软触发信号,参考当前相机帧率,最大帧率采集
    帧率设置AcquisitionFrameRate90
    帧率设置使能AcquisitionFrameRateEnableTrue
    触发模式TriggerModeOn
    触发源TriggerSourceSoftware

    从上到下,伪代码如下:

    nRet = MV_CC_SetIntValue(handle,"Width",2048);
    nRet = MV_CC_SetIntValue(handle,"Height",2048);
    nRet = MV_CC_SetEnumValue(handle, "PixelFormat", PixelType_Gvsp_Mono8);
    nRet = MV_CC_SetIntValue(handle,"AcquisitionBurstFrameCount",1023);//相机仅支持0-1023
    nRet = MV_CC_SetFloatValue(handle, "AcquisitionFrameRate", 5);
    nRet = MV_CC_SetBoolValue(handle, "AcquisitionFrameRateEnable", true);
    nRet = MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_ON);
    nRet = MV_CC_SetEnumValue(handle,"TriggerSource",MV_TRIGGER_SOURCE_SOFTWARE);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    图像缓存节点设置

    nRet = MV_CC_SetImageNodeNum(handle,100);
    
    • 1

    注:SDK是没有录像缓存节点的,仅有取流缓存节点,两者效果一致)
    存图接口:
    在这里插入图片描述
    参考例程下载:
    https://one.hikvision.com/#/link/qj3vswclAd3RjjdIuUoW 提取密码:xw9o

  • 相关阅读:
    【数据结构】树与二叉树(十九):树的存储结构——左儿子右兄弟链接结构(树、森林与二叉树的转化)
    Java I/O(3):NIO中的Buffer
    世界军工领域数字孪生应用近况与发展
    leaflet+vue2实现地图交互
    ABP:是否应该在一个应用服务中调用另外一个应用服务?
    通过数据模板自动生成表格table
    内存池的实现思路
    优思学院|2022年获美质协ASQ和ILSSI奖项的《精益六西格玛的十条戒律》
    CentOS7源码安装 lldpd 并附查询脚本
    orcale 单表查询和多表联合查询
  • 原文地址:https://blog.csdn.net/qq_23107577/article/details/126589621