OpenCV - 使用实时相机进纸检测托盘中丢失的硬币

时间:2018-02-09 03:32:50

标签: python opencv image-processing computer-vision

我正在构建一个系统,用于检测从托盘中拾取的硬币。此托盘将保存在公共场所。人们会拿起一个或多个硬币,但预计会在一段时间后让它们恢复。

enter image description here

我会通过位于顶部的网络摄像头直播。我将在一天开始时进行校准步骤,捕获用于与实时馈送进行比较的托盘的初始状态。正如您在示例图像中看到的那样,开始时可能会有几个插槽为空。

我需要检测最初有硬币的插槽,但在白天的任何给定时间点都会丢失相同的插槽。

我正在尝试使用OpenCV的几种方法:

  • SSIM差异:我可以使用SSIM在我的实时图像帧和初始状态之间找到差异。然而,许多槽大于相应的硬币尺寸(例如,前两行)。这可能意味着如果硬币最初被放置在中心位置,但后来被放回触摸其中一个边缘,我们可能会出现误报。

  • Blob检测:或者,我可以预先提供(或检测)插槽坐标。然后在每个插槽中进行blob检测。如果原始状态中存在斑点,但相机框架中缺少斑点,则表示已拾取硬币。但是,如果硬币和托盘之间的对比度很低,准确的斑点检测可能是一个挑战。

我可能还需要注意由于人们四处移动的阴影而导致的灯光微小变化。

关于可以尝试的替代方法的这些或任何指针的任何想法?我可以从中学到任何类似的实现吗?

非常感谢提前。

编辑:感谢@ I.Newton的建议。对于那些偶然发现这个问题并将从示例实现中受益的人,请查看:https://github.com/kewats/computer-vision-samples/tree/master/image-processing/missing-coins-detection

1 个答案:

答案 0 :(得分:2)

如果您完全控制了光照条件,您可以使用简单的颜色阈值来解决问题。

首先为盒子制作一个面具。您可以通过颜色阈值或使用自适应阈值或canny边缘等以多种方式执行此操作。我通过颜色阈值

进行

enter image description here

然后用同样的方法为硬币制作一个面具。

enter image description here

现在从每个硬币的中心填充你的盒子面具。它只保留没有硬币的那些。

enter image description here

现在你可以将它与你的初始面具进行比较,以确定是否存在所有硬币

enter image description here

这不包括帧减法。所以你不必担心盒子里的硬币位置不同。您唯一需要确定的是制作面具的照明条件。如果你想确保硬币返回到同一个盒子,你应该去模板匹配等再次需要努力。