c# – 使用OpenCV检测来自一个图像的对象是否在另一个图像中

前端之家收集整理的这篇文章主要介绍了c# – 使用OpenCV检测来自一个图像的对象是否在另一个图像中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个包含对象的示例图像,如下图中的耳环:

http://imgur.com/luj2Z

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

http://imgur.com/yBWgc

所以我需要为每个图像生成一个分数,其中最高分对应于最可能包含目标对象的图像.现在,在这种情况下,我有以下条件/约束来处理/周围:

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

2)样本图像可能与候选图像处于不同的分辨率,角度和距离.

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

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

5)我可以手动操作样本图像,例如概述我想要检测的对象;候选图像不能手动操作,因为太多了.

6)我根本没有OpenCV或计算机视觉的真实背景,所以我从头开始.

我最初的想法是首先在样本图像中围绕对象绘制粗略轮廓.然后,我可以识别候选图像中的对象和角落的角落.我可以分析每个角落周围的像素,看它们是否看起来相似,然后按每个角落的最大相似度得分的总和进行排名.我也不确定如何量化类似的像素.我想只是他们的RGB值的欧几里德距离?

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

所以我有几个问题:

A)这种思路一般是否有意义或是否有我遗漏的东西?

B)我应该调查OpenCV的哪些特定算法?我知道有多个角点检测算法,但我只需要一个,如果差异都在边缘上进行优化,那么我最好用.

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

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

解决方法

查看 SURF功能,它们是openCV的一部分.这里的想法是你有一个算法在两个图像中找到“兴趣点”.您还有一个算法,用于计算每个兴趣点周围的图像块的描述符.通常,该描述符捕获补丁中边缘方向的分布.然后你试着找到点对应,我.即对于图像A中的每个兴趣点,尝试在图像B中找到对应的兴趣点.这通过比较描述符并寻找最接近的匹配来实现.然后,如果您有一组通过某种几何变换相关的对应关系,则可以进行检测.

当然,这是一个非常高级别的解释.魔鬼在细节中,对于那些你应该阅读一些文章.从David Lowe开始Distinctive image features from scale-invariant keypoints,然后阅读有关SURF的论文.

另外,请考虑将此问题移至Signal and Image Processing Stack Exchange

猜你在找的C#相关文章