opencv ORB特征提取+匹配

一.ORB特征组成

//特征就是角点
//ORB特征具有速度快的优点,可以用于实时提取。
//ORB:FAST关键点+BRIEF 描述子
//FAST是一种角点,主要是检测局部像素灰度变化明显的地方,苏地块。FAST思想:如果一个像素与它邻域的像素差别较大,那他可能是角点。
//FAST提取步骤:

  1. 在图像中选取像素 p,假设它的亮度为 Ip。
  2. 设置一个阈值 T(比如 Ip 的 20%)。
  3. 以像素 p 为中心, 选取半径为 3 的圆上的 16 个像素点
  4. 选取的圆上,有连续N个点的灰度值大于Ip+T或小于Ip-T,则p可以被认为是关键点
    (N=9,11,12)
    //FAST提取角点过多,对原始的FAST角点计算Harris响应值,提取前N个最大响应值的角点。
    //FAST不具有方向信息。由于它固定取半径为3的圆,有尺度问题;
    1.scale:图像金字塔,对每一层检测角点
    2.rorate:灰度质心法,用圆的质心与几何中心得到向量即为关键点的方向。

//BRIEF 描述子:描述关键点周围像素的信息,(外观相似的特征应该有相似的描述子),采用二进制编码,取周围128个像素,当像素灰度值大于临近像素则为1,反之为0.由于FAST的改进,秒速自有有scale,rorate不变性.

//两种匹配模式:暴力匹配,快速最近邻匹配。
1.暴力匹配:测量描述子之间的距离(通常采用汉明距离和欧氏距离),汉明距离是采用BRIEF二进制描述子进行匹配,浮点型描述子用欧式距离匹配。
2.暴力匹配产生的特征点较多,采用FLANN方法可以提高质量,降低计算量。

//读取图像,加载ORB模块

//读取图像
	Mat img_1 = imread("C:\\Users\\Administrator\\Pictures\\1.png");
	Mat img_2 = imread("C:\\Users\\Administrator\\Pictures\\2.png");
	std::vector<KeyPoint> keypoints_1, keypoints_2;
	Mat descriptors_1, descriptors_2;
	//加载ORD模块
	Ptr<ORB> orb = ORB::create();

//FAST关键点

	//1.检测Oriented Fast焦点位置
	orb->detect(img_1, keypoints_1);
	orb->detect(img_2, keypoints_2);

//BRIEF描述子

//2.根据焦点位置计算BRIEF描述子
	orb->compute(img_1, keypoints_1, descriptors_1);
	orb->compute(img_2, keypoints_2, descriptors_2);

//绘制角点

Mat outimg1;
	//绘制FAST关键点
	drawKeypoints(img_1, keypoints_1, outimg1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
	imshow("ORB特征点", outimg1);

opencv ORB特征提取+匹配_第1张图片
//使用汉明距离对两幅图的特征点进行匹配

//3.对两幅图像中的BRIEF描述子进行匹配,使用Hamming距离
	vector<DMatch> matches;
	//加载汉明距离
	BFMatcher matcher(NORM_HAMMING);
	//两幅图BRIEF匹配
	matcher.match(descriptors_1, descriptors_2, matches);

///由于暴力匹配产生的匹配点较多,所以建立筛选条件

//3.对两幅图像中的BRIEF描述子进行匹配,使用Hamming距离
	vector<DMatch> matches;
	//加载汉明距离
	BFMatcher matcher(NORM_HAMMING);
	//两幅图BRIEF匹配
	matcher.match(descriptors_1, descriptors_2, matches);

//对比两次筛选

	//5.绘制匹配结果
	Mat img_match;
	Mat img_goodmatch;
	drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_match);
	drawMatches(img_1, keypoints_1, img_2, keypoints_2, good_matches, img_goodmatch);
	imshow("所有匹配点对", img_match);
	imshow("优化后匹配点对",img_goodmatch);
	waitKey(0);
	return 1;


你可能感兴趣的:(opencv ORB特征提取+匹配)