我一直在玩优秀的GPUImage库,它实现了几个功能检测器:Harris,FAST,ShiTomas,Noble。但是,这些实现都不能帮助提取特征提取和匹配部分。他们只输出一组检测到的角点。
我的理解(这是shakey)是下一步是检查每个检测到的角点并从中提取特征,这将导致描述符 - 即可以使用的32或64位数索引接近其他类似点的点。
通过阅读[计算机视觉算法和应用程序,Szeliski]的第4.1章,我知道使用BestBin方法将有助于有效地找到相邻的特征以匹配等。但是,我实际上并不知道如何做到这一点,我正在寻找一些这样做的示例代码。
我发现这个项目[https://github.com/Moodstocks/sift-gpu-iphone]声称尽可能多地实现GPU中的特征提取。我也看到一些讨论表明它可能会产生错误的描述符。
在任何情况下,该代码都不会继续显示提取的功能如何与另一个图像最佳匹配。
我在尝试查找图像中的对象时的用例。
是否有人有任何代码可以执行此操作,或者至少是一个显示提取的功能如何匹配的良好实现?我希望不必重写整套算法。
感谢, 抢。
答案 0 :(得分:2)
首先,您需要小心SIFT实施,因为the SIFT algorithm is patented和这些专利的所有者需要许可费用才能使用。我故意避免使用该算法作为结果。
找到在GPU上运行良好的良好特征检测和提取方法有点棘手。 GPUImage中的Harris,Shi-Tomasi和Noble角点探测器都是相同基本操作的衍生物,可能不是识别特征的最快方法。
正如您所知,我的FAST角落探测器尚未运行。我的想法是使用基于局部二进制模式的查找纹理(为什么我首先构建该过滤器以测试该概念),并且返回它是否是角点。这应该比哈里斯等角落探测器快得多。我还需要完成直方图金字塔点提取器,以便在GPU上的极慢循环中完成特征提取。
对于FAST角点探测器使用查找纹理的灵感来自Jaco Cronje的this paper关于他们称之为BFROST的技术。除了使用快速,基于纹理的特征检测查找之外,本文还提出使用二进制模式作为特征的快速描述符。除此之外还有一点点,但总的来说,这就是他们的建议。
特征匹配由汉明距离完成,但是虽然有快速的CPU端和CUDA指令用于计算,但OpenGL ES没有。那里可能需要采用不同的方法。同样地,我没有一个很好的解决方案来找到超出CPU端的功能组之间的最佳匹配,但我还没有想到这么远。
我的主要目标是在框架中拥有它(这是我构建它的原因之一),但我最近还没有时间研究这个问题。以上至少是我对如何处理这个问题的想法,但我警告你,这不容易实现。
答案 1 :(得分:1)
对于物体识别/这几天(截至几周前)最好使用张量流/卷积神经网络。 Apple最近添加了一些金属样本代码。 https://developer.apple.com/library/content/samplecode/MetalImageRecognition/Introduction/Intro.html#//apple_ref/doc/uid/TP40017385
要在图像中进行特征检测 - 我提请您注意开箱即用 - 使用opencv的KAZE / AKAZE算法。 http://www.robesafe.com/personal/pablo.alcantarilla/kaze.html
对于ios,我将Akaze类与另一个拼接样本粘在一起进行说明。
detector = cv::AKAZE::create();
detector->detect(mat, keypoints); // this will find the keypoints
cv::drawKeypoints(mat, keypoints, mat);
// this is the pseudo SIFT descriptor
.. [255] = {
pt = (x = 645.707153, y = 56.4605064)
size = 4.80000019
angle = 0
response = 0.00223364262
octave = 0
class_id = 0 }