从ORB特征检测中发现单应性时,OpenCV的结果不令人满意

2024-10-01 00:30:33 发布

您现在位置:Python中文网/ 问答频道 /正文

尽管ORB特征匹配看起来非常可靠,而且我只对cv.findHomography进行了20次最佳匹配,但得到的多段线非常糟糕。注意,在所附图像中显示的结果中,右上角图像是视频流。因此,结果的变化是一致的。是否有一个图书馆可以用来获得更好的结果?或者我的代码中是否有重大错误

enter image description here

    # des1 & des2 are created with cv.ORB_create(10000, 1.2, nlevels=8, edgeThreshold=5)

    kp2, des2 = orb.detectAndCompute(gray, None)
    matches = bf.knnMatch(des1, des2, k=2)

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

    matches = sorted(good, key=lambda x: x.distance)
    src_pts = np.float32([kp1[m.queryIdx].pt for m in matches[:20]]).reshape(-1, 1, 2)
    dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches[:20]]).reshape(-1, 1, 2)
    M, mask = cv.findHomography(dst_pts, src_pts, cv.RANSAC, 5.0)
    matchesMask = mask.ravel().tolist()

    h = src_pts.max(0)[0][1] - src_pts.min(0)[0][1]
    w = src_pts.max(0)[0][0] - src_pts.min(0)[0][0]
    pts = np.float32([[0, 0], [0, h - 1], [w - 1, h - 1], [w - 1, 0]]).reshape(-1, 1, 2)

    dst = cv.perspectiveTransform(pts, M)

    img3 = None
    img3 = cv.drawMatchesKnn(img1, kp1, gray, kp2, good, img3, flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
    img3 = cv.polylines(img3, [np.int32(dst)], True, (0, 0, 255), 3, cv.LINE_AA)

    # Code for showing img3 would follow
    

Tags: insrcfornpcvptsdstdistance
1条回答
网友
1楼 · 发布于 2024-10-01 00:30:33

此设置可能有几个问题:

  1. 模式本身。它有重复的方块,所以在第一张和第二张图像上可能有连接不同方块的匹配。这会产生大量异常值,因此单应性无法以合理的方式进行拟合
  2. 图像质量低。较小的图像分辨率较低且有点模糊,这使得匹配更加困难,因此可能会出现更多的异常值。图像分辨率较高,仅以小比例显示,因此此点无效
  3. 特征点位于图像的一个小区域中,您可以尝试投影远离这些点的图像角点。这使得单应估计非常不稳定,使得特征点坐标中的不确定性放大几倍。即使小于1像素的抖动也会导致高达8像素的投影误差。这可能更糟,因为RANSAC阈值为5.0会导致坐标精度较低

相关问题 更多 >