相机同步遇到的小问题

出现问题

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

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

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

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

解决思路

一.原始代码

原来的代码之中使用到了相应的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.rhkb.cn/news/231581.html

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

相关文章

最新GPT4.0使用教程,AI绘画,ChatFile文档对话总结+GPT语音对话使用,DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…

亚信安慧AntDB数据库:企业核心业务系统数据库升级改造的可靠之选

在近期召开的“2023年国有企业应用场景发布会”上&#xff0c;亚信安慧公司的核心数据库产品AntDB闪耀登场&#xff0c;技术总监北陌先生针对企业核心业务系统数据库升级改造的关键议题发表了深度分享。他从研发、工程实施和运维管理三个维度细致剖析了当前企业在进行数据库升级…

Linux系统安装MySQL

Linux系统安装MySQL 第一步&#xff1a;下载YUM wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm第二步&#xff1a;安装MySQL的YUM 仓库 rpm -ivh mysql57-community-release-el7-11.noarch.rpm第三步&#xff1a;查看MySQL版本 yum repolist …

嵌入式科普(9)vscode无法跳转和恢复默认配置

一、目的/概述 二、解决办法 2.1 使能Intelli Sense Engine 2.2 vscode恢复默认配置 2.3 c/c与clangd冲突 嵌入式科普(9)vscode无法跳转和恢复默认配置 一、目的/概述 1、2024年的第一天突然vscode无法跳转,莫名其妙 2、尝试了各种设置和插件都无效&#xff0c;卸…

【萤火虫系列教程】1/5-Adobe Firefly 注册账号

001-Adobe Firefly 注册账号 AI时代如火如荼&#xff0c;Adobe也不甘落后&#xff0c;于今年3月份发布AI创意生成工具Firefly&#xff08;中文翻译&#xff1a;萤火虫&#xff09; Adobe Firefly简介 Adobe Firefly的官方介绍为&#xff1a;Firefly是Adobe产品中新的创意生成…

YOLOv8模型yaml结构图理解(逐层分析)

前言 YOLO-V8&#xff08;官网地址&#xff09;&#xff1a;https://github.com/ultralytics/ultralytics 一、yolov8配置yaml文件 YOLOv8的配置文件定义了模型的关键参数和结构&#xff0c;包括类别数、模型尺寸、骨架&#xff08;backbone&#xff09;和头部&#xff08;hea…

Geotrust DV通配符证书保护域名数量

Geotrust是一家知名的SSL证书提供商&#xff0c;旗下有多种类型的SSL数字证书&#xff0c;保护网站数据在传输过程中的安全性和完整性&#xff0c;帮助用户确认其网站的安全。通配符SSL证书是Geotrust颁发的一种可以同时保护多个域名站点的SSL证书。今天就随SSL盾小编了解Geotr…

Jmeter 性能 —— 电商系统TPS计算

1、怎么计算得出TPS指标 ①第一个通过运维那边给的生产数据&#xff0c;看一下生产进件有多少&#xff0c;计算得来的&#xff0c;如果没有生产数据&#xff0c;或者不过就看如下的方法 ②第二个就是根据最近一个月的实际访问数据&#xff0c;比如每天调用了多少个接口&#…

将 validator 校验器从 ParameterValidator 中抽离出来

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 pyparamval…

01、Kafka ------ 下载、安装 ZooKeeper 和 Kafka

目录 Kafka是什么&#xff1f;安装 ZooKeeper下载安装启动 zookeeper 服务器端启动 zookeeper 的命令行客户端工具 安装 Kafka下载安装启动 Kafka 服务器 Kafka是什么&#xff1f; RabbitMQ的性能比ActiveMQ的性能有显著提升。 Kafka的性能比RabbitMQ的性能又有显著提升。 K…

【React系列】react-router

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识react-router 1.2. 前端路由原理 前端路由是如何做到URL和内容进行映射呢&#xff1f;监听URL的改变。 UR…

【MySQL】orderby/groupby出现Using filesort根因分析及优化

序 在日常的数据库运维中&#xff0c;我们可能会遇到一些看似难以理解的现象。比如两个SQL查询语句&#xff0c;仅仅在ORDER BY子句上略有不同&#xff0c;却造成了性能的天壤之别——一个飞速完成&#xff0c;一个则让数据库崩溃。今天就让我们围绕这个问题&#xff0c;深入剖…

prometheus grafana linux服务器监控

文章目录 前传node-exporter安装配置promethues监控node节点grafana操作查看监控&#xff1a;外传 前传 prometheus grafana的安装使用&#xff1a;https://nanxiang.blog.csdn.net/article/details/135384541 本文说下监控nginx&#xff0c;prometheus grafana linux 安装配…

(NeRF学习)NeRF复现 win11

目录 一、获取源码二、环境三、准备数据集1.下载数据集方法一&#xff1a;官方命令方法二&#xff1a;官网下载数据集 2.修改配置 四、开始训练1.更改迭代次数2.开始训练方法一&#xff1a;方法二&#xff1a; 3.使用预训练模型 五、NeRF源码学习 一、获取源码 git clone http…

初识MySQL

一、什么是数据库 数据库&#xff08;Database&#xff0c;简称DB&#xff09;&#xff1a;长期存放在计算机内&#xff0c;有组织、可共享的大量数据的集合&#xff0c;是一个数据“仓库”。 数据库的作用&#xff1a; 可以结构化存储大量的数据&#xff0c;方便检索和访问…

kubeadm开快速的搭建一个k8s集群

kubeadm开快速的搭建一个k8s集群 二进制适合大集群&#xff0c;50台以上主机 kubeadm更适合中小企业的业务集群。 master节点 20.0.0.92 docker kubelet kubeadm kubectl flannel node1 20.0.0. 94 docker kubelet kubeadm kubectl flanne node2 20.0.0.03 docker kubelet…

面试题:聊聊 SpringBoot 中的 SPI 机制

文章目录 简介Java SPI实现示例说明实现类1实现类2相关测试 源码分析Spring SPISpring 示例定义接口相关实现 相关测试类输出结果源码分析 总结 简介 SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制&#xff0c;可以用来启用框架扩展和替换组件,主要用于框架…

HTTPS协议详解

目录 前言 一、HTTPS协议 1、加密是什么 2、为什么要加密 二、常见加密方式 1、对称加密 2、非对称加密 三、数据摘要与数据指纹 1、数据摘要 2、数据指纹 四、HTTPS加密策略探究 1、只使用对称加密 2、只使用非对称加密 3、双方都使用非对称加密 4、对称加密非…

开发个小破软件——网址导航,解压就能用

网址导航 网站导航也称链接目录&#xff0c;将网站地址或系统地址分类&#xff0c;以列表、图文等形式呈现&#xff0c;帮助快速找到需要的地址。 应用场景 高效查找&#xff1a;网址导航是很好的入口&#xff0c;通过分类清晰的网站推荐&#xff0c;可以迅速访问网站资源。…

SVN下载安装(服务器与客户端)

1.下载 服务器下载&#xff1a;Download | VisualSVN Server 客户端下载&#xff1a;自行查找 2. 服务器安装 双击执行 运行 下一步 同意下一步 下一步 选中安装目录 3. 客户端安装 双击执行 下一步 4. 服务器创建仓库 5. 服务器创建用户 6. 客户端获取资源 文件夹右键