Wes*_*sey 6 c# python opencv image-processing computer-vision
我有一个包含对象的示例图像,如下图中的耳环:
然后,我有一个大的候选图像集,我需要确定哪一个最有可能包含该对象,例如:
所以我需要为每个图像生成一个分数,其中最高分对应于最可能包含目标对象的图像.现在,在这种情况下,我有以下条件/约束来处理/周围:
1)我可以在不同的角度获得多个样本图像.
2)样本图像可能与候选图像处于不同的分辨率,角度和距离.
3)有很多候选图像(> 10,000),所以它必须相当快.
4)我愿意为速度牺牲一些精度,所以如果它意味着我们必须搜索前100名而不是前10名,这很好,可以手动完成.
5)我可以手动操作样本图像,例如概述我想要检测的对象; 候选图像不能手动操作,因为太多了.
6)我根本没有OpenCV或计算机视觉的真实背景,所以我从头开始.
我最初的想法是首先在样本图像中围绕对象绘制粗略轮廓.然后,我可以识别候选图像中的对象和角落的角落.我可以分析每个角落周围的像素,看它们是否看起来相似,然后按每个角落的最大相似度得分的总和进行排名.我也不确定如何量化类似的像素.我想只是他们的RGB值的欧几里德距离?
问题在于它忽略了对象的中心.在上面的例子中,如果耳环的角落都在金框附近,那么它就不会考虑耳环内的红色,绿色和蓝色宝石.我想我可以通过查看所有角点并通过沿着它们之间的线采样某些点来确定相似性来改善这一点.
所以我有几个问题:
A)这种思路一般是否有意义或是否有我遗漏的东西?
B)我应该调查OpenCV的哪些特定算法?我知道有多个角点检测算法,但我只需要一个,如果差异都在边缘上进行优化,那么我最好用.
C)使用算法的任何示例代码有助于我的理解?
我的语言选择是Python或C#.
幸运的是,来自OpenCV的那些人为你做了这件事.检入您的samples文件夹"opencv\samples\cpp\matching_to_many_images.cpp".编译并尝试使用默认图像.
该算法可以很容易地适应,使其更快或更精确.
主要地,对象识别算法分为两部分:关键点检测和描述以及对象匹配.对于他们两个,有许多算法/变体,你可以直接进入OpenCV.
检测/描述可以通过以下方式完成:SIFT/SURF/ORB/GFTT/STAR/FAST等.
对于匹配,你有:暴力,汉明等(某些方法特定于给定的检测算法)
提示开始:
裁剪原始图像,使有趣的对象尽可能多地覆盖图像区域.用它作为训练.
SIFT是最准确和最懒的描述符.FAST是精确度和准确度的完美结合.GFTT陈旧且非常不可靠.ORB是OPENCV新增的,在速度和准确性方面非常有前途.
因此,您可以通过反复试验找到最适合您的组合.
有关每个实现的详细信息,您应该阅读原始论文/教程.谷歌学者是一个好的开始
查看SURF功能,它是 openCV 的一部分。这里的想法是,您有一个算法可以在两个图像中查找“兴趣点”。您还有一个算法用于计算每个兴趣点周围图像块的描述符。通常,该描述符捕获块中边缘方向的分布。然后尝试找到点对应关系,即对于图像 A 中的每个兴趣点,尝试在图像 B 中找到相应的兴趣点。这是通过比较描述符并寻找最接近的匹配来完成的。然后,如果您有一组通过某种几何变换相关的对应关系,那么您就进行了检测。
当然,这是一个非常高层次的解释。细节决定成败,对于那些你应该阅读一些论文。从 David Lowe 的《来自尺度不变关键点的独特图像特征》开始,然后阅读有关 SURF 的论文。
另外,考虑将此问题移至Signal and Image Processing Stack Exchange
| 归档时间: |
|
| 查看次数: |
7497 次 |
| 最近记录: |