【发布时间】:2019-06-29 20:38:35
【问题描述】:
我正在尝试识别图像中的关键点特征,该图像是直接看我的对象时拍摄的,然后尝试将这些关键点特征与稍微倾斜的同一对象的图像进行匹配。我的目标是确定从一个图像移动到下一个图像所需的旋转,反之亦然。
我遇到的问题是关键点的匹配过程完全不准确。据我了解,这是因为我的对象颜色相当均匀、对称,而且它反射光线的方式使这个过程变得困难。
有什么方法可以改进 SIFT 或 ORB 特征匹配?
或者是否有另一种方法更适合我的给定应用程序。我对计算机视觉比较陌生,如果有任何建议,我将不胜感激。
这是我正在使用的代码。到目前为止,我一直在参考 OpenCV 文档和在线教程。
try:
surf = cv2.xfeatures2d.SURF_create(400)
except Exception:
surf = cv2.cv2.xfeatures2d.SIFT_create(400)
kp1, des1 = surf.detectAndCompute(img1, None)
kp2, des2 = surf.detectAndCompute(img2, None)
img_pts = cv2.drawKeypoints(img1, kp1, None)
plt.imshow(img_pts)
plt.show()
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)
# store all the good matches as per Lowe's ratio test.
good = []
for m, n in matches:
if m.distance < 0.7 * n.distance:
good.append(m)
match_results = cv2.drawMatches(img1, kp1, img2, kp2, good[:], None, flags=2)
plt.imshow(match_results)
plt.show()
MIN_MATCH_COUNT = 10
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)
# see https://ch.mathworks.com/help/images/examples/find-image-rotation-and-scale-using-automated-feature-matching.html for details
ss = M[0, 1]
sc = M[0, 0]
scaleRecovered = np.sqrt(ss * ss + sc * sc)
thetaRecovered = np.arctan2(ss, sc) * 180 / np.pi
print('Scale: {} , Rotation: {}'.format(scaleRecovered, thetaRecovered))
# deskew image
im_out = cv2.warpPerspective(img2, np.linalg.inv(M),
(img1.shape[1], img1.shape[0]))
plt.title('Before')
plt.imshow(img1)
plt.show()
plt.title('After')
plt.imshow(im_out)
plt.show()
plt.title('compare')
plt.imshow(img2)
plt.show()
【问题讨论】:
-
我认为你是对的,SIFT/SURF/... 不适合这项任务。它们都依赖于让关键点的周围在视角变化下看起来足够相似。如果您能够设法获得更纯净的环境光环境,您可能会获得有用的结果。
-
也许您可以尝试在不同的色彩空间中匹配图像,该色彩空间不像 BGR/RGB 那样受环境光的影响。
-
在这种光照条件下,物体的性质/颜色和视角的变化将让该算法难以提取一致的特征,甚至更难以匹配它们。问题:你能改变对象吗?人造地标(酒吧、阿兹台克人、二维码)更容易跟踪重新项目! (github.com/MikhailGordeev/QR-Code-Extractor)
-
理想情况下,我们不能修改对象,但我意识到我们可能不得不这样做。为此,我正在考虑使用 aruco 标记。颜色会随着时间和光照而变化,因此我们需要一些光照不变、比例和旋转不变的内容。该对象的安装位置也会发生变化。理想情况下,我们需要一种通用的匹配算法,在各种环境中都足够稳健。
-
本质上,问题在于您是想将更多精力用于数据采集(添加标记、更改照明)还是更复杂的算法。如果两个连续帧之间的旋转较小,您也可能获得更大的成功。
标签: opencv computer-vision sift surf homography