基于图像的计数算法,用于计算移动输送机上的物体

时间:2015-12-28 07:41:45

标签: c++ algorithm opencv image-processing computer-vision

我正在构建一个视觉系统,可以计算在变速传送带上移动的盒子。

使用open_cv和c ++,我可以分离blob并提取相应的质心。

现在我必须增加count变量,如果质心越过截止边界线。

请查看屏幕截图以获得更清晰(三帧,标记的阈值和质心):

Screenshot of 3 frames, thresholded and centroids marked.

这是我被困的地方。我尝试了两种替代方案。

  1. 固定矩形条,其中质心仅保留一个框架
    • 但由于输送机是多速的,我无法确定恒定的边界值。
  2. 我试过像

    这样的东西
    centroid_prev = centroid_now;
    centroid_now = posX;
    if (centroid_now >= xLimit && centroid_prev < xLimit)
    {
        count++;
    }
    
    • 如果传送带上只有一个盒子,这样可以正常工作。

    • 但对于同一帧中的2个或更多blob,我不知道如何使用数组来处理轮廓。

  3. 能否请您建议一个可以比较的简单计数算法  即使是前一帧和当前帧之间的blob属性  每帧有多个blob?

    PS。传送带速度大约为50箱/秒,因此我们非常欣赏轻量级算法,否则我们最终可能会降低帧速率。

3 个答案:

答案 0 :(得分:0)

假设您粘贴的图像具有代表性,您可以通过某种跟踪轻松解决此问题。 最简单的方法是使用goodFeaturesToTrackcalcOpticalFlowPyrLK来跟踪输送机的运动。
您可能需要对结果进行一些过滤,但我认为这很难,因为运动和图像的噪音非常低。 拥有该动作后,您可以计算每个质心何时超出某个X阈值并对其进行计数。

如果角落数量较少(<100),例如在此图像中,它应该很快。

答案 1 :(得分:0)

您是否尝试将前一帧的质心坐标与新帧中的质心相匹配?您可以使用OpenCV的descriptor matchers。 (代码会对所有匹配的特征向量进行采样,但没有理由不将它们用于坐标匹配。)

如果您担心性能:匹配5-10个坐标中心应该比在图像中找到斑点的速度快一些。

答案 2 :(得分:0)

这是数组的算法。这只是你正在做的事情的延伸 - 你可以调整细节

ISerializable

-

如果对象可以移动(并且看起来大致相同),则需要添加其他信息(如颜色)来定位相同的对象。