ORB+BFMatcher 是不是适合识别重复图像(有细微的变化?)

Posted

技术标签:

【中文标题】ORB+BFMatcher 是不是适合识别重复图像(有细微的变化?)【英文标题】:is ORB+BFMatcher a good match for recognizing repetitive images (with slight variations?)ORB+BFMatcher 是否适合识别重复图像(有细微的变化?) 【发布时间】:2019-11-30 12:20:28 【问题描述】:

我需要识别带有已知值的手写数字的图像。带有数字的物理对象始终相同,但位置/比例/照明略有不同。它们的数量约为 100,大小约为 100x500 像素。

在第一遍中,代码应该“学习”可能的输入,然后在它们再次出现时识别它们(将它们分类为接近“训练”图像之一)。

我主要关注Feature Matching Python-OpenCV tutorial

首先分析输入图像,在orbTrained 列表中记住关键点和描述符:

import cv2
import collections

ORBTrained=collections.namedtuple('ORBTrained',['kp','des','img'])
orbTrained=[]

for img in trainingImgs:
    z2=preprocessImg(img)
    orb=cv2.ORB_create(nfeatures=400,patchSize=30,edgeThreshold=0)
    kp,des=orb.detectAndCompute(z2,None)
    orbTrained.append(ORBTrained(kp=kp,des=des,img=z2))
    z3=cv2.drawKeypoints(z2,kp,None,color=(0,255,0),flags=0)

第一阶段的典型结果如下所示:

然后在下一个循环中,对于每个真实输入图像,循环遍历所有训练图像以查看哪个匹配最佳:

ORBMatch=collections.namedtuple('ORBMatch',['dist','match','train'])
for img in inputImgs:
    z2=preprocessNum(img)
    orb=cv2.ORB_create(nfeatures=400,patchSize=30,edgeThreshold=0)
    kp,des=orb.detectAndCompute(z2,None)
    bf=cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck=True)
    mm=[]
    for train in orbTrained:
        m=bf.match(des,train.des)
        dist=sum([m_.distance for m_ in m])
        mm.append(ORBMatch(dist=dist,match=m,train=train))
    # sort matching images based on score
    mm.sort(key=lambda m: m.dist)
    print([m.dist for m in mm[:5]])
    best=mm[0]
    best.match.sort(key=lambda x:x.distance) # sort matches in the best match
    z3=cv2.drawMatches(z2,kp,best.train.img,best.train.kp,best.match[:50],None,flags=2)

我得到的结果是荒谬的,而且始终如一(只有当我使用像素相同的输入运行时,结果才是正确的):

有什么问题?我完全误解了该怎么做,还是我只需要调整一些参数?

【问题讨论】:

【参考方案1】:

根据论文作者(ORB 和ORB-SLAM)的说法,ORB 在“一定范围内”对旋转和缩放是不变的。可能您应该首先匹配小规模或旋转变化。

【讨论】:

图像完全没有旋转,方向没有改变。它们可能会稍微错位或垂直缩放,但不会旋转。【参考方案2】:

首先,您确定不是通过创建自己的 OCR 库来重新发明***吗?有很多free frameworks,其中一些支持使用自定义字符集进行训练。

其次,你应该明白feature matching is是什么。它会找到类似的小区域,但不知道其他特征对。它将匹配字符的相似角,而不是字符本身。您可以尝试使用更大的patchSize,使其至少覆盖数字的一半。

您可以通过使用阈值和轮廓一次仅对单个数字运行特征检测来找到字符边界,从而最大限度地减少错误对。

如果文本没有旋转,使用旋转不变特征描述符(如 ORB)不是最佳选择,请尝试旋转变体描述符,如 FAST。

【讨论】:

谢谢,我根本不是针对 OCR,整个图像(而不是单个数字)的初始标记将由人工完成。 用 FAST (和 BRISK 用于关键点-> 特征)进行了尝试,结果是一样的。无论如何,检测单个数字涉及分割和其他我想避免的。这是我需要的非常简单的“模糊”图像匹配。感谢您解释特征匹配。该地区的新手:)

以上是关于ORB+BFMatcher 是不是适合识别重复图像(有细微的变化?)的主要内容,如果未能解决你的问题,请参考以下文章

ORB-SLAM2:基于可识别特征的自主导航与地图构建

将 ORB 特征与阈值匹配

Haar Cascade 是 OpenCV 中唯一可用的图像识别技术吗

opencv ORB特征匹配

图像对齐(图像配准)方法记录

特征提取算法的综合实验(多种角度比较sift/surf/brisk/orb/akze)