几个月来,我一直在使用 ORB 功能检测。我发现 ORB 本身没有问题,尽管作者谈到微调一些参数以使其性能更好。
https://github.com/wher0001/Image-Capture-and-Processing
当我使用您的图片和标准距离排序运行 ORB 时,我得到以下图片,显然有一些不匹配的图片。
ORB 匹配 - 标准排序
我总是将 nfeatures 的数量设置为高(5000)并从那里开始。
它默认为 500,这是我用于这些图片的值。
从那里你可以改变它的排序方式,就像我在这里展示的那样,可以减少 nfeatures 数量,甚至只使用前 X 个匹配项。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1 = cv2.imread("c:/Users/rwheatley/Desktop/pS8zi.jpg")
img2 = cv2.imread("c:/Users/rwheatley/Desktop/vertrk.jpg")
grey1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
grey2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# Initiate ORB detector
orb = cv2.ORB_create(nfeatures=5000)
# find the keypoints and descriptors with ORB
kp1, des1 = orb.detectAndCompute(grey1,None)
kp2, des2 = orb.detectAndCompute(grey2,None)
# create BFMatcher object
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# Match descriptors.
matches = bf.match(des1,des2)
# Sort them in the order of their distance.
matches = sorted(matches, key = lambda x:x.distance)
# Draw first 10 matches.
img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches,None,flags=2)
print(len(matches))
plt.imshow(img3),plt.show()
然后,我切换到了几种不同的方法,这些方法在使用(请原谅这个词)蹩脚的戴尔网络摄像头时很有用。
ORB 与 knnMatching
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1 = cv2.imread("c:/Users/rwheatley/Desktop/pS8zi.jpg")
img2 = cv2.imread("c:/Users/rwheatley/Desktop/vertrk.jpg")
grey1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
grey2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# Initiate ORB detector
orb = cv2.ORB_create(nfeatures=5000)
# find the keypoints and descriptors with ORB
kp1, des1 = orb.detectAndCompute(grey1,None)
kp2, des2 = orb.detectAndCompute(grey2,None)
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
# Apply ratio test
good = []
for m,n in matches:
if m.distance < 0.75*n.distance:
good.append([m])
# cv2.drawMatchesKnn expects list of lists as matches.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=2)
print(len(matches))
plt.imshow(img3),plt.show()
即使在最新版本的 OpenCV 中,目前也有第三种类型的匹配被破坏。基于 Flann 的匹配。解决此问题后,我建议您切换到该问题或仅对图像应用一些智能。
例如,如果您将陀螺仪添加到系统中,您可以在通过缩小搜索窗口创建的窗口之外丢弃匹配项。