OpenCV BoW在计算SVM训练的直方图时断言错误

时间:2016-04-03 18:06:29

标签: c++ opencv image-processing svm sift

我正在尝试使用SIFT功能,Bag of Visual Words和SVM进行图像分类。 现在我正在接受培训。我需要获得每个训练图像的BoW直方图,以便能够训练SVM。为此我使用OpenCV中的BOWImgDescriptorExtractor。我使用的是OpenCV 3.1.0版。 问题是它计算了一些图像的直方图,但对于某些图像,它给了我这个错误:

OpenCV Error: Assertion failed (queryIdx == (int)i) in compute, 
file /Users/opencv-3.1.0/modules/features2d/src/bagofwords.cpp, line 200

libc++abi.dylib: terminating with uncaught exception of type 
cv::Exception: /Users/opencv-3.1.0/modules/feature/src/bagofwords.cpp:200: error: (-215) queryIdx == (int)i in function compute

训练图像大小相同,都有相同数量的通道。 为了创建字典,我使用了另一个图像集,而不是训练SVM。

这是代码的一部分:

Ptr<FeatureDetector> detector(cv::xfeatures2d::SIFT::create());
Ptr<DescriptorMatcher> matcher(new BFMatcher(NORM_L2, true));
BOWImgDescriptorExtractor bow_descr(det, matcher);
bow_descr.setVocabulary(dict);
Mat features_svm;
for (int i = 0; i < num_svm_data; ++i) {
    Mat hist;
    std::vector<KeyPoint> keypoints;
    detector->detect(data_svm[i], keypoints);
    bow_descr.compute(data_svm[i], keypoints, hist);
    features_svm.push_back(hist);
}

data_svmvector<Mat>类型。这是我将在SVM中使用的训练集图像。

问题是什么?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我可以通过将“蛮力”匹配器的“交叉检查”选项更改为“假”来解决此问题。我认为这是因为交叉检查选项仅保留少数匹配项,并删除其余部分并弄乱了过程中的索引