Arrays 查找两个视频之间匹配的SIFT特征

Arrays 查找两个视频之间匹配的SIFT特征,arrays,matlab,video,matching,feature-detection,Arrays,Matlab,Video,Matching,Feature Detection,我从两个视频中提取了SIFT特征进行匹配。 我需要将第二个视频功能与第一个视频的一系列功能中存储的功能进行比较。我在设置代码时遇到了问题,这样当我有了对应关系时,我就可以得到特征所在的帧。我该怎么办?有人能给我看一个代码示例吗 这是我的代码: obj = VideoReader('video2.avi'); lastFrame = read(obj, inf); numFrames = obj.NumberOfFrames; %estrazione frame e sift for k = 1

我从两个视频中提取了SIFT特征进行匹配。 我需要将第二个视频功能与第一个视频的一系列功能中存储的功能进行比较。我在设置代码时遇到了问题,这样当我有了对应关系时,我就可以得到特征所在的帧。我该怎么办?有人能给我看一个代码示例吗

这是我的代码:

obj = VideoReader('video2.avi');
lastFrame = read(obj, inf);
numFrames = obj.NumberOfFrames;

%estrazione frame e sift
for k = 1 : 3 % numFrames / 5
    disp(['Processing frame #', num2str(k)]);
    this_frame = read(obj, k * 5); % leggi solo un fotogramma ogni 5 per velocizzarle la cosa
    this_frame = imresize(this_frame, 0.5); % rimpiccioliamolo per questioni di efficienza!
    I = single(rgb2gray(this_frame)) ;
    [f,d] = vl_sift(I);  % estrazione feature

    features{k} = f;     % salviamo le feautre e i relativi descrittori in delle celle
    descriptors{k} = d;
end
save('feature_input', 'features');
save('descrittori_input', 'descriptors');

%%% un esempio di come ripescare i dati...
pippo = load('feature_input');
newfeat = pippo.features;
pippo = load('descrittori_input');
newdesc = pippo.descriptors;

for k = 1 : 3
    disp(['Le feature del fotogramma', num2str(k), ' sono: ']);
    f = cell2mat( newfeat(k) );
    f(:, 1:10) % ne mostriamo solo un pezzetto... le posizioni delle prime 10 features
end


obj2 = VideoReader('video2u.avi');
lastFrame = read(obj2, inf);
numFrames = obj2.NumberOfFrames;



%estrazione frame e sift video2
for k2 = 1 : 3 % numFrames / 5
    disp(['Processing frame #', num2str(k2)]);
    this_frame2 = read(obj2, k2 * 5); % leggi solo un fotogramma ogni 5 per velocizzarle la cosa
    this_frame2 = imresize(this_frame2, 0.5); % rimpiccioliamolo per questioni di efficienza!
    K = single(rgb2gray(this_frame2)) ;
    [f2,d2] = vl_sift(K);  % estrazione feature

    features2{k2} = f2;     % salviamo le feautre e i relativi descrittori in delle celle
    descriptors2{k2} = d2;
end




save('feature2_input', 'features2');
save('descrittori2_input', 'descriptors2');

%%% un esempio di come ripescare i dati...
pippo2 = load('feature2_input');
newfeat2 = pippo2.features2;
pippo2 = load('descrittori2_input');
newdesc2 = pippo2.descriptors2;

for k2 = 1 : 3
    disp(['Le feature del fotogramma', num2str(k2), ' sono: ']);
    f2 = cell2mat( newfeat2(k2) );
    f2(:, 1:10) % ne mostriamo solo un pezzetto... le posizioni delle prime 10 features


end


[matches, scores] = vl_ubcmatch(d, d2, 1.5) ;

% sift points plot

    subplot(1,2,1);
    imshow(uint8(I));
    hold on;
    plot(f(1,matches(1,:)),f(2,matches(1,:)),'b*');


    subplot(1,2,2);
    imshow(uint8(K));
    hold on;
    plot(f2(1,matches(2,:)),f2(2,matches(2,:)),'r*');


    figure;

     %-------------  

 % RANSAC

