gpt4 book ai didi

opencv - 计算非关键点的 SURF/SIFT 描述符

转载 作者:太空宇宙 更新时间:2023-11-03 21:45:47 26 4
gpt4 key购买 nike

实际上,我正在尝试将从图像中提取的关键点列表与从另一图像中提取的关键点列表进行匹配。我尝试使用 SURF/SIFT 来检测关键点,但就从每张图像检测到的关键点的准确性而言,结果不如预期。我想过不使用关键点检测器,只使用连接区域的点,然后使用 SIFT/SUFT 计算这些点的描述符,但大多数时候调用计算方法会清空关键点列表。

下面的代码示例:

int minHessian = 100;
SurfFeatureDetector detector(minHessian);
Mat descriptors_object;
SurfDescriptorExtractor extractor;
detector.detect( img_object, keypoints_object);
extractor.compute( img_object, keypoints_object,descriptors_object );
for (int index = 0; index < listOfObjectsExtracted.size(); index ++)
{
Mat partOfImageScene = listOfObjectsExtracted[index];
vector<Point2f> listOfContourPoints = convertPointsToPoints2f(realContoursOfRects[index]);
vector<KeyPoint> keypoints_scene;
KeyPoint::convert(listOfContourPoints, keypoints_scene, 100, 1000);
//detector.detect( partOfImageScene, keypoints_scene );
if (keypoints_scene.size() > 0)
{
//-- Step 2: Calculate descriptors (feature vectors)
Mat descriptors_scene;
extractor.compute( partOfImageScene, keypoints_scene, descriptors_scene );
//Logic of matching between descriptors_scene and descriptors_object
}
}

因此,在步骤 2 中调用 compute 之后,keypoints_scene 大部分时间都变成了空的。我知道他们在 OpenCV 文档中陈述了以下内容:

Note that the method can modify the keypoints vector by removing the keypoints such that a descriptor for them is not defined (usually these are the keypoints near image border). The method makes sure that the ouptut keypoints and descriptors are consistent with each other (so that the number of keypoints is equal to the descriptors row count).

但无论如何要获得更好的结果?我的意思是对我选择的所有点都有描述符?我是否违反了关键点的使用方式?我应该尝试使用不同于 SIFT/SURF 的特征提取器来获得我想要的吗?或者预计在 OpenCV 中实现的每个特征检测器都会有同样的问题?

已编辑:

我正在使用方法 KeyPoint::convert 将点转换为关键点,我将 100 作为大小传递,将 1000 作为响应传递。您可以在下面看到该方法的详细信息:

//! converts vector of points to the vector of keypoints, where each keypoint is assigned the same size and the same orientation
static void convert(const vector<Point2f>& points2f,
CV_OUT vector<KeyPoint>& keypoints,
float size=1, float response=1, int octave=0, int class_id=-1);

作为尺寸,100 对我来说似乎很好,不是吗?如果没有,有什么方法可以获得适合我的情况的最佳值(value)?还是只是凭经验?

已编辑:图片大小为1920*1080,这里是一个sample

而且大多数时候它们靠近图像的边界。这有什么问题吗?

最佳答案

我想通了。问题在于我计算描述符的方式,因为正如您在上面的代码中看到的那样,我试图在图像的一小部分而不是图像本身上计算描述符。因此,当我放置图像本身而不是 partOfImageScene 时,像 extractor.compute( img_scene, keypoints_scene, descriptors_scene ); 它工作得很好,我没有丢失任何关键点我的名单。

关于opencv - 计算非关键点的 SURF/SIFT 描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30321095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com