我正在构建一个视觉系统,可以计算在变速传送带上移动的盒子。
使用open_cv和c ++,我可以分离blob并提取相应的质心。
现在我必须增加count变量,如果质心越过截止边界线。
请查看屏幕截图以获得更清晰(三帧,标记的阈值和质心):
这是我被困的地方。我尝试了两种替代方案。
我试过像
这样的东西centroid_prev = centroid_now;
centroid_now = posX;
if (centroid_now >= xLimit && centroid_prev < xLimit)
{
count++;
}
如果传送带上只有一个盒子,这样可以正常工作。
但对于同一帧中的2个或更多blob,我不知道如何使用数组来处理轮廓。
能否请您建议一个可以比较的简单计数算法 即使是前一帧和当前帧之间的blob属性 每帧有多个blob?
PS。传送带速度大约为50箱/秒,因此我们非常欣赏轻量级算法,否则我们最终可能会降低帧速率。
答案 0 :(得分:0)
假设您粘贴的图像具有代表性,您可以通过某种跟踪轻松解决此问题。
最简单的方法是使用goodFeaturesToTrack
和calcOpticalFlowPyrLK
来跟踪输送机的运动。
您可能需要对结果进行一些过滤,但我认为这很难,因为运动和图像的噪音非常低。
拥有该动作后,您可以计算每个质心何时超出某个X阈值并对其进行计数。
如果角落数量较少(<100),例如在此图像中,它应该很快。
答案 1 :(得分:0)
您是否尝试将前一帧的质心坐标与新帧中的质心相匹配?您可以使用OpenCV的descriptor matchers。 (代码会对所有匹配的特征向量进行采样,但没有理由不将它们用于坐标匹配。)
如果您担心性能:匹配5-10个坐标中心应该比在图像中找到斑点的速度快一些。
答案 2 :(得分:0)
这是数组的算法。这只是你正在做的事情的延伸 - 你可以调整细节
ISerializable
-
如果对象可以移动(并且看起来大致相同),则需要添加其他信息(如颜色)来定位相同的对象。