1

我目前正在为我学校的机器人俱乐部开发一个图像识别软件,其中一个部分真的让我很难过:形状识别。在尝试检测竞技场中的形状之前,我需要能够检测到此图像中的正方形。

我查找了一些库,如 JavaCV,但我真的找不到适合我口味的东西。作为参考,这是我试图确定形状的图像

要检查的文件

4

2 回答 2

2

您是否尝试过应用霍夫变换

这似乎是您所需要的,因为您的正方形有直边。

于 2012-12-23T12:35:42.713 回答
1

我正在做与您的任务类似的事情,但我需要识别物体的类别(电阻器、电容器等)以及它们在真实黑白照片中的边界是什么:

黑白照片

基本上,该方法是这样的:

  1. 预处理——校正对比度、亮度、腐蚀、膨胀、中值等——这一步可以适应整个/部分照片。
  2. 分割 - 现在找到照片的某些部分,其中可能存在“某些东西”,具有一定的面积​​、像素强度等阈值。
  3. 表征 - 为每个找到的潜在段计算一些特性 - 最大长度、面积、W、M - 行列式等。
  4. 分类 - 有几个分类器检查给定特征是否属于此类,如果答案是肯定的 - 给定特征与理想模型特征的“距离”是多少。分类是使用模糊逻辑推理完成的。
  5. 当然 - 对于每一个成功的分类,如果存在最好的匹配。

在您的情况下 - 正方形的最简单表征是找出它的面积以及属于找到的段的两点之间的最大距离。在此之前,您应该使用“关闭”操作(膨胀->侵蚀)对图像进行预处理

您还可以创建很好的算法来识别一个正方形是否被一条线切割(并删除该线 - 然后再次识别)并检查一个正方形是否与其他正方形重叠,等等。


就个人而言,我不知道有任何图书馆可以做如此复杂的事情,例如library.recognizeSquaresOnImage(params). 为您提供了一些有用的方法来准备用于识别的图像 - 这是您任务的核心 - 您必须自己完成。

每个识别问题都有其独特的特征,可用于缩小“识别管道”中每一步的不确定结果。例如,在我的任务中,我知道物体在相当白的背景上是黑色的,并且或多或少地彼此分离,等等。

我的项目是使用 OpenCV 库用 C++ 编写的,我使用 OpenCV 库仅用于读取/写入图像并将其显示在窗口中 - 我不允许使用该库的任何其他方法。

作为参考,您如何做到这一点 -这里是整个项目。即使现在它也不能完美地工作——它需要对分类器进行一些校准。

为了更好地掌握它在更高级别上的工作原理 - 查看main.cpp文件。

于 2012-12-23T12:29:33.037 回答