cv2 SIFT +蛮力匹配效果不佳

时间:2018-06-19 21:39:19

标签: python opencv image-processing feature-detection sift

因此,我尝试使用SIFT将热图像与rgb图像叠加,以匹配特征和单应性,以便以后可以对其进行叠加。我编写的代码可以处理大约50%的热/ rgb集,但是很多这样的集却产生了可怕的结果。我认为单应性很好,但是因为比赛距离遥远,所以无法使用。我将附加一些代码,有关如何调整它的任何建议都将是很棒的,因为我已经花了很长时间尝试自己解决这个问题。谢谢!

MIN_MATCH_COUNT = 10
sift = cv2.xfeatures2d.SIFT_create(sigma=1.6, contrastThreshold=0.04,edgeThreshold = 15)

kp1, des1 = sift.detectAndCompute(rgb, None)
kp2, des2 = sift.detectAndCompute(thermal, None)

bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
good = []
for m, n in matches:
    if m.distance < 0.8 * n.distance:
        good.append(m)

good = sorted(good, key=lambda x: x.distance)
img3 = cv2.drawMatches(rgb, kp1, thermal, kp2, good, None, flags=2)

给出以下内容 SIFT features matches with brute force matcher 然后在找到的匹配项上使用RANSAC进行单应性

    if len(good) > MIN_MATCH_COUNT:
    src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
    dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)

    M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0, maxIters=1000)
    matchesMask = mask.ravel().tolist()

    h, w, c = rgb.shape
    pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)
    dst = cv2.perspectiveTransform(pts, M)

    thermal = cv2.polylines(thermal, [np.int32(dst)], True, 255, 3, cv2.LINE_AA) # draw lines around as a box
    draw_params = dict(matchColor=(0, 255, 0),  # draw matches in green color
                   singlePointColor=None,
                   matchesMask=matchesMask,  # draw only inliers
                   flags=2)

    img3 = cv2.drawMatches(rgb, kp1, thermal, kp2, good, None, **draw_params)

导致此 Post homography matching features 就像我说的,我认为这是失败的,因为BFMatcher找不到正确的匹配项,但我不确定为什么。再次感谢所有帮助!我尝试过使用orb检测器,将rgb图像转换为灰度图像,然后将图像预贴片成相似的大小,但仍然得到不好的结果。

这里是一个工作正常的rgb-thermal对的示例,以演示我正在尝试做的事情。 Here is an example of a working rgb-thermal pair

1 个答案:

答案 0 :(得分:2)

图像的问题在于,与自然图像相比,图像是如此简单(无颜色,纹理上没有重大差异等),您无法可靠地使用SIFT和其他考虑了普通照片的技术。您的大多数错误匹配实际上都是好匹配,因为这些匹配在本地看起来彼此相似(在获得描述符之后)。

我的建议是使用结构信息来查找与图像匹配的替代方案,或向图像添加信息(例如,使用高度彩虹色图,因为您的图像可以看作凹凸贴图;使用距离变换+色图也可能有效,或者使用两个提到的+边缘检测作为非常奇怪但异构的彩色图像的3个通道),并查看SIFT的行为是否不同。