c++ 写让orb提取到的关键点均匀分布的代码
时间: 2024-01-22 10:21:17 浏览: 17
要让ORB提取到的关键点均匀分布,可以使用均匀采样的方法。具体实现可以按照以下步骤进行:
1. 获取ORB提取到的所有关键点,保存在一个vector中。
2. 计算当前图像中的关键点数目。
3. 设置采样的间隔,可以根据关键点数量来调整间隔,使得采样后的点数大约为一个固定值。
4. 遍历所有关键点,将每个间隔内的第一个点加入到最终的关键点vector中。
5. 返回最终的关键点vector。
下面是示例代码:
```
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
vector<KeyPoint> uniformSampling(vector<KeyPoint>& keypoints, int maxKeypoints)
{
vector<KeyPoint> newKeypoints;
int numKeypoints = keypoints.size();
if (numKeypoints <= maxKeypoints) {
return keypoints;
}
int interval = numKeypoints / maxKeypoints;
for (int i = 0; i < numKeypoints; i += interval) {
newKeypoints.push_back(keypoints[i]);
}
return newKeypoints;
}
int main()
{
Mat image = imread("test.jpg", IMREAD_GRAYSCALE);
ORB orb(500, 1.2f, 8, 31, 0, 2, ORB::HARRIS_SCORE, 31);
vector<KeyPoint> keypoints;
orb.detect(image, keypoints);
vector<KeyPoint> newKeypoints = uniformSampling(keypoints, 50);
Mat imageKeypoints;
drawKeypoints(image, newKeypoints, imageKeypoints);
imshow("ORB keypoints", imageKeypoints);
waitKey(0);
return 0;
}
```
在这个示例代码中,我们使用了ORB算法提取了图像中的关键点,并将它们进行了均匀采样,最终只保留了50个关键点。可以根据需要调整参数来控制采样的数量和间隔。