Я пытаюсь реализовать BOW с библиотекой OpenCV в C++. Я извлек ключевые точки изображений с помощью SIFT-метода, подобного этому (для каждого изображения):
featureDetector->detect(image, keypoints);
descriptorExtractor->compute(image, keypoints, descriptors);
bowTrainer.add(descriptors);
то лексика обучается с помощью bowTrainer.cluster()
и сохраняется в BOWImgDescriptorExtractor bowDE
. После того, как я сохранил словарь, вы хотите увидеть хотя бы одну диаграмму для некоторых изображений. Это выполняется так
featureDetector->detect(image, keypoints);
bowDE->compute(image, keypoints, histogram);
for (int i = 0; i < histogram.cols; i++)
cout << histogram.at<unsigned>(0, i) << ",";
И результат имеет 1
строку с k
столбцами (k
от k-средств) значения 0
или sth около 980000000
Я не думаю, что это правильно, пожалуйста, скажите мне, что я делаю неправильно. Это выглядит очень плохо, когда я хочу показать диаграмму.
Почти забыл... Решение было довольно простым. Линия:
cout << histogram.at<unsigned>(0, i) << ",";
пришлось изменить на
cout << histogram.at<float>(0, i) << ",";
потому что сгенерированная гистограмма является нормированной гистограммой. для получения более подробного ответа см. ответ на OpenCV