python - ORB Detector 如何与不同的匹配器(FlannBased、BruteForce、...)一起工作?
问题描述
我正在尝试实现一个程序来检测和跟踪玩家,并且我一直在使用这些匹配器测试 ORB 检测器:FlannBased、BFMatcher。我什至用 SIFT Detector 试过这些匹配器,但我得到的结果都是一样的。这张图片基本上显示了我得到的内容: ORB With FlannBased Matcher
如您所见,这两个图像之间的匹配主要集中在舞台的结构上,而不是在球员身上。不知道有没有办法让探测器只关注人。我愿意接受建议!!另外,我想知道图像质量是否有某种限制
这是我用来获取上图的代码
#FLANN based Matcher With ORB Descriptors
import numpy as np
import cv2
from matplotlib import pyplot as plt
img1 = cv2.imread('Imag-Prueba.png',0) # queryImage
img2 = cv2.imread('Imag-Prueba-2.jpg',0) # trainImage
# Initiate ORB detector
orb = cv2.ORB_create(nfeatures=10000, scoreType=cv2.ORB_FAST_SCORE)
# find the keypoints and descriptors with ORB
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
# FLANN parameters
FLANN_INDEX_LSH = 6
index_params= dict(algorithm = FLANN_INDEX_LSH,
table_number = 12, # 12
key_size = 12, # 20
multi_probe_level = 2) #2
search_params = dict(checks=100) # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1, des2, k=2)
# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]
# ratio test as per Lowe's paper
for i, m_n in enumerate(matches):
if len(m_n) != 2:
continue
elif m_n[0].distance < 0.80*m_n[1].distance:
matchesMask[i]=[1,0]
draw_params = dict(matchColor = (0,255,0),
singlePointColor = (255,0,0),
matchesMask = matchesMask,
flags = 0)
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)
cv2.imwrite('ORB-FLANNMatcher-0.8.jpg',img3)
解决方案
推荐阅读
- r - R比较纬度并总结每行的结果
- shopify - Shopify 的 `min/maxVariantPrice` 过滤无法按预期工作
- java - Android 内存:如何在不使用 Profiler 的情况下检查内存?
- android - 如何在 Android MVVM 应用程序中建模跨片段事务(正在进行的过程)?
- python - wtforms floatfield 舍入到小数点后 2 位
- powershell - 如何根据重复的 .jpeg 文件(具有相同的 .BaseName)在过去 24 小时内是否发生更改来删除目录中的所有 .webp 文件?
- flutter - Flutter 有除了 material 和 cupertino 之外的小部件吗?
- javascript - 在 foreach 循环中单击一个面板时折叠其他面板
- ruby - 理解 Ruby 中的“.with”
- php - 在 WooCommerce 的地址字段中需要文本和数字