手写体数字图像识别图像
上次我们看到了如何识别图像中的关键点 。 然后,我当时正在考虑使用机器学习技术来识别每个点所扮演的角色。 我使用Weka玩了一段时间,该工具非常容易尝试使用不同的机器学习算法。 为了确定分类中要使用的功能,我使用了以下策略:
- 我围绕着兴趣点绘制了两个同心圆:一个靠近而另一个距离
- 我确定了关键点所属的轮廓与同心圆的交点
- 我将圆圈分为12个部分,计算出每个部分有多少个相交处
- 然后,我将这24个值用于分类
..如果简单的启发式方法可以做到...
但是我意识到,实际上并不需要机器学习。 相反,我可以使用非常简单的启发式方法。 毕竟,我只是在寻找矩形的角,因此我只考虑了具有两个相交点的点,分别是最接近和最远的圆。 然后我考虑了这个相交的角度,基本上是在寻找90°左右的东西。 然后考虑角的方向,将其分类为左上角,右上角,左下角或右下角。
对点进行分类后,我开始寻找左上角并考虑匹配右下角。 我只是朝着正确的方向选择了最接近的一个。 一旦我有了一对左上角和右下角,我便知道在哪里寻找缺失的角:右上角的x应当等于右下角的一个,而y则等于左上角之一,反之亦然。 如果可以在寻找它们的这两点找到它们,那么我认为矩形是完整的。
最后,我只需要检查我是否识别出重叠的矩形:在那种情况下,我只是扔掉了较小的矩形。
这个算法不是完美的,但是我得到了不错的结果:
为什么我不使用OpenCV
当我们处理图像时,OpenCV是显而易见的答案,但是我并没有得到很好的结果。 我发现的轮廓线不是矩形,这似乎使检测矩形的典型算法感到困惑。 这是由于矩形之间的连接(连接矩形的线)。 我尝试了几件事,但是没有得到任何好的结果。 除此以外,OpenCV用C / C ++编写,这基本上意味着部署它非常麻烦。 我当前的解决方案基于Java,这意味着我可以轻松地在每个可能的平台上运行它,而不会感到头疼。 我将再看看OpenCV,我很愿意提出建议。 实际上,我的一个朋友给了我一些不错的主意。
代码,代码在哪里?
您知道,语言很不错,而真正重要的只是代码。 您可以在GitHub上获取它, 网址为 : https : //github.com/ftomassetti/SketchModel
翻译自: https://www.javacodegeeks.com/2016/04/recognizing-hand-written-rectangles-image.html
手写体数字图像识别图像