c++ - 复杂形状匹配的最佳方法是什么

标签 c++ algorithm image-processing

我需要知道什么是匹配图像中特定形状(模板)的最佳方法。

我知道有几种方法,但是其中一些方法并没有取得很好的结果,而另一种方法则需要大量的处理时间,因此有人尝试了一种很好的快速方法以较短的处理时间进行匹配。

例如,这是模板...

我有一个样本,我想将样本与模板进行比较,如果样本与模板相似,则返回true,否则返回false。

注意:我尝试了轮廓匹配,级联分类和SURF,但是它们都不是很好,或者处理时间也不是很好。

最佳答案

相互匹配是一项相当困难的任务,主要是由于以下事实:不同的技术具有非常不同的特征,并且在某些类别上可以产生几乎完美的结果,而在其他类别上可以产生非常差的结果。

这就是说,我认为您永远不会得到问题的答案,至少不会有人说“使用[被引论文]中的xyx方法可以解决您的所有问题”。我会尝试为您指出一些示例,希望对您有所帮助。

模板匹配运算符:将模板与图像上的滑动窗口进行比较,如果模板的非常类似于您在图像中寻找的对象,则可以达到很好的效果,无论它多么复杂。速度可能非常快,基本上没有什么变化,因此,如果您打算进行旋转,照明发生重大变化或其他问题,那么这可能对您不起作用。 here您可以找到一些代码。请注意您使用的是哪个色彩空间,如果使用得当,不同的色彩空间可以实现非常不同的结果(例如,在人脸分析中,HSV在某些情况下可能比RGB更好)

像SIFT或SURF一样匹配的关键点:我经常使用它,效果非常好。您需要确定要使用的描述符和匹配器。 OpenCV有一些不错的示例,here可以找到一个。并不是最快的匹配对象的方法,因为提取这些描述符可能要花一些时间,如果您对所要工作的条件知之甚少,则很好:它通常在缩放,旋转和缩放方面都很健壮。只要在模板和图像上都能正确找到关键点,闪电就会发生变化。

形状匹配:当我参加一个图像分类比赛时,我能够使用一个简单的HOG描述符获取有关我的图像的非常有区别的信息时,我感到非常惊讶。定向梯度直方图是描述对象形状的强大工具,它使用边缘方向和大小来描述您的图像。它们可以快速计算(我认为OpenCV具有GPU实现),可配置(您可以决定网格的厚度和单元数,从而产生非常不同的信息)。 HOG并不是旋转不变的,从不同角度看物体可能会产生不同的直方图,但是由于不使用颜色,它们对照明变化非常有抵抗力。
HOG只是一个例子,有很多形状和轮廓描述符,但基本上它们提供的功能几乎完全相同。

直方图匹配:不是我的第一选择,如果您对物体和图像的其余部分有所了解,它会很有用。例如,如果您知道要在丛林图像中寻找粉红色的花朵(那里是唯一的粉红色的东西),则简单的颜色直方图匹配就可以了。拾取一个滑动窗口,在图像上运行它,比较直方图即可完成。非常快,非常简单,它根本不使用形状,因此无论对象多么复杂,都可以找到它。不使用形状会使其旋转时变得坚固,不过要注意照明的变化。此方法的很大局限性是,如果丛林中还有其他粉红色的东西,您将无法分辨。

混合方法:在这里,您可以充分利用上面引用的技术。如您所见,它们中的大多数在特定环境中都能很好地工作,而在其他环境中却很糟糕。您可以使用已知技术的组合来获得比零件总和要好得多的东西。我在HOG和头部姿势估计方面做了大量工作,当我们开始以密集方式而不是密集方式提取HOG时,真正的突破出现了。您需要了解自己的问题,找出您需要什么,并采用多种方法来解决该问题。通常,混合方法可以更好,更慢地工作。

希望这对您有所帮助,我认为,鉴于您提供给我们的信息,我可以为您提供更好的答案。(可能有人可以,所以我仍然是学生:))

关于c++ - 复杂形状匹配的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22356224/

相关文章:

c++ - 在 C++ 中绘图

c++ - std::list<std::shared_ptr>::erase 得到一个 SIGSEGV

c++ - Qt 将不完整的 JPEG 数据加载到 QPixMap 如何验证?

algorithm - 查找差值小于 K 的对,平均复杂度为 O(n)

algorithm - 有向无环图的拓扑排序

image - 使用 image/jpeg 编码会导致图像饱和/像素错误

c++ - 进行大乘法运算时避免 int 溢出

algorithm - 具有两个唯一列的最大行子集

python - 如何检查点云/3d 对象上的某些坐标?

algorithm - 如何判断两张照片是否相同,只是存在一些亮度差异