我在使用OpenCV中的SIFT描述符实现时有点困惑。使用SIFT描述符的OpenCV(C++)增加了检测到的功能数量?
我想测试各种特征检测器+描述符的计算方法,所以我用的cv::FeatureDetector
和cv::DescriptorExtractor
接口,这让我简单地不同的检测方法和描述符之间改变的组合。
当调用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[7]
已经跨越了每两个新的关键点,但我看不出有任何合乎逻辑的解释为compute
方法,这样做:(
我这里给出的是使用MSER检测关键点的打印输出,然后尝试计算SIFT描述,但同样增加大小也与STAR,SURF和SIFT发生(即DoG)关键点检测。我没有尝试将描述符更改为其他内容,但如果有人认为它与问题相关,我会尝试并在我的问题中对其进行编辑。
你可以添加你使用的部分代码吗?了解参数将很有用。 – Alex 2012-03-21 11:32:29
呃......我实际上是在围绕OpenCV代码的封装进行封装,但是我会尝试挖掘实际的5行代码,它们将完成所有工作并编辑它。 – penelope 2012-03-21 14:45:34