相机同步遇到的小问题

出现问题

在进行两个相机显示的时候,出现了相机显示不同步的情况,具体情况如下视频所示:

华睿/大华相机左右相机显示不同步

可以见到视频之中,右相机是比左相机更快一点的,但是有的时候就是同步的。我调用的代码是现成的,在原有的代码上进行了稍微的更改。

上面是根据现成的代码直接更改得到的,按道理而言,即便是出问题也应该是左相机显示比右相机快呀。所以决定再重新写一个显示代码。

解决思路

一.原始代码

原来的代码之中使用到了相应的SendMessage与ReceiveMessage函数,将原始的相机操作写成单独的一个.h与.cpp文件。看着代码有点儿迷糊,懒得使用这两个函数了,直接在写相应的主要的cpp函数之中进行写入。

查看技术手册,相机的操作流程为如下所示:

在进行配置好环境之后,发现设备到打开相机的操作如下代码所示:

IMV_HANDLE devHandle;unsigned int cameraIndex = 0;TCHAR errMsg[256];int ret = IMV_OK;// 发现设备 IMV_DeviceList deviceInfoList;ret = IMV_EnumDevices(&deviceInfoList, interfaceTypeAll);if (IMV_OK != ret){_stprintf_s(errMsg, _T("Enumeration devices failed! ErrorCode[%d]"), ret);throw errMsg;return FALSE;}if (deviceInfoList.nDevNum < 1){_stprintf_s(errMsg, _T("No Camera."));throw errMsg;return FALSE;}//左相机进行操作cameraIndex = 0;//假设左相机的参数为0// 创建设备句柄ret = IMV_CreateHandle(&devHandle, modeByIndex, (void*)&cameraIndex);if (IMV_OK != ret){_stprintf_s(errMsg, _T("Create devHandle failed! ErrorCode[%d]"), ret);throw errMsg;return FALSE;}// 打开相机 // Open camera ret = IMV_Open(devHandle);if (IMV_OK != ret){_stprintf_s(errMsg, _T("Open camera failed! ErrorCode[%d]"), ret);throw errMsg;return FALSE;}// 设置属性值 这个地方是需要结合后面的说明进行设定ret = IMV_SetDoubleFeatureValue(devHandle, "FrameRate", 10.00);if (exposureAuto_Left != 2){ret = IMV_SetEnumFeatureValue(devHandle, "ExposureAuto", exposureAuto_Left);ret = IMV_SetEnumFeatureValue(devHandle, "GainAuto", GainAuto_Left);ret = IMV_SetEnumFeatureValue(devHandle, "ContrastAuto", ContrastAuto_Left);ret = IMV_SetDoubleFeatureValue(devHandle, "ExposureTime", exposureTime_Left);ret = IMV_SetDoubleFeatureValue(devHandle, "Gamma", Gramma_L);if (IMV_OK != ret){printf("Set feature value failed! ErrorCode[%d]\n", ret);return ret;}}else{ret = IMV_SetEnumFeatureValue(devHandle, "GainAuto", 2);ret = IMV_SetEnumFeatureValue(devHandle, "ContrastAuto", 2);}ret = IMV_SetIntFeatureValue(devHandle, "Brightness", Brightness_L);

文档技术手册之中提到了相机参数的注册回调函数,其作用为当相机的曝光时间或增益发生变化时,应用程序可以通过注册回调函数来接收相机的通知,并相应地更新显示界面上的参数值或图像。

对比两个回调函数:

由于第二个函数是不支持多线程调用,因此选用第一个函数。

// 注册数据帧回调函数ret = IMV_AttachGrabbing(devHandle, onGetFrame, this);if (IMV_OK != ret){_stprintf_s(errMsg, _T("Attach grabbing failed! ErrorCode[%d]"), ret);throw errMsg;return FALSE;}// 开始拉流 // Start grabbing ret = IMV_StartGrabbing(devHandle);if (IMV_OK != ret){_stprintf_s(errMsg, _T("Start grabbing failed! ErrorCode[%d]"), ret);throw errMsg;return FALSE;}

一般而言,此时将显示的信息直接写到onGetFrame之中便是可以的,但是此处我是通过界面交互的方式。由于此处是将相应的采集信息通过一个线程发送出去,因此,需要将线程进行加入。

    try{LxhStartThread();}catch (TCHAR* errMsg){throw errMsg;return FALSE;}

二.问题猜想

想法一:和之前的倾角传感器的延迟解决方案一致,先启动线程再进行采集。发现并不是这里的问题。

onGetFrame函数之中将帧信息进行复制

