Как определить функции PHOW для изображения в C ++ с помощью vlfeat и opencv?

Я реализовал детектор функций PHOW в Matlab следующим образом:

    [frames, descrs] = vl_phow(im);

который является оберткой для кода:

    ...
for i = 1:4
ims = vl_imsmooth(im, scales(i) / 3) ;
[frames{s}, descrs{s}] = vl_dsift(ims, 'Fast', 'Step', step, 'Size', scales(i)) ;
end
...

Я делаю реализацию в C ++ с opencv и vlfeat. Это часть моего кода реализации для вычисления функций PHOW для изображения (Mat image):

   ...
//convert into float array
float* img_vec = im2single(image);

//create filter
VlDsiftFilter* vlf = vl_dsift_new(image.cols, image.rows);

double bin_sizes[] = { 3, 4, 5, 6 };
double magnif = 3;
double* scales = (double*)malloc(4*sizeof(double));
for (size_t i = 0; i < 4; i++)
{
scales[i] = bin_sizes[i] / magnif;
}
for (size_t i = 0; i < 4; i++)
{
double sigma = sqrt(pow(scales[i], 2) - 0.25);

//smooth float array image
float* img_vec_smooth = (float*)malloc(image.rows*image.cols*sizeof(float));
vl_imsmooth_f(img_vec_smooth, image.cols, img_vec, image.cols, image.rows, image.cols, sigma, sigma);

//run DSIFT
vl_dsift_process(vlf, img_vec_smooth);

//number of keypoints found
int keypoints_num = vl_dsift_get_keypoint_num(vlf);

//extract keypoints
const VlDsiftKeypoint* vlkeypoints = vl_dsift_get_keypoints(vlf);

//descriptors dimention
int dim = vl_dsift_get_descriptor_size(vlf);

//extract descriptors
const float* descriptors = vl_dsift_get_descriptors(vlf);
...

//return all descriptors of diferent scales

Я не уверен, должен ли возвращаться набор всех дескрипторов для всех масштабов, что требует много места для хранения, когда мы обрабатываем несколько изображений; или результат операции между дескрипторами разных масштабов.
Можете ли вы помочь мне с этим сомнением?
Спасибо

3

Решение

Вы можете сделать либо. Простейшим было бы просто объединить различные уровни. Я считаю, что это то, что делает VLFeat (по крайней мере, они не говорят, что они делают больше в документации). Удаление тех, кто находится ниже порога контрастности, должно помочь, но у вас все еще будет несколько тысяч (в зависимости от размера вашего изображения). Но вы можете сравнить дескрипторы, встречающиеся в одном и том же месте, чтобы удалить их. Это своего рода компромисс между временем и пространством. Как правило, я видел, что размеры бина были разнесены (с интервалами в 2, но может быть и больше), что должно уменьшить необходимость проверки перекрывающихся дескрипторов.

1

Другие решения


По вопросам рекламы [email protected]