Как исправить количество точек SIFT? - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь использовать дескрипторы SIFT, которые непосредственно используются для классификации изображений.SIFT определяется как: Ptr<SIFT> sift = SIFT::create(100).Тогда я ожидаю, что будет выделено 100 ключевых точек.Но количество фактически обнаруженных ключевых точек (sift->detect(img_resiz,keypoints)) не всегда равно 100 (иногда превышает предварительно установленное значение).Как это могло случиться?

Я хочу иметь фиксированное количество ключевых точек на изображение, чтобы получить одинаковую длину дескрипторов (после преобразования в вектор-строку) среди разных изображений (в качестве альтернативы мне может потребоваться дополнительная обработка на основе пакетаof-word для представления дескрипторов просеивания в одном измерении).

1 Ответ

1 голос
/ 25 июня 2019

Произошла ошибка в функции KeyPointsFilter::retainBest(std::vector<KeyPoint>& keypoints, int n_points), как вы можете видеть здесь: https://github.com/opencv/opencv/commit/3f3c8823ac22e34a37d74bc824e00a807535b91b.
Я мог воспроизвести ошибку с более старой версией OpenCV (3.4.5), и иногда у вас было на 1 KeyPoint больше, чем ожидалось, например. 101 вместо 100 из-за этой отмеченной линии.

Если вы не хотите переходить на более новую версию OpenCV, вы можете сделать что-то вроде:

// Detect SIFT keypoints
std::vector<cv::KeyPoint> keypoints_sift, keypoints_sift_100;
cv::Ptr<cv::xfeatures2d::SiftFeatureDetector> sift = cv::xfeatures2d::SiftFeatureDetector::create(100);
sift->detect(img, keypoints_sift);

std::cout << keypoints_sift.size() << std::endl;
for (size_t i = 0; i < 100; ++i) {
    keypoints_sift_100.push_back(keypoints_sift[i]);
}

Таким образом, вы сохраняете 100 лучших ключевых точек после обнаружения, поскольку они ранжируются по их оценкам https://docs.opencv.org/4.1.0/d5/d3c/classcv_1_1xfeatures2d_1_1SIFT.html.

...