2016-07-11 8 views
0

как указано в названии, я ищу, чтобы получить дескриптор-SURF для каждого пункта изображения. Я не хочу интереса к точкам, но дескриптор SURF для каждой точки изображения. Дескриптор SURF использовать цельный образ для вычисления дескрипторовМогу ли я получить дескриптор SURF для каждой точки изображения

% Create Integral Image 
iimg=IntegralImage_IntegralImage(img); 

затем экстрагирования процентных пунктов

FastHessianData.thresh = Options.tresh; 
FastHessianData.octaves = Options.octaves; 
FastHessianData.init_sample = Options.init_sample; 
FastHessianData.img = iimg; 
ipts = FastHessian_getIpoints(FastHessianData,Options.verbose) 
% Describe the interest points 
if(~isempty(ipts)) 
    ipts = SurfDescriptor_DecribeInterestPoints(ipts,Options.upright, Options.extended, iimg, Options.verbose); 
end 

функции, с которой точки заводятся

function ipts=FastHessian_getIpoints(FastHessianData,verbose) 
% filter index map 

filter_map = [0,1,2,3; 
    1,3,4,5; 
    3,5,6,7; 
    5,7,8,9; 
    7,9,10,11]+1; 

np=0; ipts=struct; 

% Build the response map 
responseMap=FastHessian_buildResponseMap(FastHessianData); 

% Find the maxima acrros scale and space 
for o = 1:FastHessianData.octaves 
    for i = 1:2 
     b = responseMap{filter_map(o,i)}; 
     m = responseMap{filter_map(o,i+1)}; 
     t = responseMap{filter_map(o,i+2)}; 

     % loop over middle response layer at density of the most 
     % sparse layer (always top), to find maxima across scale and space 
     [c,r]=ndgrid(0:t.width-1,0:t.height-1); 
     r=r(:); c=c(:); 

     p=find(FastHessian_isExtremum(r, c, t, m, b,FastHessianData)); 
     for j=1:length(p); 
      ind=p(j); 
      [ipts,np]=FastHessian_interpolateExtremum(r(ind), c(ind), t, m, b, ipts,np); 
     end 
    end 
end 

% Show laplacian and response maps with found interest-points 
if(verbose) 
    % Show the response map 
    if(verbose) 
     fig_h=ceil(length(responseMap)/3); 
     h=figure; set(h,'name','Laplacian'); 
     for i=1:length(responseMap), 
      pic=reshape(responseMap{i}.laplacian,[responseMap{i}.width responseMap{i}.height]); 
      subplot(3,fig_h,i); imshow(pic,[]); hold on; 
     end 
     h=figure; set(h,'name','Responses'); 
     h_res=zeros(1,length(responseMap)); 
     for i=1:length(responseMap), 
      pic=reshape(responseMap{i}.responses,[responseMap{i}.width responseMap{i}.height]); 
      h_res(i)=subplot(3,fig_h,i); imshow(pic,[]); hold on; 
     end 
    end 

    % Show the maximum points 
    disp(['Number of interest points found ' num2str(np)]); 
    scales=zeros(1,length(responseMap)); 
    scaley=zeros(1,length(responseMap)); 
    scalex=zeros(1,length(responseMap)); 
    for i=1:length(responseMap) 
     scales(i)=responseMap{i}.filter*(2/15); 
     scalex(i)=responseMap{i}.width/size(FastHessianData.img,2); 
     scaley(i)=responseMap{i}.height/size(FastHessianData.img,1); 
    end 
    for i=1:np 
     [t,ind]=min((scales-ipts(i).scale).^2); 
     plot(h_res(ind),ipts(i).y*scaley(ind)+1,ipts(i).x*scalex(ind)+1,'o','color',rand(1,3)); 
    end 
end 

как сохранить все точки, не надевая этот шаг обнаружения, затем описывают все эти точки дескриптором SURF.

+0

вы описали лучше, что это все, что код и как это отношение к вопросу? –

+0

SURF состоит из детектора клавиатуры (который извлекает «интересные» ключевые точки) и дескриптора. Если вы хотите применить дескриптор ко всем точкам, просто введите вектор со всеми точками в дескриптор. –

ответ

1

В своем коде вы должны четко функция детектора и дескрипторов отделенная:

  • FastHessian_getIpoints возвращает список интересных ключевых точек
  • SurfDescriptor_DecribeInterestPoints вычисляет дескриптор SURF для заданных точек.

Просто избавитесь от вашего детектора и вызовите функцию дескриптора, предоставляя в качестве входных ВСЕХ точек на изображении.

Так переменная ipts будет содержать все пункты вместо только возвращаемого детектора Keypoint

+0

Благодарим вас за эту ценную информацию, и это именно то, что я хочу сделать, но у меня есть небольшая проблема с этим, как я могу повлиять на все точки дескриптора, но теперь я этого не делал, я пытаюсь использовать 'ips = FastHessianData.img ; 'вместо' ips = FastHessian_getIpoints (FastHessianData, Options.verbose) ', но это дает ошибку:' Ошибка в SurfDescriptor_DecribeInterestPoints (строка 17) if (isempty (fields (ips))), return; end.' tkanks снова за вашу помощь –

+0

'FastHessian_getIpoints', вероятно, вернет точки в некотором формате, который не соответствует вашей прямой передаче. Поэтому некоторые поля будут пустыми. Я бы предложил запустить детектор, проверяя, в каком формате/структуре возвращаются точки, а затем создаем наши собственные точки (все точки на изображении), следуя этому формату. –

+0

именно так, точки интереса - это структура, когда мы находим x и y точки, масштаб точки и Laplacien. Я ставил 1 для шкалы и лапласиен, так как это нейтральный элемент. но для восстановления x и y (пространственная позиция пикселя) я не смог их получить. –

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