当前位置:AIGC资讯 > 数据采集 > 正文

工业相机采集问题汇总

1、相机连接超时

	waitforbuffer(uint timeout);//相机触发采集超时时间,设置1000ms,外出发模式下超过一秒未采集到图像就会报错。
解决方式:采用捕捉异常的方式跳过
try
{.....	//采用捕获异常的方式避免线程断开,开启一个线程循环启动相机,避免相机掉线或未启动导致异常。
waitforbuffer(uint timeout);
}
catch(exception e)
{  continue;  }

2、外触发模式采集异常

	设置外触发模式,启动相机就直接跳出连续相同的帧图像,实际上编码器并没有转动。
cam->setParam("ProfileTriggerMode", "EncoderResolverInterfaceRS422");

解决方式:代码编写中参数设置错误,利用相机自带软件设置好采集参数,同样出现异常图像帧,说明代码应该没有问题。
考虑编码器电压异常,利用电压表测编码器输入端电压,一直显示在-3V左右,有异常电源输入,将光电编码器从伺服电机上拆下来,重新测量电压,电压恢复正常,异常情况来自伺服电机干扰。
备注:1、光电编码器属于灵敏器件,应当避免外部电磁干扰,做好保护措施。
2、工业相机采集是个多系统配合的流程,出现问题要多方面考虑,避免单点思考带来的局限性。
3、软件编写注重单元测试,逐步完成。

3、单线程采集卡顿

	MainWindow主线程中采集图片并展示数据,利用if(cv::WaitKey(1) != 1) break; 绘制图像界面,界面会有点卡顿的感觉,相机掉线等需要重启软件,体验感不佳。同时若是相机显示保存速度跟不上,容易出现数据掉帧的情况,系统稳定性无法保证。
	解决方式:采用多线程编程,软件启动时预设三个线程:
	1、更新维护设备状态线程,若是设备掉线或未启动,则尝试重连设备,连接超过10次后停止,或者可以设置重启时间。该线程可采用时间定时器实现,定时启动检查。
	2、维护一个公共队列,线程二只解析采集到的原始数据,压入公共队列队尾。
	3、开启一个线程从公共队列,维护队列状态,若是队列长度超过一个数据,开启新的线程处理数据。注意读取队列前判断队列是否为空,不为空则取出队首数据,增加已处理数。

4、图像固定模式噪声

相机工艺导致的固定噪声如何去除,思路有以下几点:
			不均衡问题:定位固定噪声模式、特征及位置
			                     1、采用均衡化算法对像素值进行平衡
			                     2、比对周围像素差异,利用插值算法对四周像素进行调整

5、捕获异常未显示,线程退出却没有意识到

 捕获异常写在线程循环外部,导致捕获异常直接退出线程。主要针对相机连接超时函数应该将捕获异常写在循环内部,特别注意循环导致的异常捕获,是在线程内部还是外部。

更新时间 2023-11-08