X1 = f(1:2,matches(1,:)) ; X1(3,:) = 1 ;
X2 = f2(1:2,matches(2,:)) ; X2(3,:) = 1 ;


numMatches = size(matches,2) ;

for t = 1:100
  % estimate homograpyh
  subset = vl_colsubset(1:numMatches, 4) ;
  A = [] ;
  for i = subset
    A = cat(1, A, kron(X1(:,i)', vl_hat(X2(:,i)))) ;
  end


  [U,S,V] = svd(A) ;


H{t} = reshape(V(:,9),3,3) ;

  % score homography
  X2_ = H{t} * X1 ;
  du = X2_(1,:)./X2_(3,:) - X2(1,:)./X2(3,:) ;
  dv = X2_(2,:)./X2_(3,:) - X2(2,:)./X2(3,:) ;
  ok{t} = (du.*du + dv.*dv) < 6*6 ;
  score(t) = sum(ok{t}) ;
end



[score, best] = max(score) ;
H = H{best};
ok = ok{best};


% sift feature matching 

   dh1 = max(size(K,1)-size(I,1),0) ;
   dh2 = max(size(I,1)-size(K,1),0) ;


subplot(2,1,1) ;
imagesc([padarray(I,dh1,'post') padarray(K,dh2,'post')]) ;
 colormap (gray);
o = size(I,2) ;
line([f(1,matches(1,:));f2(1,matches(2,:))+o], ...
     [f(2,matches(1,:));f2(2,matches(2,:))]) ;


axis image off ;

subplot(2,1,2) ;
imagesc([padarray(I,dh1,'post') padarray(K,dh2,'post')]) ;
 colormap (gray);
o = size(I,2) ;
line([f(1,matches(1,ok));f2(1,matches(2,ok))+o], ...
     [f(2,matches(1,ok));f2(2,matches(2,ok))]) ;
title(sprintf('%d (%.2f%%) inliner matches out of %d', ...
              sum(ok), ...
              100*sum(ok)/numMatches, ...
              numMatches)) ;
axis image off ;

drawnow ;

end
obj=VideoReader('video2.avi');
lastFrame=读取(obj,inf);
numFrames=obj.NumberOfFrames;
%筛框
对于k=1:3%numFrames/5
disp(['Processing frame#',num2str(k)];
此帧=读取(obj,k*5);%leggi solo联合fotogramma ogni 5件每件velocizzarle la cosa
此_帧=imresize(此_帧,0.5);%每一个问题都有效率!
I=单个(rgb2gray(此_帧));
[f,d]=vl_sift(I);%埃斯特拉齐翁特征
特征{k}=f;%salviamo le feautre e i Relative i Descriptori in delle celle
描述符{k}=d;
终止
保存(“特征输入”、“特征”);
保存(“描述符输入”、“描述符”);
%%%我来的时候很成熟。。。
pippo=加载(“特征输入”);
newfeat=pippo.features;
pippo=加载(“描述输入”);
newdesc=pippo.descriptor;
对于k=1:3
disp(['Le feature del fotogramma',num2str(k),'sono:']);
f=cell2mat(newfeat(k));
f(:,1:10)%ne莫斯特里亚莫独奏联合佩泽托。。。le posizioni delle prime 10功能
终止
obj2=视频阅读器(“video2u.avi”);
lastFrame=读取(obj2,inf);
numFrames=obj2.NumberOfFrames;
%estrazione帧e筛选视频2
对于k2=1:3%numFrames/5
disp(['Processing frame#',num2str(k2)];
此_frame2=读取(obj2,k2*5);%leggi solo联合fotogramma ogni 5件每件velocizzarle la cosa
此_frame2=imresize(此_frame2,0.5);%每一个问题都有效率!
K=单个(rgb2gray(此_帧2));
[f2,d2]=vl_筛(K);%埃斯特拉齐翁特征
特征2{k2}=f2;%salviamo le feautre e i Relative i Descriptori in delle celle
描述符2{k2}=d2;
终止
保存('feature2_input','features2');
保存('descriptori2_input','descriptors2');
%%%我来的时候很成熟。。。
pippo2=负载(“特性2_输入”);
newfeature2=pippo2.feature2;
pippo2=加载(“描述符输入”);
newdesc2=pippo2.descriptors2;
对于k2=1:3
disp(['Le feature del fotogramma',num2str(k2),'sono:']);
f2=cell2mat(newfeat2(k2));
f2(:,1:10)%ne莫斯特里亚莫独奏。。。le posizioni delle prime 10功能
终止
[比赛,得分]=vl_ubcmatch(d,d2,1.5);
%筛选点图
子批次(1,2,1);
imshow(uint8(I));
等等
图(f(1,匹配(1,:)),f(2,匹配(1,:),'b*);
子批次(1,2,2);
imshow(uint8(K));
等等
图(f2(1,匹配项(2,:)),f2(2,匹配项(2,:),'r*);
图形
%-------------  
%兰萨克
X1=f(1:2,匹配(1,:);X1(3,:)=1;
X2=f2(1:2,匹配(2,:);X2(3,:)=1;
numMatches=大小(匹配,2);
对于t=1:100
%估计同形
子集=vl_colsubset(1:numMatches,4);
A=[];
对于i=子集
A=类别(1,A,kron(X1(:,i)’,vl_hat(X2(:,i));
终止
[U,S,V]=svd(A);
H{t}=重塑(V(:,9),3,3);
%分数单应
X2_u=H{t}*X1;
du=X2(1,:)/X2(3,:)-X2(1,:)/X2(3,:);
dv=X2(2,:)/X2(3,:)-X2(2,:)/X2(3,:);
ok{t}=(du.*du+dv.*dv)<6*6;
分数(t)=和(ok{t});
终止
[得分,最佳]=最大(得分);
H=H{最佳};
ok=ok{best};
%sift特征匹配
dh1=最大(尺寸(K,1)-尺寸(I,1),0);
dh2=最大(尺寸(I,1)-尺寸(K,1),0;
子批次(2,1,1);
imagesc([padarray(I,dh1,'post')padarray(K,dh2,'post')]);
彩色地图(灰色);
o=尺寸(I,2);
行([f(1,匹配(1,:);f2(1,匹配(2,:)+o]。。。
[f(2,匹配(1,:);f2(2,匹配(2,:))];
轴图像关闭;
子批次(2,1,2);
imagesc([padarray(I,dh1,'post')padarray(K,dh2,'post')]);
彩色地图(灰色);
o=尺寸(I,2);
行([f(1,匹配(1,ok));f2(1,匹配(2,ok))+o]。。。
[f(2,匹配(1,ok));f2(2,匹配(2,ok))];
标题(sprintf(“%d(%.2f%%))内联线与%d”中的内容匹配。。。
求和(好)。。。
100*总和(正常)/数值匹配。。。
numMatches);
轴图像关闭;
现在抽;
终止

您正在使用
[匹配,分数]=vl_ubcmatch(d,d2,1.5)进行匹配<代码>d
仅包含最新帧的描述符。你应该这样做:

for nFrames=1:3
   [matches{nFrames}, scores{nFrames}] = vl_ubcmatch(descriptors{nFrames}, descriptors2{nFrames}, 1.5);
end

从这里,您应该能够获得帧之间的匹配。

它可以工作!但现在我有单应性的问题。。。将单元格内容分配给非单元格数组对象。tesi_帧(第114行)中的错误H{t}=整形(V(:,9),3,3);这是新代码:X1=f(1:2,匹配{nFrames}(1,:);X1(3,:)=1;X2=f2(1:2,匹配{nFrames}(2,:);X2(3,:)=1;numMatches=大小(匹配,2);对于t=1:100%估计同形性,h子集=vl_colsubset(1:numMatches,4);A=[];对于i=子集A=cat(1,A,kron(X1(:,i)’,vl_hat(X2(:,i));结束[U,S,V]=svd(A);H{t}=重塑(V(:,9),3,3)@这很难说。在你得到错误的地方贴一行。事实上,这是一个非常常见的错误。您也可以自己搜索和理解解决方案。