【OpenCV】95 BRIEF特征描述子匹配

95 BRIEF特征描述子 匹配

代码

import cv2 as cv

box = cv.imread("../images/box.png")
box_in_sence = cv.imread("../images/box_in_scene.png")
cv.imshow("box", box)
cv.imshow("box_in_sence", box_in_sence)

# 创建ORB特征检测器
orb = cv.ORB_create()
kp1, des1 = orb.detectAndCompute(box,None)
kp2, des2 = orb.detectAndCompute(box_in_sence,None)

# 暴力匹配
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1,des2)

# 绘制匹配
result = cv.drawMatches(box, kp1, box_in_sence, kp2, matches, None)
cv.imshow("orb-match", result)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果

在这里插入图片描述

解释

得到特征点数据之后,根据BRIEF算法就可以建立描述子。选择候选特征点周围SxS大小的像素块、随机选择n对像素点。其中P(x)是图像模糊处理之后的像素值,原因在于高斯模糊可以抑制噪声影响、提供特征点稳定性,在实际代码实现中通常用均值滤波替代高斯滤波以便利用积分图方式加速计算获得更好的性能表现。常见滤波时候使用3x3~9x9之间的卷积核。滤波之后,根据上述描述子的生成条件,得到描述子。

作者论文提到n的取值通常为128、256或者512。得到二进制方式的字符串描述子之后,匹配就可以通过XOR方式矩形,计算汉明距离。ORB特征提取跟纯BRIEF特征提取相比较,BRIEF方式采用随机点方式得最终描述子、而ORB通过FAST得到特征点然后得到描述子。

keypoints, descriptors = cv.Feature2D.detectAndCompute(	image, mask[, descriptors[, useProvidedKeypoints]])
  • keypoints 检测到的关键点
  • descriptors 计算的描述符
  • image 输入图像
  • mask 指定在哪里寻找关键点的掩码(可选)。它必须是在感兴趣区域中具有非零值的8位整数矩阵。
outImg = cv.drawMatches(img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]])
  • matchColor 匹配项的颜色(线和连接的关键点)
  • singlePointColor 单个关键点(圆圈)的颜色,这意味着关键点没有匹配项。如果singlePointColor == Scalar :: all(-1),则颜色是随机生成的。
  • matchesMask Mask确定绘制哪些匹配项。如果mask为空,则绘制所有匹配项。
  • flags = DrawMatchesFlags::DEFAULT

在这里插入图片描述


所有内容均来源于贾志刚老师的知识星球——OpenCV研习社,本文为个人整理学习,已获得贾老师授权,有兴趣、有能力的可以加入贾老师的知识星球进行深入学习。
在这里插入图片描述

发布了111 篇原创文章 · 获赞 0 · 访问量 1654

猜你喜欢

转载自blog.csdn.net/liu_taiting/article/details/105008697