OpenCV学习笔记-BRIEF
鉴于上述的缺点Michael Calonder等人在论文提出BRIEF描述特征点的方法(BRIEF:Binary Robust Independent Elementary Features)。BRIEF描述子采用二进制码串(每一位非1即0)作为描述子向量,论文中考虑长度有128,256,512几种,(OpenCV里默认使用256,但是使用字节表示它们的,所以这些值分别对应于16,32,63)同时形成描述子算法的过程简单,由于采用二进制码串,匹配上采用汉明距离,(一个串变成另一个串所需要的最小替换次数)。但由于BRIEF描述子不具有方向性,大角度旋转会对匹配上有很大的影响。
BRIRF只提出了描述特征点的方法,所以特征点的检测部分必须结合其他的方法,如SIFT,SURF等,但论文中建议与Fast结合,因为会更能体现出Brirf速度快等优点。
BRIEF描述子原理简要为三个步骤,长度为N的二进制码串作为描述子(占用内存N/8):
1.以特征点P为中心,取一个S×S大小的Patch邻域;
2.在这个邻域内随机取N对点,然后对这2×N点分别做高斯平滑。定义τ测试,比较N对像素点的灰度值的大小;
3.最后把步骤2得到的N个二进制码串组成一个N维向量即可;
原理解析:
__1.关于做τ测试前,需要对随机点做高斯平滑,由于采用单个的像素灰度值做比较,会对噪声很敏感;采用高斯平滑图像,会降低噪声的影响,使得 描述子更加稳定。论文中建议采用9×9的kernal。
__2.论文中对随机取N对点采用了5中不同的方法做测试,论文中建议采用G II的方法:
1、X和Y都服从在[-S/2,S/2]范围内的均匀分布,且相互独立;
2、X和Y都服从均值为0,方差为S2/25的高斯分布,且相互独立,即X和Y都以原点为中心,进行同方差的高斯分布;
3、X服从均值为0,方差为S2/25的高斯分布,而Y服从均值为xi,方差为S2/100的高斯分布,即先确定X的高斯分布得到xi,同方法2,然后以xi为中心,进行高斯分布确定yi;
4、在引入了空间量化的不精确极坐标网格的离散位置内,随机采样,得到xi和yi;
__3.最后汉明距离的计算,直接比较两二进制码串的距离,距离定义为:其中一个串变成另一个串所需要的最少操作。因而比欧氏距离运算速度快.
import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imread('img/lena.png') gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # Initiate FAST detector star = cv.xfeatures2d.StarDetector_create() # Initiate BRIEF extractor biref = cv.xfeatures2d.BriefDescriptorExtractor_create() kp = star.detect(gray, None) kp, des = biref.compute(gray, kp) print(biref.descriptorSize()) print(des.shape) cv.namedWindow('img',cv.WINDOW_AUTOSIZE) cv.imshow('img',img) cv.waitKey(0) cv.destroyAllWindows()