2016-11-29 377 views
1

我应该从视频帧中收集一堆SURF点,并且在过滤这些坐标点群后,我想将它转换回它自己的形成。 下面你可以看到我写的代码:在MATLAB中过滤DetectSURFfeatures并将数组转换回它自己的类型

surfpoints_raw_single_column_matrix = detectSURFFeatures(img); 
raw_points_double_column_matrix = SURFPoints(Location); 
s=1; 
for a=1:size(raw_points_double_column_matrix,1) 
    i=raw_points_double_column_matrix(a,1); 
    j=raw_points_double_column_matrix(a,2); 
if ((i>156-9-70 && i<156+9+70) && (j>406-9-70 && j<406+9+70)) 
matrix_filtered(s,1)=i; 
matrix_filtered(s,2)=j; 
s=s+1; %filtered matrix index counter 
end 
end 
???? = matrix_filtered; 
% Conversion back to the type of surfpoints_raw_single_column_matrix 

我需要的是转换(例如)24x2矩阵划分成24x1矩阵仍然保持选定的X和Y坐标为一对(24倍[X ,y])。 在此先感谢...

+0

嗨!尝试添加[mcve],以便我们可以测试代码。但是,我明白你想要什么。 Surf功能会给你一些特定的像素的x,y坐标,它们有一些SURF值。这里发生了什么样的转换? –

回答

1

该方法的问题在于您将失去伴随SURF描述符每个点的所有信息。您将失去诸如比例尺,拉普拉斯每个点的符号,方向等信息。您只查看空间位置。

取而代之的是,使用logical索引并删除SURFPoints结构数组中不需要的任何点。你也没有正确地获取原始坐标。请记住,SURFPoints包含您检测到的功能的空间位置,该字段名为Location,这是您在第二行代码中尝试执行的操作,但它不完全正确。

因此,你需要做的是:

% Your code 
surfpoints_raw_single_column_matrix = detectSURFFeatures(img); 

% Corrected 
raw_points_double_column_matrix = surfpoints_raw_single_column_matrix.Location; 

% New - Get X and Y coordinates 
X = raw_points_double_column_matrix(:,1); 
Y = raw_points_double_column_matrix(:,2); 

% New - Determine a mask to grab the points we want 
ind = (X>156-9-70 & X<156+9+70) & (Y>406-9-70 & Y<406+9+70); 

% New - Create new SURFPoints structure that contains all information 
% from the points we need 
matrix_filtered = surfpoints_raw_single_column_matrix(ind); 
+1

非常感谢,帮助了很多!我甚至不知道我可以用(ind)additon来操纵surf命令。 –

+0

@CanDemir啊:)逻辑索引是MATLAB的主食。因为'detectSURFFeatures'返回的是一个结构数组,所以你可以像MATLAB中的任何其他矩阵或数组那样索引它。这里的逻辑索引很重要,因为您要保留每个特征点的所有特征。只复制空间位置会丢失SURF特有的所有重要信息。顺便说一句,你非常欢迎,祝你好运! – rayryeng

+0

@CanDemir作为一个绕道,我强烈推荐这篇文章讨论索引:http://stackoverflow.com/questions/32379805/linear-indexing-logical-indexing-and-all-that - 它解释了更多的逻辑索引细节,以及作为其祖父的线性索引。 – rayryeng

相关问题