我正在使用OpenCV创建n
图像数据集的视觉直方图(遵循Bag of Visual Words模型)。
这是代码:
std::vector<std::string> fileList;
std::unique_ptr<cv::BOWImgDescriptorExtractor> bowDE;
cv::Mat vocabulary;//will be filled through KMeans
...
bowDE->setVocabulary(vocabulary);
cv::Ptr<cv::Feature2D> featureDetectorDescriptor = cv::xfeatures2d::SIFT::create(0,3,0.04,10,1.6);;
for(size_t i=0;i<n;i++) {
cv::UMat img;
cv::Mat word;
imread(fileList[i], cv::IMREAD_GRAYSCALE).copyTo(img);
std::vector<cv::KeyPoint> keyPoints;
featureDetectorDescriptor->detect(img, keyPoints);
bowDE->compute(img, keyPoints, word);
histograms.push_back(word);
assert(histograms.rows==(i+1));//this is for testing
}
问题是在插入4625
图像后,assert
条件为false。我测试了keypoints.size()
,结果为0,没有检测到关键点!
我尝试删除创建错误的图像,但另一个创建了相同的错误(因此错误似乎不依赖于图像)。
为什么会这样?
更新:实际上我发现错误与图像有关。似乎使用默认参数cv::SIFT
检测到来自Caltech101的此图像的0个关键点: