相机同步遇到的小问题

出现问题

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

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

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

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

解决思路

一.原始代码

原来的代码之中使用到了相应的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 函数之中缺少了一个线程的结束。完善代码,重新重复上述测试过程,不再出现掉帧的现象。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python scoket

import socket# 监听本机的IP和端口 sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((10.10.10.170, 9000))sock.listen(10) while True:# 3.等待连接请求的申请&#xff0c;有人来连接&…

QC/PD快充电源产品MOS选型分析

• 原边650-700V SJ MOSFET采用低FOM值的ESM 技术&#xff0c;有利于提高系统效 率&#xff0c; 以及更佳的EAS和EMI等特性&#xff0c;对于一些不含PFC电路的系统更友好。 • 副边采用低FOM值的SGT同步整流电路&#xff0c;相比肖特基二极管整流能有更低的 损耗&#xff0c;有…

一网打尽所有主流平台的实时热榜

今日热榜 一网打尽所有主流平台的实时热榜https://tophub.today

电脑视频剪辑软件哪个好用

电脑视频剪辑软件是当今创作者不可或缺的工具之一&#xff0c;它们能够帮助我们在电脑上对视频进行编辑、剪辑、特效添加等操作&#xff0c;使我们的作品更加专业、精美。然而&#xff0c;在众多的视频剪辑软件中&#xff0c;该选择哪一个呢&#xff1f;本文将为你推荐2款非常好…

知虾电商(Shopee):东南亚领先电商平台的十大关键特点**

知虾电商&#xff08;Shopee&#xff09;作为东南亚地区领先的电子商务平台&#xff0c;由Sea Group&#xff08;前称Garena&#xff09;在2015年创立。知虾电商以移动优先的策略迅速崛起&#xff0c;为用户提供了一个便捷、安全的在线购物环境。以下是知虾电商的一些关键特点&…

新年福利|这款价值数万的报表工具永久免费了

随着数据资产的价值逐渐凸显&#xff0c;越来越多的企业会希望采用报表工具来处理数据分析&#xff0c;了解业务经营状况&#xff0c;从而辅助经营决策。不过&#xff0c;企业在选型报表工具的时候经常会遇到以下几个问题&#xff1a; 各个报表工具有很多功能和特性&#xff0c…

Vue(三):Vue 生命周期与工程化开发

2023 的最后一篇博客&#xff0c;祝大家元旦快乐&#xff0c;新的一年一起共勉&#xff01; 06. Vue 生命周期 6.1 基本介绍 生命周期就是一个 Vue 示例从 创建 到 销毁 的整个过程&#xff0c;创建、挂载、更新、销毁 有一些请求是必须在某个阶段完成之后或者某个阶段之前执行…

网页在线预览编辑Office,支持doc/docx、xls/xlsx、ppt/pptx、pdf等格式

随着互联网技术的不断发展&#xff0c;越来越多的企业开始采用在线办公模式&#xff0c;微软Office Word 是最好用的文档编辑工具&#xff0c;然而doc、docx、xls、xlsx、ppt、pptx等格式的Office文档是无法直接在浏览器中直接打开的&#xff0c;如果可以实现Web在线预览编辑Of…

逻辑回归(Logistic Regression)

什么是机器学习 逻辑回归&#xff08;Logistic Regression&#xff09;虽然名字中包含"回归"一词&#xff0c;但实际上是一种用于解决分类问题的统计学习方法&#xff0c;而不是回归问题。它是一种线性模型&#xff0c;常用于二分类问题&#xff0c;也可以扩展到多分…

DevOps(10)

目录 56.Docker的架构&#xff1f; 57.Docker镜像相关操作有哪些&#xff1f; 58.Docker容器相关操作有哪些&#xff1f; ​编辑59.如何查看Docker容器的日志&#xff1f; 60.如何启动Docker容器&#xff1f;参数含义&#xff1f; 61.如何进入Docker后台模式&#xff1f;有…

Python重温笔记番外篇

1. 写在前面 今天这篇文章是python重温笔记的番外&#xff0c;整理一些面试中的问题以及遇到过的一些坑&#xff0c; 正好借着这个机会把前面的知识进行一个串联&#xff0c; 要不然这些知识很容易就会遗忘&#xff0c; 毕竟知识多而又不太容易常用到。 涉及到的知识包括列表推…

Databend 的算力可扩展性

作者&#xff1a;尚卓燃&#xff08;PsiACE&#xff09; 澳门科技大学在读硕士&#xff0c;Databend 研发工程师实习生 Apache OpenDAL(Incubating) Committer PsiACE (Chojan Shang) GitHub 对于大规模分布式数据处理系统&#xff0c;为了更好应对数据、流量、和复杂性的增长…

湖南大学-数据库系统-2023期末考试【原题】

前言 早上11&#xff1a;00考完的考试&#xff0c;下午回来打了三把LOL之后&#xff0c;凭着回忆把题目重现出来了。 在复习的时候刷了15&#xff0c;16&#xff0c;17&#xff0c;18&#xff0c;19&#xff0c;21六年的卷子&#xff0c;感觉题目都差不多&#xff0c;但是难度…

BAT036:TXT与DOC格式互转、DOC与DOCX格式互转

引言:编写批处理程序,可实现txt与doc文档格式互转、doc与docx文档格式互转。 一、新建Windows批处理文件 参考博客: BAT002:在右键菜单新建中添加【Windows批处理文件】_为右键菜单添加bat-CSDN博客 二、TXT与DOC格式互转 1.右键新建的批处理文件,点击【编辑】。 ​ …

让电脑变得更聪明——用python实现五子棋游戏

作为经典的棋类游戏&#xff0c;五子棋深受大众喜爱&#xff0c;但如果仅实现人与人的博弈&#xff0c;那程序很简单&#xff0c;如果要实现人机对战&#xff0c;教会计算机如何战胜人类&#xff0c;那就不是十分容易的事了。本文我们先从简单入手&#xff0c;完成五子棋游戏的…

ES两个小时没连接竟然会出现bug,为此老板给我夹了个鸡腿。。。

前言 前段时间上线了个项目&#xff0c;测试每天早上来摸鱼之前会点一点&#xff0c;发现第一次点会报错&#xff0c;然后一天都没问题&#xff0c;刚开始没在意&#xff0c;后来每天上班来摸鱼前点第一次都会出错&#xff0c;发现真的摸到鱼了&#xff0c;然后就给我提了个bu…

深耕汽车检测设备领域,引领行业技术革新

在汽车工业飞速发展的今天&#xff0c;汽车检测技术作为保障车辆安全、提升维修效率的重要手段&#xff0c;日益受到行业内外的高度关注。康士柏汽车检测线设备厂家&#xff0c;作为这一领域的佼佼者&#xff0c;凭借其深厚的技术积累和卓越的产品品质&#xff0c;正引领着行业…

CSS基础笔记-01CSS概述

文章目录 前言CSS是什么CSS的作用CSS语法添加CSS的方法 前言 CSS是什么&#xff1f;有什么作用&#xff1f;怎么编写CSS&#xff1f;怎样添加CSS&#xff1f;本文对CSS的四个方面作了学习并形成学习笔记。 CSS是什么 CSS &#xff08;Cascading Style Sheets&#xff0c;层叠…

java字节码

1. 字节码 1.1 什么是字节码&#xff1f; Java之所以可以“一次编译&#xff0c;到处运行”&#xff0c;一是因为JVM针对各种操作系统、平台都进行了定制&#xff0c;二是因为无论在什么平台&#xff0c;都可以编译生成固定格式的字节码&#xff08;.class文件&#xff09;供…