static void onGetFrame(IMV_Frame* pFrame, void* pUser)
{if (pFrame == NULL){return;}CRGB_CameraCtrl *pThis = (CRGB_CameraCtrl2 *)pUser;// Save and call thread.FrameBuffer* pConvertFrameBuffer = new FrameBuffer(pThis->GetDevHandle(), *pFrame);memcpy_s(pThis->pRGB_bufPtr(), IMAGE_SIZE, pConvertFrameBuffer->bufPtr(), IMAGE_SIZE);//使用delete pConvertFrameBuffer;return;
}

开始写的代码是这顺序:注册回帧函数 -> 抓流 -> 启动线程。问题?是不是抓流和启动线程之间存在一定的时间延迟?

所以这里想的是在进行抓流之前便把线程启动起来,实时监控帧信息进行显示。

想法二:首先设置左右相机帧率一致,启动代码,发现仍然存在左右相机延迟的问题。

想法三:
①首先启动官方软件时,观察相机的各项指标。

可以观察到左、右相机的帧率都为10FPS,其中数据传输速率几乎一致。

左右相机同步。
②之后启动自己写的软件,观察情况。

可以观察到左右相机仍然同步。
③再次启动官方软件观察相机的各项指标。

可以发现到左相机明显出现速率变慢的情况。

④多次重复上述②③操作,发现左相机的帧率和传输速率下降的非常明显。按道理而言,在关闭自己写的软件,打开官方软件,采集速率应该是保持一致的。因此,猜想是自己写的软件并没有关闭成功。

查看后台:

果然发现软件仍然在后台进行运行。结束软件任务,重新打开官方软件,左、右相机的传输速率与帧率正常。

上述说明软件在使用过程之中,没有正常关闭软件,存在软件后台运行的问题,代码层次的原因,看一看代码方面是否存在线程未关闭的情况。

三.软件关闭

果然发现重载 主窗口类的 OnClose 函数之中缺少了一个线程的结束。完善代码,重新重复上述测试过程,不再出现掉帧的现象。

开始没往软件结束这个方向想,因为是左相机比右相机慢,想的方向直接偏到了帧率和线程方向是不是出了问题。最后,对比官方软件发现是软件关闭之后并未结束,导致左相机网口一直占用,从而左相机读出的数据比右相机慢很多。

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

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

相关文章

mdbook 使用 Rust 创建书籍的 Markdown 工具

当我们使用 markdown 编写文档时&#xff0c;目前有 gitbook&#xff0c;typora &#xff0c;以及一些 vscode 插件提供的 markdown 编辑插件&#xff0c;推荐一个开源实用的由 rust 官方维护的 mdbook。 官方仓库&#xff1a;https://github.com/rust-lang/mdBook 使用向导&a…

基于YOLOv5全系列参数模型【n/s/m/l/x】开发构建道路交通场景下CCTSDB2021交通标识检测识别系统

交通标志检测是交通标志识别系统中的一项重要任务。与其他国家的交通标志相比&#xff0c;中国的交通标志有其独特的特点。卷积神经网络&#xff08;CNN&#xff09;在计算机视觉任务中取得了突破性进展&#xff0c;在交通标志分类方面取得了巨大的成功。CCTSDB 数据集是由长沙…

Centos7 静态连接失败解决

在 Linux 下有时候我们需要静态连接&#xff0c;但是静态连接会失败&#xff0c;失败的原因有几种&#xff1a; 1.没有相关的静态库文件 如果是没有相关的静态库文件&#xff0c;那么使用静态连接的话&#xff0c;就是下面的这种效果&#xff1a; 就是显示无法找到 .... 解…

搭建Github Page完全手册

一、前期准备 注册Github账号&#xff08;必备&#xff09;下载GitHub Desktop&#xff1a;下载链接&#xff08;可使用git代替&#xff09;模板选择网站&#xff1a; jekyllthemes.orggohugomademistakes 二、快速入门 1.模板参考 作者使用的模板来源&#xff1a;https://…

2024年最热门的15个科技工作岗位

1.系统安全管理员 系统安全管理员的任务是确保公司的网络、数据和系统免受网络安全威胁&#xff0c;方法是确保有适当的安全战略并保持最新的合规性和策略。 要求&#xff1a;应聘者应具有网络安全职位的工作经验&#xff0c;并对合规性和安全协议的最佳实践有坚实的基础&a…

阅读技巧总结

