我正在使用python的opencv版本3.2.0和opencv contrib来检测硬盘盒中LED状态的小项目 . 磁盘盒中装满了看起来相同的磁盘,因此图像具有很高的空间频率 .

为了检测描述符,我使用SIFT算法并将图像的描述符与给定模板的描述符进行匹配,我使用了cv2的2个不同函数,并且都失败了(即发现不匹配):

FLANN:

if obj.descriptors.dtype == 'uint8':
    # ORB creates binary descriptors, so we use LSH indexer
    FLANN_INDEX_TYPE = 6
elif obj.descriptors.dtype == 'float32':
    # SIFT creates float descriptors, so use KD-Tree indexer
    FLANN_INDEX_TYPE = 0


index_params = dict(algorithm=FLANN_INDEX_TYPE,
               table_number=6,  # 12
               key_size=12,  # 20
               multi_probe_level=1) # 2

search_params = dict(checks=50)  # or pass empty dictionary

flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(obj.descriptors, img.descriptors, k=2)

BFMATCHER:

bf = cv2.BFMatcher()
matches = bf.knnMatch(obj.descriptors, img.descriptors, k=2)

然后使用这个循环,根据距离消除不匹配:

for m, n in matches:
    if m.distance < 0.75 * n.distance:
        obj_m.append(obj.keypoints[m.queryIdx].pt)
        img_m.append(img.keypoints[m.trainIdx].pt)

为了改善高空间频率对象的匹配,您建议做些什么?

提前谢谢,Regev