相机同步遇到的小问题

出现问题

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

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

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

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

解决思路

一.原始代码

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

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

相关推荐
youngong5 小时前
强迫症之用相机快门数批量重命名文件
数码相机·文件管理
weixin_466485114 天前
halcon标定助手的使用
数码相机
诸葛务农5 天前
ToF(飞行时间)相机在人形机器人非接触式传感领域内的应用
数码相机·机器人
塞北山巅5 天前
相机自动曝光(AE)核心算法——从参数调节到亮度标定
数码相机·算法
美摄科技6 天前
相机sdk是什么意思?
数码相机
phyit6 天前
全景相机领域,影石何以杀出重围?
数码相机
鄃鳕6 天前
装饰器【Python】
开发语言·python·数码相机
聪明不喝牛奶6 天前
【已解决】海康威视相机如何升级固件
数码相机
PAQQ7 天前
1站--视觉搬运工业机器人工作站 -- 相机部分
数码相机·机器人
诸葛务农7 天前
人形机器人基于视觉的非接触式触觉传感技术
数码相机·机器人