opencv - 如何更准确地比较两张图像之间的特征?
问题描述
我已经使用 SIFT 和 ORB 开发了两种方法,但在我看来,这些点并没有正确对应。我是错误地使用了这些功能还是需要不同的东西?
orb = cv2.ORB_create()
keypoints_X, descriptor_X = orb.detectAndCompute(car1_gray, None)
keypoints_y, descriptor_y = orb.detectAndCompute(car2_gray, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck = True)
matches = bf.match(descriptor_X, descriptor_y)
matches = sorted(matches, key = lambda x: x.distance)
result = cv2.drawMatches(car1_gray, keypoints_X, car2_gray, keypoints_y, matches[:10], car2_gray, flags = 2)
sift = cv2.SIFT_create()
keypoints_X, descriptor_X = sift.detectAndCompute(car1_gray, None)
keypoints_y, descriptor_y = sift.detectAndCompute(car2_gray, None)
bf = cv2.BFMatcher()
matches = bf.knnMatch(descriptor_X, descriptor_y, k=2)
bom = []
for m,n in matches:
if m.distance < 0.75*n.distance:
bom.append([m])
result = cv2.drawMatchesKnn(car1_gray, keypoints_X, car2_gray, keypoints_y, bom, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
解决方案
看看SuperGlue,基于图神经网络的特征匹配。虽然,他们不提供训练代码,但有两种用于室内、室外的预训练模型。链接,
https://github.com/magicleap/SuperGluePretrainedNetwork
https://psarlin.com/superglue/
推荐阅读
- interface - 带 Dart/Flutter 的雨伞导入
- html - 使用 flex 时在 div 上滚动而不是整个页面
- javascript - Gulp-Sourcemaps:Chrome DevTools 错误地引用了已编译 js 的源代码
- ruby - 正则表达式模式查看字符串是否包含范围内的数字
- c# - CRUD Edit 无法编辑主键
- ruby-on-rails - content_for 与片段缓存结合使用的解决方法
- javascript - 如何从标签顺序中删除 Bing 地图(和所有子控件)
- python - 如何管理查询中的并发性?
- android - 在 sqlite 中构建视图时合并两个字符串
- macos - Homebrew 软件包安装与 homebrew 安装的 keg-only 库?怎么做?