【问题标题】:Good matches less than 10, images not gets stitched匹配少于 10 个,图像未拼接
【发布时间】:2021-08-05 11:14:09
【问题描述】:

我正在拼接多张图像以获得正射镶嵌图。我正在使用 SURF,BF 匹配器。检测和匹配的部分拼接代码如下:

detector = cv2.xfeatures2d.SURF_create(400)
gray1 = cv2.cvtColor(image1,cv2.COLOR_BGR2GRAY)
ret1, mask1 = cv2.threshold(gray1,1,255,cv2.THRESH_BINARY)
kp1, descriptors1 = detector.detectAndCompute(gray1,mask1)

gray2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
ret2, mask2 = cv2.threshold(gray2,1,255,cv2.THRESH_BINARY)
kp2, descriptors2 = detector.detectAndCompute(gray2,mask2)

keypoints1Im = cv2.drawKeypoints(image1, kp1, outImage = cv2.DRAW_MATCHES_FLAGS_DEFAULT, color=(0,0,255))
# util.display("KEYPOINTS",keypoints1Im)
keypoints2Im = cv2.drawKeypoints(image2, kp2, outImage = cv2.DRAW_MATCHES_FLAGS_DEFAULT, color=(0,0,255))
# util.display("KEYPOINTS",keypoints2Im)

matcher = cv2.BFMatcher()
matches = matcher.knnMatch(descriptors2,descriptors1, k=2)

good = []
for m, n in matches:
    if m.distance < 0.55 * n.distance:
        good.append(m)

print (str(len(good)) + " Matches were Found")

if len(good) <= 10:
    return image1

matches = copy.copy(good)

matchDrawing = util.drawMatches(gray2,kp2,gray1,kp1,matches)

在某些时候,我得到匹配 4 或更少。根据代码返回图像。

if len(good) <= 10:
    return image1

因此,图像在这段时间内没有被缝合,结果与预期不符。

在这段代码之后,是拼接图像的单应性计算和图像包装。以上我只关注问题部分。

知道如果匹配少于 10 个我们还能做些什么来拼接图像吗?

【问题讨论】:

    标签: python opencv image-processing computer-vision image-stitching


    【解决方案1】:

    此代码只是在图像中绘制匹配的关键点,它不会拼接图像,并且 10 个好的匹配是一个非常小的值,这就是为什么如果好的匹配小于 10,则图像被认为是不匹配的,并且返回第一张图片。您可以做的一件事是增加距离的分数以将匹配视为良好匹配,例如在网络中的许多示例中,您可以看到通常使用 0.75。尝试修改这个值,看看会发生什么。你也可以去掉检查好匹配是否超过10的部分,看看matchDrawing,看看匹配是否正确。

    【讨论】:

    • 感谢您的回答。如果我删除了那个条件if len(good) &lt;= 10,它会在缝合/包装过程时给我错误ValueError: operands could not be broadcast together with shapes (2260,7630,3) (1634,1423)
    猜你喜欢
    • 2011-03-08
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多