HIK 相机 设置缓存节点进行取流

场景:【硬触发】环境触发频率快时,相机内缓存图片(默认节点数量为1)有可能被不停刷新,导致无法及时捕捉到每次触发响应的图片。
方案:SDK中可以设置相机内部缓冲节点数量和取图策略。

nRet = MV_CC_SetImageNodeNum(handle, nImageNodeNum);
handle(相机句柄)
nImageNodeNum:节点数量(初始化为1)

MV_GrabStrategy_OneByOne  
从旧到新一帧一帧的获取图像(默认为该策略) MV_GrabStrategy_LatestImagesOnly  
获取列表中最新的一帧图像(同时清除列表中的其余图像) MV_GrabStrategy_LatestImages  
获取列表中最新的图像,个数由OutputQueueSize决定,范围为1-ImageNodeNum,设置成1等同于LatestImagesOnly,设置成ImageNodeNum等同于OneByOne MV_GrabStrategy_UpcomingImage  
等待下一帧图像 

示例:

#include <stdio.h>
#include <Windows.h>
#include <process.h>
#include <conio.h>
#include "MvCameraControl.h"// Wait for key press
void WaitForKeyPress(void)
{while(!_kbhit()){Sleep(10);}_getch();
}bool PrintDeviceInfo(MV_CC_DEVICE_INFO* pstMVDevInfo)
{if (NULL == pstMVDevInfo){printf("The Pointer of pstMVDevInfo is NULL!\n");return false;}if (pstMVDevInfo->nTLayerType == MV_GIGE_DEVICE){int nIp1 = ((pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24);int nIp2 = ((pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16);int nIp3 = ((pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8);int nIp4 = (pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff);printf("CurrentIp: %d.%d.%d.%d\n" , nIp1, nIp2, nIp3, nIp4);printf("UserDefinedName: %s\n\n" , pstMVDevInfo->SpecialInfo.stGigEInfo.chUserDefinedName);}else if (pstMVDevInfo->nTLayerType == MV_USB_DEVICE){printf("UserDefinedName: %s\n", pstMVDevInfo->SpecialInfo.stUsb3VInfo.chUserDefinedName);printf("Serial Number: %s\n", pstMVDevInfo->SpecialInfo.stUsb3VInfo.chSerialNumber);printf("Device Number: %d\n\n", pstMVDevInfo->SpecialInfo.stUsb3VInfo.nDeviceNumber);}else{printf("Not support.\n");}return true;
}static  unsigned int __stdcall UpcomingThread(void* pUser)
{Sleep(3000);printf("Trigger Software Once for MV_GrabStrategy_UpcomingImage\n");MV_CC_SetCommandValue(pUser, "TriggerSoftware");return 0;
}int main()
{int nRet = MV_OK;void* handle = NULL;unsigned char * pData = NULL;do {// Enum deviceMV_CC_DEVICE_INFO_LIST stDeviceList = {0};nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList);if (MV_OK != nRet){printf("Enum Devices fail! nRet [0x%x]\n", nRet);break;}if (stDeviceList.nDeviceNum > 0){for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++){printf("[device %d]:\n", i);MV_CC_DEVICE_INFO* pDeviceInfo = stDeviceList.pDeviceInfo[i];if (NULL == pDeviceInfo){break;} PrintDeviceInfo(pDeviceInfo);            }  } else{printf("Find No Devices!\n");break;} printf("Please Input camera index:");unsigned int nIndex = 0;scanf_s("%d", &nIndex);if (nIndex >= stDeviceList.nDeviceNum){printf("Input error!\n");break;}// Select device and create handlenRet = MV_CC_CreateHandle(&handle, stDeviceList.pDeviceInfo[nIndex]);if (MV_OK != nRet){printf("Create Handle fail! nRet [0x%x]\n", nRet);break;}// Open devicenRet = MV_CC_OpenDevice(handle);if (MV_OK != nRet){printf("Open Device fail! nRet [0x%x]\n", nRet);break;}// Detection network optimal package size(It only works for the GigE camera)if (stDeviceList.pDeviceInfo[nIndex]->nTLayerType == MV_GIGE_DEVICE){int nPacketSize = MV_CC_GetOptimalPacketSize(handle);if (nPacketSize > 0){if(MV_CC_SetIntValue(handle,"GevSCPSPacketSize",nPacketSize) != MV_OK){printf("Warning: Set Packet Size fail nRet [0x%x]!", nRet);}}else{printf("Warning: Get Packet Size fail nRet [0x%x]!", nPacketSize);}}// Set Trigger Mode and Set Trigger SourcenRet = MV_CC_SetEnumValueByString(handle, "TriggerMode", "On");if (MV_OK != nRet){printf("Set Trigger Mode fail! nRet [0x%x]\n", nRet);break;}nRet = MV_CC_SetEnumValueByString(handle, "TriggerSource", "Software");if (MV_OK != nRet){printf("Set Trigger Source fail! nRet [0x%x]\n", nRet);break;}unsigned int nImageNodeNum = 5;// Set number of image nodenRet = MV_CC_SetImageNodeNum(handle, nImageNodeNum);if (MV_OK != nRet){printf("Set number of image node fail! nRet [0x%x]\n", nRet);break;}printf("\n**************************************************************************\n");printf("* 0.MV_GrabStrategy_OneByOne;       1.MV_GrabStrategy_LatestImagesOnly;  *\n");printf("* 2.MV_GrabStrategy_LatestImages;   3.MV_GrabStrategy_UpcomingImage;     *\n");printf("**************************************************************************\n");printf("Please Input Grab Strategy:");unsigned int nGrabStrategy = 0;scanf_s("%d", &nGrabStrategy);// U3V device not support UpcomingImageif (nGrabStrategy == MV_GrabStrategy_UpcomingImage && MV_USB_DEVICE == stDeviceList.pDeviceInfo[nIndex]->nTLayerType){printf("U3V device not support UpcomingImage\n");break;}switch(nGrabStrategy){case MV_GrabStrategy_OneByOne:{printf("Grab using the MV_GrabStrategy_OneByOne default strategy\n");nRet = MV_CC_SetGrabStrategy(handle, MV_GrabStrategy_OneByOne);if (MV_OK != nRet){printf("Set Grab Strategy fail! nRet [0x%x]\n", nRet);break;}}break;case MV_GrabStrategy_LatestImagesOnly:{printf("Grab using strategy MV_GrabStrategy_LatestImagesOnly\n");nRet = MV_CC_SetGrabStrategy(handle, MV_GrabStrategy_LatestImagesOnly);if (MV_OK != nRet){printf("Set Grab Strategy fail! nRet [0x%x]\n", nRet);break;}}break;case MV_GrabStrategy_LatestImages:{printf("Grab using strategy MV_GrabStrategy_LatestImages\n");nRet = MV_CC_SetGrabStrategy(handle, MV_GrabStrategy_LatestImages);if (MV_OK != nRet){printf("Set Grab Strategy fail! nRet [0x%x]\n", nRet);break;}// Set Output Queue SizenRet = MV_CC_SetOutputQueueSize(handle, 2);if (MV_OK != nRet){printf("Set Output Queue Size fail! nRet [0x%x]\n", nRet);break;}}break;case MV_GrabStrategy_UpcomingImage:{printf("Grab using strategy MV_GrabStrategy_UpcomingImage\n");nRet = MV_CC_SetGrabStrategy(handle, MV_GrabStrategy_UpcomingImage);if (MV_OK != nRet){printf("Set Grab Strategy fail! nRet [0x%x]\n", nRet);break;}unsigned int nThreadID = 0;void* hThreadHandle = (void*) _beginthreadex( NULL , 0 , UpcomingThread , handle, 0 , &nThreadID );if (NULL == hThreadHandle){break;}}break;default:printf("Input error!Use default strategy:MV_GrabStrategy_OneByOne\n");break;}// Start grab imagenRet = MV_CC_StartGrabbing(handle);if (MV_OK != nRet){printf("Start Grabbing fail! nRet [0x%x]\n", nRet);break;}// Send Trigger Software commandfor (unsigned int i = 0;i < nImageNodeNum;i++){nRet = MV_CC_SetCommandValue(handle, "TriggerSoftware");if (MV_OK != nRet){printf("Send Trigger Software command fail! nRet [0x%x]\n", nRet);break;}Sleep(500);}MV_FRAME_OUT stOutFrame = {0};if (nGrabStrategy != MV_GrabStrategy_UpcomingImage){while(true){nRet = MV_CC_GetImageBuffer(handle, &stOutFrame, 0);if (nRet == MV_OK){printf("Get One Frame: Width[%d], Height[%d], FrameNum[%d]\n", stOutFrame.stFrameInfo.nWidth, stOutFrame.stFrameInfo.nHeight, stOutFrame.stFrameInfo.nFrameNum);}else{printf("No data[0x%x]\n", nRet);break;}nRet = MV_CC_FreeImageBuffer(handle, &stOutFrame);if(nRet != MV_OK){printf("Free Image Buffer fail! nRet [0x%x]\n", nRet);}}}else//Only for upcoming{nRet = MV_CC_GetImageBuffer(handle, &stOutFrame, 5000);if (nRet == MV_OK){printf("Get One Frame: Width[%d], Height[%d], FrameNum[%d]\n", stOutFrame.stFrameInfo.nWidth, stOutFrame.stFrameInfo.nHeight, stOutFrame.stFrameInfo.nFrameNum);nRet = MV_CC_FreeImageBuffer(handle, &stOutFrame);if(nRet != MV_OK){printf("Free Image Buffer fail! nRet [0x%x]\n", nRet);}}else{printf("No data[0x%x]\n", nRet);}}// Stop grab imagenRet = MV_CC_StopGrabbing(handle);if (MV_OK != nRet){printf("Stop Grabbing fail! nRet [0x%x]\n", nRet);break;}// Close devicenRet = MV_CC_CloseDevice(handle);if (MV_OK != nRet){printf("Close Device fail! nRet [0x%x]\n", nRet);break;}// Destroy handlenRet = MV_CC_DestroyHandle(handle);if (MV_OK != nRet){printf("Destroy Handle fail! nRet [0x%x]\n", nRet);break;}} while (0);if (nRet != MV_OK){if (handle != NULL){MV_CC_DestroyHandle(handle);handle = NULL;}}printf("Press a key to exit.\n");WaitForKeyPress();return 0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/489501.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytest入门一:用例的执行范围

从一个或多个目录开始查找&#xff0c;可以在命令行指定文件名或目录名。如果未指定&#xff0c;则使用当前目录。 测试文件以 test_ 开头或以 _test 结尾 测试类以 Test 开头 &#xff0c;并且不能带有 init 方法 测试函数以 test_ 开头 断言使用基本的 assert 即可 所有的…

科研绘图系列:R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot boxplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3系统信息参考介绍 R语言绘制热图和散点图以及箱线图(pheatmap, scatterplot & boxplot) 加载R包 library(magrittr) library(dplyr) library(ve…

ArcGIS MultiPatch数据转换Obj数据

文章目录 ArcGIS MultiPatch数据转换Obj数据1 效果2 技术路线2.1 Multipatch To Collada2.2 Collada To Obj3 代码实现4 附录4.1 环境4.2 一些坑ArcGIS MultiPatch数据转换Obj数据 1 效果 2 技术路线 MultiPatch --MultipatchToCollada–> Collada --Assimp–> Obj 2.…

(5)4T刷题-逻辑代数基础

&#xff08;1&#xff09;逻辑函数的常用表示方法有&#xff1a;真值表、逻辑图、卡诺图、函数表达式 逻辑函数的表达方法中具有唯一性的是&#xff1a;真值表和卡诺图 &#xff08;2&#xff09;异或运算&#xff08;题干意思不明确&#xff0c;应该是按位异或&#xff09; …

Linux(网络基础和网络标准OSI七层结构)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

向达梦告警日志说声hello

为了调试和跟踪一些业务功能&#xff0c;通常会创建一个日志表&#xff0c;写入每个关键步骤的信息。也可以向达梦数据库的告警日志输出信息&#xff0c;然后通过查看告警日志即可。 在达梦的告警日志中输出一个信息可以这样 SQL> DBMS_SYSTEM.KSDWRT(2,hi dm);

详解 ES6 Reflect

一. 概念 Reflect 是 ES6 中新增的一个内置对象&#xff0c;它提供了一组静态方法&#xff0c;用于操作对象。这些方法与 Object 上的方法具有相同的功能。在这些方法中会调用对应 Object 上的方法&#xff0c;并且返回对应结果。Reflect 的出现主要是为了将一些 Object 对象上…

图像分割数据集海洋水体船只分割数据集labelme格式6123张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;6123 标注数量(json文件个数)&#xff1a;6123 标注类别数&#xff1a;3 标注类别名称:["water","sea_obstacle",&…

Docker Compose--安装本地maven

原文网址&#xff1a;Docker Compose--安装本地maven-CSDN博客 简介 本文介绍如何使用Docker Compose安装maven。 脚本及配置 路径&#xff1a;/work/env/maven ├── app ├── config │ └── settings.xml ├── docker-compose.yml ├── repository └── t…

EDA - Spring Boot构建基于事件驱动的消息系统

文章目录 概述事件驱动架构的基本概念工程结构Code创建事件和事件处理器创建事件总线创建消息通道和发送逻辑创建事件处理器消息持久化创建消息发送事件配置 Spring Boot 启动类测试消息消费运行项目 概述 在微服务架构和大规模分布式系统中&#xff0c;事件驱动架构&#xff…

数据链路层(Java)(MAC与IP的区别)

以太网协议&#xff1a; "以太⽹" 不是⼀种具体的⽹络, ⽽是⼀种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理 层的内容. 例如: 规定了⽹络拓扑结构, 访问控制⽅式, 传输速率等; 例如以太⽹中的⽹线必须使⽤双绞线; 传输速率有10M, 100M, 1000M等; 以太…

UNIX数据恢复—UNIX系统常见故障问题和数据恢复方案

UNIX系统常见故障表现&#xff1a; 1、存储结构出错&#xff1b; 2、数据删除&#xff1b; 3、文件系统格式化&#xff1b; 4、其他原因数据丢失。 UNIX系统常见故障解决方案&#xff1a; 1、检测UNIX系统故障涉及的设备是否存在硬件故障&#xff0c;如果存在硬件故障&#xf…

黑马程序员Java项目实战《苍穹外卖》Day12

苍穹外卖-day12 课程内容 工作台Apache POI导出运营数据Excel报表 功能实现&#xff1a;工作台、数据导出 工作台效果图&#xff1a; 数据导出效果图&#xff1a; 在数据统计页面点击数据导出&#xff1a;生成Excel报表 1. 工作台 1.1 需求分析和设计 1.1.1 产品原…

【竞技宝】LOL:JDG官宣yagao离队

北京时间2024年12月13日,在英雄联盟S14全球总决赛结束之后,各大赛区都已经进入了休赛期,目前休赛期也快进入尾声,LPL大部分队伍都开始陆续官宣转会期的动向,其中JDG就在近期正式官宣中单选手yagao离队,而后者大概率将直接选择退役。 近日,JDG战队在官方微博上连续发布阵容变动消…

谷歌浏览器的多账户设置与管理

在数字化时代&#xff0c;我们常常需要在不同的网站和服务上使用多个账户。为了方便管理和保护隐私&#xff0c;谷歌浏览器提供了多账户设置功能。本文将详细介绍如何在Chrome中进行多账户设置与管理&#xff0c;并涵盖一些相关的安全配置和问题解决方法。&#xff08;本文由ht…

科研绘图系列:R语言绘制网络图和密度分布图(network density plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3图4图5图6图7图8系统信息参考介绍 R语言绘制网络图和密度分布图(network & density plot) 加载R包 library(magrittr) library(dplyr) library(…

VRRP的知识点总结及实验

1、VRRP VRRP(Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议)既能够实现网关的备份&#xff0c;又能解决多个网关之间互相冲突的问题&#xff0c;从而提高网络可靠性。 2、VRRP技术概述&#xff1a; 通过把几台路由设备联合组成一台虚拟的“路由设备”…

数智读书笔记系列002 埃隆·马斯克传

书名&#xff1a;埃隆马斯克传 作者&#xff1a;【美】沃尔特艾萨克森 译者&#xff1a;孙思远&#xff1b;刘家琦 出版社&#xff1a;中信出版集团 出版时间&#xff1a;2023年9月 ISBN&#xff1a;9787521758399 这本书是关于特斯拉CEO埃隆马斯克的传记&#xff0c;作者…

2024年12月13日Github流行趋势

项目名称&#xff1a;nexus-xyz / nexus-zkvm 项目维护者&#xff1a;govereau slumber danielmarinq sjudson yoichi-nexus项目介绍&#xff1a;Nexus zkVM 是一个零知识虚拟机。项目star数&#xff1a;1,948项目fork数&#xff1a;343 项目名称&#xff1a;soxoj / maigret …

016 在路由器上配置 DHCP

配置路由器端口IP地址 将路由器的端口地址配置好&#xff0c; 左边的网络地址是 192.168.1.0 右边的网络地址是 192.168.2.0 配置路由器的DHCP服务 打开命令窗口&#xff0c;进入特权模式 进入全局配置 conf t创建一个DHCP地址池&#xff1b; po1 是地址池的名称&#xf…