提取特征点的流程
1.关键点的提取
用FAST算法提取出FSAT特征点,
2.关键点的描述
ORB选择用BRIEF作为特征描述方法,
代码流程:
1.入读图片文件
2.初始化
3.检测FAST特征点 detector->detect()
4.根据FAST特征点计算BRIEF描述子 descriptor->compute()
5.绘制出特征点
6.输出特征点坐标
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include "opencv2/imgcodecs/legacy/constants_c.h"
#include <opencv2/highgui/highgui.hpp>
#include <chrono>
using namespace std;
using namespace cv;
int main()
{
//-- 读取图像
Mat img_1 = imread("F:/杂七杂八/img/11.jpg", CV_LOAD_IMAGE_COLOR);
if (img_1.empty()) {
printf("could not load image...\n");
return -1;
}
//-- 初始化
std::vector<KeyPoint> keypoints_1;
Mat descriptors_1;
Ptr<FeatureDetector> detector = ORB::create();
Ptr<DescriptorExtractor> descriptor = ORB::create();
//-- 第一步:检测 Oriented FAST 角点位置
detector->detect(img_1, keypoints_1);
//-- 第二步:根据角点位置计算 BRIEF 描述子
descriptor->compute(img_1, keypoints_1, descriptors_1);
Mat outimg1;
drawKeypoints(img_1, keypoints_1, outimg1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
imshow("ORB特征点img1", outimg1);
//输出img1的特征点坐标
for (int i = 0; i < keypoints_1.size(); i++)
{
cout << "img1第" << i + 1 << "个特征点的坐标:";
cout << "x:" << keypoints_1.at(i).pt.x << " ";
cout << "y:" << keypoints_1.at(i).pt.y << endl;
}
waitKey(0);
return 0;
}
结果: