相机同步遇到的小问题

出现问题

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

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

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

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

解决思路

一.原始代码

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

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

对比两个回调函数:

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

cpp 复制代码
// 注册数据帧回调函数
	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之中便是可以的,但是此处我是通过界面交互的方式。由于此处是将相应的采集信息通过一个线程发送出去,因此,需要将线程进行加入。

cpp 复制代码
    try
	{
		LxhStartThread();
	}
	catch (TCHAR* errMsg)
	{
		throw errMsg;
		return FALSE;
	}

二.问题猜想

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

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

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

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

相关推荐
3DVisionary13 小时前
数字图像相关DIC技术用于机械臂自动化焊接全场变形测量
运维·数码相机·自动化·焊接变形实验·数字图像相关dic技术·自动化焊接全场变形测量·非接触高精度环境适应性全场测量
资源补给站2 天前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机
CES_Asia3 天前
工信部“人工智能+”制造行动点亮CES Asia 2025
人工智能·科技·数码相机·制造·智能音箱·智能手表
只待花开4 天前
ROS2 python编写 intel realsense D405相机节点通过launch.py启动多个相机并发送图像话题,基于pyrealsense2库
数码相机
KeyPan4 天前
【ORB-SLAM3:相机针孔模型和相机K8模型】
数码相机
千穹凌帝4 天前
基于深度学习多图像融合的屏幕缺陷检测方案
人工智能·深度学习·数码相机
传说故事5 天前
相机内外参知识
数码相机·相机·相机参数
妄想出头的工业炼药师5 天前
imu相机EKF
数码相机
合方圆~小文5 天前
工业摄像机基于电荷耦合器件的相机
人工智能·深度学习·数码相机·目标检测
资源补给站6 天前
大恒相机开发(1)—Python调用采集彩色图像并另存为本地
开发语言·python·数码相机