2015-04-23 6 views
3

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

[frames, descrs] = vl_phow(im); 

который является wraper к коду:

... 
    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 изображения):

... 
    //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 

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

ответ

1

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

+0

Как вопрос, почему выбор 'image.cols' для параметров' smoothedStride' и 'stride' для' vl_imsmooth_f() '? Я пытался выяснить, что именно они делают, но исходный код довольно запутанный ... – brian

 Смежные вопросы

  • Нет связанных вопросов^_^