这里只是一个项目的简要内容,
在机器视觉中,很多内容都会有不同程度的抖动和不确定性
特别是在实时检测到的物体上,在帧与帧之间通常差别不大也会有很大区别,这个主要是摄像头造成的
可以用二值化的方式查看,会发现处理后的图像边缘有闪烁,那就是摄像头产生的噪点
然后不要小看噪点,对于需要边缘检测的可以试试,比如用canny,
噪点在实时canny的时候会产生变化的边缘长度,从而对检测造成影响
造成的影响可能是在实时检测的某一帧内就检测不到东西了,或者某几帧
这里假设采集到画面通过opencv处理后产生的是一组不稳定的点集,而你需要是一组稳定的点集
这里我用的方式是延迟,用多次判断来减少错误
当然有新的点需要更少的判断,而去掉一个点要多一些判断能有很好的效果,对于短时遮蔽和快速扰动有很好的忽略效果
stationPointArr是绘制用的点,也就是稳定的点集
stationPointTempArr是临时的点,也就是实时产生的点集
int stableValue1 = 0;//等大的稳定数字
int notStableValue1 = 0;//减少产生的不稳定数
int notStableValue2 = 0;//增加产生的不稳定数
//稳定数组里的点
if(stationPointArr.size() == 0)//如果稳定点数组不存在点,那么使用不稳定中的所有点
{
stationPointArr = stationPointTempArr;
}else
{ //进行稳定性判断
//假设新旧点集等大 这里可能造成的问题就是消除一个的同时恢复成另一个会造成计算人为未改变
if(stationPointArr.size()==stationPointTempArr.size())
{
if(stableValue1 >10)
{//如果稳定数值超过10 则认为可以改变
notStableValue1 = 0;
notStableValue2 = 0;
stableValue1 = 0;
}
}
//假设旧点(用来绘制的点)集比临时的更大 用更长的时间来消除旧的点
if(stationPointArr.size()>stationPointTempArr.size())
{
stableValue1 ++;
if(notStableValue1<30)notStableValue1++;
else
{
notStableValue1 = 0;
stationPointArr = stationPointTempArr;
}
}
//假设新点集更大 用更短的时间来获取新的点
if(stationPointArr.size()<stationPointTempArr.size())
{
stableValue1 ++;
if(notStableValue2<10)notStableValue2++;
else
{
notStableValue2 = 0;
stationPointArr = stationPointTempArr;
}
}
}
这里使用了交错判断方式,经过测试,可以发现遮蔽掉部分点,需要一段时间后才能看到点被去掉,而增加一些点可以快速增加,
快速遮蔽点然后撤回,会发现以前点没有影响