改进orb提取算法,根据图像灰度信息计算出一 种自适应提取阈值,若此阈值提取的特征点数目不满足要求,则降低阈值至 T/2,直到提取的特征点数目 达到要求。给出源码和头文件
时间: 2024-02-12 20:07:36 浏览: 104
以下是一个基于ORB算法的特征点提取器,其中使用了自适应的阈值计算方法,可以根据图像灰度信息动态调整提取阈值,确保提取到足够的特征点。
```
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
void ORB_ADAPTIVE(Mat& img, vector<KeyPoint>& keypoints, int min_points, int max_points, int max_iterations)
{
//自适应提取阈值的初始值
int threshold = 100;
//循环迭代,直到满足特征点数目的要求或者迭代次数达到上限
for (int i = 0; i < max_iterations; i++) {
//使用当前阈值提取ORB特征点
Ptr<ORB> orb = ORB::create(threshold);
orb->detect(img, keypoints);
//如果提取的特征点数目在要求范围内,则退出循环
if (keypoints.size() >= min_points && keypoints.size() <= max_points) {
break;
}
//如果提取的特征点数目不足,则将阈值减半
if (keypoints.size() < min_points) {
threshold /= 2;
}
//如果提取的特征点数目过多,则将阈值加倍
else if (keypoints.size() > max_points) {
threshold *= 2;
}
}
}
int main()
{
//读取图像
Mat img = imread("test.jpg");
//定义特征点向量
vector<KeyPoint> keypoints;
//自适应提取ORB特征点
ORB_ADAPTIVE(img, keypoints, 100, 500, 10);
//在图像上绘制特征点
Mat img_keypoints;
drawKeypoints(img, keypoints, img_keypoints);
//显示图像
imshow("Keypoints", img_keypoints);
waitKey(0);
return 0;
}
```
注意,以上代码中使用的是OpenCV的ORB特征点提取器,需要包含头文件`#include "opencv2/features2d.hpp"`。
阅读全文