gpt4 book ai didi

c++ - 使用 SIFT 描述符的 OpenCV (C++) 增加了检测到的特征的数量?

转载 作者:行者123 更新时间:2023-11-30 00:38:50 29 4
gpt4 key购买 nike

在使用 OpenCV 中的 SIFT 描述符 实现时,我遇到了一些困惑。

我正在尝试测试各种特征检测器 + 描述符计算方法,所以我使用了 cv::FeatureDetectorcv::DescriptorExtractor 接口(interface)的组合,它允许我只是在不同的检测器方法和描述符之间进行更改。

当调用cv::DescriptorExtractor::compute(...)(单个图像的变体)时,文档说给算法的关键点数量是可能的减少,如果无法计算它们的描述符,我理解如何以及为什么这样做。

但是,发生在我身上的是描述符计算后的关键点数量实际上增加。显然是这样,我并不想阻止它发生,我只是希望得到一个解释(只是一个直观的描述会很酷,尽管我更喜欢那样)。

我在没有任何代码的实际 OpenCV 周围有一层又一层的包装器(只是设置一些本地非 OpenCV 标志),所以这是在它的底部调用的 OpenCV 代码:

cv::Ptr<cv::FeatureDetector> dect = cv::FeatureDetector::create("MSER");
cv::Mat input = cv::imread("someImg.ppm", 0);
std::vector<cv::KeyPoint> keypoints;
dect->detect(input, keypoints);

cv::Ptr<cv::DescriptorExtractor>deEx=cv::DescriptorCalculator::create("SIFT");

std::cout << "before computing, feats size " << keypoints.size() << std::endl;
// code to print out 10 features

cv::Mat desc;
deEx->compute(input, keypoints, desc);

std::cout << "after computing, feats size " << keypoints.size() << std::endl;
// code to print out 10 features

我已经打印出描述符计算前后的前 10 个关键点,所以这里有一些具体的数字作为例子:

before computing, feats size 379
feat[0]: 10.7584 39.9262 176.526 0 12.5396
feat[1]: 48.2209 207.904 275.091 0 11.1319
feat[2]: 160.894 313.781 170.278 0 9.63786
feat[3]: 166.061 239.115 158.33 0 19.5027
feat[4]: 150.043 233.088 171.887 0 11.9569
feat[5]: 262.323 322.173 188.103 0 8.65429
feat[6]: 189.501 183.462 177.396 0 12.3069
feat[7]: 218.135 253.027 171.763 0 123.069
feat[8]: 234.508 353.236 173.281 0 11.8375
feat[9]: 234.404 394.079 176.23 0 8.99652
after computing, feats size 463
feat[0]: 10.7584 39.9262 13.1313 0 12.5396
feat[1]: 48.2209 207.904 69.0472 0 11.1319
feat[2]: 48.2209 207.904 107.438 0 11.1319
feat[3]: 160.894 313.781 9.57937 0 9.63786
feat[4]: 166.061 239.115 166.144 0 19.5027
feat[5]: 150.043 233.088 78.8696 0 11.9569
feat[6]: 262.323 322.173 167.259 0 8.65429
feat[7]: 189.501 183.462 -1.49394 0 12.3069
feat[8]: 218.135 253.027 -117.067 3 123.069
feat[9]: 218.135 253.027 7.44055 3 123.069

从这个例子中可以看出,原来的feat[1]feat[7]分别跨入了两个新的关键点,但是我没看到compute 方法的任何逻辑解释:(

我在这里给出的打印输出是使用 MSER 检测关键点,然后尝试计算 SIFT 描述符,但同样增加 大小也发生在检测到 STARSURFSIFT(即 DoG)关键点时。我没有尝试将 SIFT 描述符更改为其他内容,但如果有人认为它与问题相关,我会尝试并在我的问题中对其进行编辑。

最佳答案

首先,正如您在 documentation 中看到的那样cv::DescriptorExtractor::compute拿个std::vector<cv::Keypoints>在参数中 non const .这意味着可以通过 cv::DescriptorExtractor::compute 修改此 vector .在实践中,KeyPointsFilter::runByImageBorderKeyPointsFilter::runByKeypointSize (两个 non-const 函数)将应用于 vector 并将删除无法计算描述符的关键点。不会重新提取关键点。您应该发布您正在使用的几行代码以进行进一步诊断。

--

嗯,终于找到问题出在哪里了:cv::SiftDescriptorExtractor::compute方法调用 SIFT::operator()它(重新)计算特征的方向并复制具有几个主要方向的点。解决方案可能是更改 descriptorParams.recalculateAngles为假。

关于c++ - 使用 SIFT 描述符的 OpenCV (C++) 增加了检测到的特征的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9803625/

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