1、英语阅读中Skimming和Scanning的区别 Skimming&#xff1a;略读&#xff0c;即&#xff1a;不追求句子的细节含义&#xff0c;只求了解句子和段落想表达什么&#xff0c;摸清楚文章的主旨大意&#xff0c;也就是老外常说的&#xff1a;Reading for gist(主旨) Scanning&am…

文件批量改名,快速去除文件名中的空格,告别命名烦恼!

在日常工作中&#xff0c;我们经常遇到文件名中带有空格的情况&#xff0c;这不仅导致文件难以查找&#xff0c;还可能在某些软件中引发问题。那么&#xff0c;如何快速、有效地去除这些空格呢&#xff1f;今天&#xff0c;我就来教你一招&#xff01; 首先&#xff0c;我们要进…

LeeCode前端算法基础100题(16)- 轮转数组

一、问题详情: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4]…

【IEEE会议征稿通知】第五届计算机视觉、图像与深度学习国际学术会议(CVIDL 2024)

第五届计算机视觉、图像与深度学习国际学术会议&#xff08;CVIDL 2024&#xff09; 2024 5th International Conference on Computer Vision, Image and Deep Learning 第五届计算机视觉、图像与深度学习国际学术会议&#xff08;CVIDL 2024&#xff09;定于2024年4月19-21日…

银烧结设备研究分析:2025年将增长至2.58亿美元

银烧结设备是一种用于生产银浆的设备&#xff0c;广泛应用于电子、光伏、LED等领域。本文将从全球市场和中国市场两个方面进行分析其发展趋势。全球市场 全球银烧结设备市场规模在2019年约为2.09亿美元&#xff0c;预计到2025年将增长至2.58亿美元&#xff0c;复合年增长率为3.…

LeetCode刷题---两数之和

解题思路&#xff1a; 该题使用哈希表的思想解决该问题 首先定义一个Map&#xff0c;key为数组中的每个元素&#xff0c;value为每个元素的索引下标。接着遍历原数组&#xff0c;对每一个元素进行判断&#xff0c;如果哈希表中包含target-nums[i]&#xff0c;则将其value和当前…

【JAVA GUI+MYSQL]社团信息管理系统

本社团信息管理系统主要实现登录注册、管理员信息管理、社团用户信息管理、用户申请信息管理功能模块。 目录 &#xff11;&#xff0e;系统主要功能介绍 &#xff12;&#xff0e; 数据库概念模型设计 3.具体功能模块的实现 3.1模型类 3.1.1Student.java 3.1.2User .j…

基于ssm的孩童收养信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本孩童收养信息管理就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

【温故而知新】JavaScript的类型转换机制

一、概念 JavaScript的类型转换机制是指在特定的运算或操作中&#xff0c;将一种数据类型转换为另一种数据类型的过程。JavaScript的类型转换机制分为两种&#xff1a;隐式类型转换和显式类型转换。 隐式类型转换&#xff08;Implicit Type Conversion&#xff09;&#xff1a…

react-native下载图片到本地相册

需求 点击右上角下载icon&#xff0c;可以将当前图片下载并保存到本地相册。 下载的图片&#xff1a; 流程 下载图片的本质其实是&#xff0c; 固定需要下载的页面内容和样式 》将其放在当前页面不可见区域 》点击下载按钮 》穿一个ref给native&#xff0c;会自动拉起手机系…

SpringBoot怎么写一个自定义的starter,Gradle依赖引入starter的Jar包

1.新建一个Spring的项目myasset-spring-boot-starter 项目结构如下: 注意:不需要Application启动类 和 application.yml/application.properties文件 2. resources下添加spring.factories文件 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigu…

ECMAScript是什么?特性如何

ECMAScript是脚本语言的标准&#xff0c;包括JavaScript、JScript和ActionScript。它最广为人知的是JavaScript标准&#xff0c;旨在确保网页在不同Web浏览器之间的互操作性。它由Ecma International在文件ECMA-262中进行了标准化。 ECMAScript通常用于万维网上的客户端脚本&a…

socks是什么意思

SOCKS&#xff1a;防火墙安全会话转换协议 &#xff08;Socks: Protocol for sessions traversal across firewall securely&#xff09; SOCKS协议提供一个框架&#xff0c;为在 TCP和UDP域中的客户机/服务器应用程序能更方便安全地使用网络防火墙所提供的服务。协议工作在OSI…

Zookeeper的基础介绍和安装教程

1、 Zookeeper入门 1.1 概述 Zookeeper是一个开源的分布式的&#xff0c;为分布式应用提供协调服务的Apache项目。 1.2 特点 1.3 数据结构 1.4 应用场景 提供的服务包括&#xff1a;统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。 统一…