В настоящее время я пытаюсь использовать dsift-алгоритм vlfeat-lib. Но независимо от того, с какими значениями я создаю фильтр (шаг выборки, размер ячейки), он возвращает одинаковое количество ключевых точек для каждого кадра во время выполнения (последовательные кадры отличаются от камеры). Документация по использованию C или C ++ очень тонкая, и я не смог найти хороших примеров для этих языков.
Вот соответствующий код:
// create filter
vlf = vl_dsift_new_basic(320, 240, 1, 3);
// transform image in cv::Mat to float vector
std::vector<float> imgvec;
for (int i = 0; i < img.rows; ++i){
for (int j = 0; j < img.cols; ++j){
imgvec.push_back(img.at<unsigned char>(i,j) / 255.0f);
}
}
// call processing function of vl
vl_dsift_process(vlf, &imgvec[0]);
// echo number of keypoints found
std::cout << vl_dsift_get_keypoint_num(vlf) << std::endl;
он возвращает одинаковое количество ключевых точек для каждого кадра в течение
выполнение
Это нормально с плотный Реализация SIFT, поскольку количество извлеченных ключевых точек зависит только от входных геометрических параметров [1], то есть шага и размера изображения.
Увидеть документация:
[1]:Фреймы объектов (ключевые точки) косвенно определяются шагами выборки (
vl_dsift_set_steps
) и границы выборки (vl_dsift_set_bounds
).
vl_dsift_get_keypoint_num
возвращается self->numFrames
обновляется только _vl_dsift_update_buffers
который использует только геометрическую информацию (границы, шаги и размеры бина).
Других решений пока нет …