gpt4 book ai didi

c# - 使用 OpenCV 检测一幅图像中的对象是否在另一幅图像中

转载 作者:太空狗 更新时间:2023-10-29 22:16:49 25 4
gpt4 key购买 nike

我有一个示例图像,其中包含一个对象,例如下图中的耳环:

http://imgur.com/luj2Z

然后我有一大组候选图像,我需要确定哪一个最有可能包含该对象,例如:

http://imgur.com/yBWgc

所以我需要为每张图片生成一个分数,其中最高分数对应于最有可能包含目标对象的图片。现在,在这种情况下,我有以下条件/约束可以使用/解决:

1) 我可以获得多个不同角度的样本图像。

2) 样本图像可能与候选图像具有不同的分辨率、角度和距离。

3) 有很多候选图像(> 10,000),因此它必须相当快。

4) 我愿意为速度牺牲一些精度,所以如果这意味着我们必须搜索前 100 名而不是前 10 名,那很好,可以手动完成。

5) 我可以手动操作示例图像,例如勾勒出我希望检测的对象;候选图像太多,无法手动操作。

6) 我根本没有 OpenCV 或计算机视觉方面的真正背景,所以我在这里从头开始。

我最初的想法是先在示例图像中的对象周围绘制一个粗略的轮廓。然后,我可以识别对象中的角点和候选图像中的角点。我可以分析每个角周围的像素,看看它们看起来是否相似,然后根据每个角的最大相似性分数的总和进行排名。我也不确定如何量化相似像素。我猜只是它们 RGB 值的欧氏距离?

问题在于它忽略了对象的中心。在上面的例子中,如果耳环的角都在金框附近,那么就不会考虑耳环里面的红绿蓝 gem 了。我想我可以通过查看所有角对并通过沿它们之间的线采样一些点来确定相似性来改进这一点。

所以我有几个问题:

A) 这种思路在一般情况下是否有意义,或者我是否遗漏了什么?

B) 我应该研究使用 OpenCV 中的哪些特定算法?我知道有多种角点检测算法,但我只需要一种,如果差异都在边际上进行优化,那么我可以选择最快的算法。

C) 是否有任何使用有助于我理解的算法的示例代码?

我的语言选择是 Python 或 C#。

最佳答案

幸运的是,来自 OpenCV 的好心人刚刚为您做了这件事。检查您的示例文件夹“opencv\samples\cpp\matching_to_many_images.cpp”。编译并尝试使用默认图像。

该算法可以很容易地进行调整,以使其更快或更精确。

对象识别算法主要分为两部分:关键点检测和描述以及对象匹配。对于它们都有许多算法/变体,您可以直接在 OpenCV 中使用。

可以通过以下方式进行检测/描述:SIFT/SURF/ORB/GFTT/STAR/FAST 等。

对于匹配,您有:蛮力、汉明等(某些方法特定于给定的检测算法)

开始的提示:

  • 裁剪原始图像,使感兴趣的对象尽可能多地覆盖图像区域。将其用作训练。

  • SIFT 是最准确和最懒惰的描述符。 FAST 是精密度和准确度的良好结合。 GFTT 很旧而且很不可靠。 ORB 是新添加到 OPENCV 中的,无论是在速度还是精度方面都非常有前途。

  • 结果取决于另一幅图像中物体的姿势。如果调整大小、旋转、挤压、部分覆盖等,请尝试 SIFT。如果它是一个简单的任务(即它以几乎相同的大小/旋转/等出现,大多数描述符都能很好地应对)
  • ORB 可能还没有出现在 OpenCV 版本中。尝试从 openCV 主干下载最新的并编译它 https://code.ros.org/svn/opencv/trunk

因此,您可以通过反复试验找到最适合您的组合。

对于每个实现的细节,您应该阅读原始论文/教程。谷歌学者是一个好的开始

关于c# - 使用 OpenCV 检测一幅图像中的对象是否在另一幅图像中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7881133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com