0
点赞
收藏
分享

微信扫一扫

OpenCV + CPP 系列(卌三)图像特征提取(Brisk)


文章目录

  • ​​一、Brisk(Binary Robust Invariant Scalable Keypoints)特征介绍​​
  • ​​效果演示​​

一、Brisk(Binary Robust Invariant Scalable Keypoints)特征介绍

BRISK特征提取描述算法全称为 Binary Robust Invariant Scalable Keypoints(二进制鲁棒不变可扩展关键点)。BRISK算法也是SIFT算法的一种改进型,主要是针对于旋转不变性、鲁棒性、运算速度等
方面做了优化,其大致流程如下:

(1)在提取特征点阶段与SIFT算法类似,同样是先构造多尺度图像金字塔,再从每一层图像组的多尺度空间中找到最大特征点(非极大值抑制);

(2)再通过亚像素插值得到最大特征点的精确坐标位置,也即把最大特征点从其它层的坐标映射到金字塔最底层的坐标位置,从而完成对最大特征点的定位。

(3)在描述特征点阶段,使用特征点邻域同心圆采样法,在每个特征点的邻域中选择一个同心圆,在这个同心圆上均匀采样,并对所有采样点进行高斯模糊以消除重复采样带来的影响,并以采样点中的短距离点对的灰度值比较结果,来构建二进制描述子。

(4)再以每个特征点的方向特征、也就是梯度来进行方向归一化,强化了BRISK特征描述子的旋转不变性。

OpenCV + CPP 系列(卌三)图像特征提取(Brisk)_opencv

头文件 ​​image_feature_all.h​​:声明类与公共函数

#pragma once
#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/xfeatures2d.hpp>  //新增引入库

using namespace cv;
using namespace std;


class ImageFeature {
public:
void brisk_demo(Mat& image, Mat& image2);

};

主函数​​main.cpp​​调用该类的公共成员函数

#include "image_feature_all.h"



int main(int argc, char** argv) {
const char* img_path = "D:\\Desktop\\match_dst.jpg";
const char* img_path2 = "D:\\Desktop\\match_raw.jpg";
Mat image = imread(img_path, IMREAD_GRAYSCALE);
Mat image2 = imread(img_path2, IMREAD_GRAYSCALE);
if (image.empty() || image2.empty()) {
cout << "图像数据为空,读取文件失败!" << endl;
}
ImageFeature imgfeature;
imgfeature.brisk_demo(image, image2);

waitKey(0);
destroyAllWindows();
return 0;
}

效果演示

void ImageFeature::brisk_demo(Mat& image, Mat& image2) {
Ptr<Feature2D> detector = BRISK::create();
vector<KeyPoint> keypoints_obj, keypoints_scens;
Mat descriptor_obj, descriptor_scens;
detector->detectAndCompute(image, Mat(), keypoints_obj, descriptor_obj);
detector->detectAndCompute(image2, Mat(), keypoints_scens, descriptor_scens);

vector<DMatch> matches;
BFMatcher matcher(NORM_L2);
matcher.match(descriptor_obj, descriptor_scens, matches, Mat());

vector<DMatch> good_matches;
double maxDist = 0, minDist = 1000;
for (size_t i = 0; i < descriptor_obj.rows; i++) {
double dist = matches[i].distance;
if (dist < minDist) { minDist = dist; }
if (dist > minDist) { maxDist = dist; }
}

for (size_t i = 0; i < descriptor_obj.rows; i++) {
if (matches[i].distance < max(2.0 * minDist, 0.02)) {
good_matches.push_back(matches[i]);
}
}


Mat resultImg;
drawMatches(
image, keypoints_obj,
image2, keypoints_scens,
good_matches, resultImg,
Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::DEFAULT
);
imshow("resultImg", resultImg);
}

OpenCV + CPP 系列(卌三)图像特征提取(Brisk)_特征点_02


举报

相关推荐

0 条评论