我正在使用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