【问题标题】:Object matching in OpenCV 3.1 for JavaOpenCV 3.1 for Java 中的对象匹配
【发布时间】:2016-04-19 22:20:24
【问题描述】:

我发现 OpenCV 中提供了倒角匹配。我可以看到有一个用于 C++ 的函数chamferMatching(),而且似乎也有一种在 Python 中使用它的方法。但是,我无法找到如何在 Java 中使用此功能。我正在使用 OpenCV 3.1 在 Java 界面哪里可以找到它?那里有吗?

如果没有,我可以用什么代替?我正在尝试识别水果。现在尤其是苹果。我想将预先计算的苹果轮廓与图像中找到的轮廓相匹配(倒角匹配)。在找到一个可能的苹果后,我打算使用分类器来确保颜色和纹理是正确的。

模板匹配似乎是一个糟糕的选择,因为它不适用于识别旋转对象。我想知道我是否可以使用功能描述符。请注意,我并没有尝试识别特定的苹果,而且我不知道特征描述符是否适用于此。

有什么想法吗?

编辑:好的,我决定使用 findContours() 函数来获取图像中的所有轮廓,然后按区域过滤它们并将每个过滤后的轮廓与其他轮廓进行比较,指定为来自训练的模板,使用 matchShapes()。我实现了这个,但它不能正常工作(因为 findContours() 没有检测到苹果轮廓)但我会发布另一个关于这个特定问题的问题。这里我想问一下这种方式听起来是否可行,是否有更好的方法来检测和比较轮廓。

【问题讨论】:

  • 我似乎无法在 OpenCV 3.1 的 C++ API 中找到该函数,但如果它可用,我们可以使用 JavaCPP 预设访问它:github.com/bytedeco/javacpp-presets/tree/master/opencv
  • 感谢您的链接!不久前我发现它是 JavaCV 的一种方法,它可能根本不在 OpenCV 中。所以我可能不得不使用其他东西......

标签: java opencv image-processing


【解决方案1】:

好的,我想通了。 OpenCV 中似乎没有倒角匹配。它是在 JavaCV 中实现的,在本机代码中没有任何迹象。由于我使用 OpenCV for Java,所以这对我来说不是一个好的解决方案。

This 回答对我帮助很大。它是用 C++ 编写的,但可以很容易地用 Java 编写。

最初,我使用包含 100 个青苹果图像的数据库来训练程序。训练实际上只是将每张照片的最大轮廓存储在一个文件中。

我的问题的关键是将图像分成 3 个不同的通道,从而产生 3 个不同的灰度图像。我使用 Canny 转换它们并进行扩张。现在我检查每一个的轮廓,很可能我会在其中至少一个中检测到苹果的轮廓。一旦我从 3 幅图像中获得了所有轮廓,我会按大小对其进行过滤,然后将它们与训练数据中的每个轮廓进行比较。如果轮廓与其中一个足够接近,我认为它是苹果的轮廓。

似乎有很多误报,但当我的同事实施模块检查所选轮廓(其内容)的颜色和纹理时,它们会被过滤掉。

这里是our project's repository,如果对任何人有帮助的话。

【讨论】:

    猜你喜欢
    • 2016-04-13
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多