跳转到内容

SwisTrack/Examples/IDReaderRing

来自维基教科书,开放的书籍,为开放的世界

SwisTrack 中的 IDReaderRing 组件可以读取 blob 周围的圆形条形码。该实现假设中间有一个白色 blob,可以使用标准的 blob 检测算法检测,周围有一个灰黑色条形码。本示例包含用于创建此类条形码 blob 的 Matlab 代码,以及有关如何使用它的信息。

创建新的 Blob 集

[编辑 | 编辑源代码]

用于创建 blob 的 Matlab 脚本位于 CreateBarCodes 文件夹中。以下过程将创建条形码

  • 创建一个符号列表,例如使用 14 个芯片和汉明距离 4
symbollist=symbols(14, 4)
  • (可选) 检查符号距离
symboldistances(14, symbolist);
  • (可选) 绘制一个符号
drawsymbol(14, symbollist(1), 'Test')
  • 绘制(并保存/导出)所有符号
exportsymbols(14, symbolist, 'Test')

您可能想要修改“drawsymbol”以更改 blob 的大小/比例。该算法找到具有 14 个芯片且旋转独立的代码(即,任何两个代码在任何旋转中都不相同),并且具有至少 4 个芯片的汉明距离(即,任何两个代码在任何旋转中至少有 4 个芯片不同)。这是以启发式的方式完成的,在多次运行算法时,它可能会产生略微不同的代码数量。

选择正确的芯片数量

[编辑 | 编辑源代码]

芯片数量以及汉明距离将极大地影响可用代码的数量。然而,这里涉及许多权衡

  • 使用的芯片越多,获得的代码就越多。
  • 汉明距离越大,获得的代码就越少。
  • 使用的芯片越多,需要的分辨率就越高(即更好的相机分辨率或相机图像上更大的 blob)。这是奈奎斯特准则施加的限制。作为经验法则,对于具有 0.7N 个芯片的代码,图像应至少为 N×N 像素。
  • 汉明距离越大,检测/辨别就越健壮。

因此,您应该找到一个配置,提供您真正需要的 blob 数量。比您需要的代码多一两倍是可以的,并且可以在以后需要更多代码的情况下为您提供备用代码,但如果您的配置产生的代码是您需要的 10 倍或 100 倍,那么您不必要地用检测质量换取代码数量。

创建对象列表

[编辑 | 编辑源代码]

要创建条形码列表,请运行 exportsymbols.m 以获得包含所有符号的完整 XML 文件,或修改现有的 robotlist.xml。最理想的是,您只在此处输入实验中使用的条形码。文件包含的条形码越多,检测条形码所需的时间就越长。

玩转检测算法

[编辑 | 编辑源代码]

要玩转检测算法,DetectionAlgorithm 文件夹中提供了一个 Matlab 脚本。

实用提示和限制

[编辑 | 编辑源代码]

当前实现假设条形码是完美的圆形。在具有高畸变的相机上,这不会产生令人满意的结果。

环的内半径应选择为,以确保中间的 blob 在任何情况下都不会发生干扰。由于 blob 是白色的,算法会将其视为白色芯片。特别是如果预计有小的变形,则条形码和中间的 blob(黑色环)之间的距离应该足够大。如果机器人或地板是白色的,环的外半径也可能发生这种情况。在这种情况下,在条形码外部添加一个大的黑色环会有所帮助。

该实现对于光照具有一定的鲁棒性(消除了亮度平均值),但如果 blob 上有反射,则会失败。这通常不是纸质 blob 的问题,但对于塑料涂层的 blob 来说可能是个问题。

在某些情况下,条形码环中的白色芯片被检测为 blob。一些解决方法包括:- 使条形码为灰黑色而不是白色,并在中间放置一个白色 blob。条形码辨别质量会略微下降,但在许多情况下是可以的。- 保持条形码环很薄,而中间的 blob 很大。然后,对 blob 大小的阈值将过滤掉一些连续的白色芯片以及任何其他太小而不能是 blob 的东西。

使用拜耳模式彩色相机时,您可能需要更高的有效分辨率才能可靠地检测条形码。

华夏公益教科书