2016-11-29 2 views
1

Ich soll eine Reihe von SURF-Punkten von einem Videorahmen sammeln und nachdem ich diese Koordinatenpunkte gefiltert habe, möchte ich sie wieder in ihre eigenen konvertieren bilden. Im Folgenden finden Sie den Code sehen kann ich schrieb:Filtern der DetectSURFfeatures und Umwandeln des Arrays zurück zu einem eigenen Typ auf MATLAB

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 

Was ich brauche, ist (zum Beispiel) 24x2 Matrix in eine 24x1 Matrix umzuwandeln, die nach wie vor die ausgewählte x hält und y-Koordinaten als Paar (24-mal [x , y]). Vielen Dank im Voraus ...

+0

Hallo! versuche, ein [mcve] hinzuzufügen, damit wir den Code testen können. Aber ich verstehe, was Sie wollen. Surf-Features geben Ihnen einige spezifische 'x, y' Koordinaten von Pixeln, die einige SURF-Werte haben. Welche Umstellung passiert hier? –

Antwort

1

Das Problem mit diesem Ansatz ist, dass Sie alle Informationen verlieren würden, die die SURF-Deskriptor pro Punkt begleitet. Sie würden Informationen wie die Skala, das Laplace-Zeichen an jedem Punkt, die Orientierung usw. verlieren. Sie betrachten nur die räumlichen Positionen.

Verwenden Sie stattdessen logical Indizierung und entfernen Sie alle Punkte in der SURFPoints Struktur Array, die Sie nicht möchten. Sie erhalten die rohen Koordinaten auch nicht richtig. Denken Sie daran, dass SURFPoints die räumlichen Positionen Ihrer erkannten Features in einem Feld namens Location enthält, was Sie in Ihrer zweiten Codezeile versucht haben, aber es ist nicht ganz korrekt.

Deshalb, was Sie tun müssen, ist die folgende:

% 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

Vielen Dank, das hat sehr geholfen! Ich wusste nicht einmal, dass ich den Surf-Befehl mit (ind) addition manipulieren kann. –

+0

@CanDemir ah :) Logische Indexierung ist eine MATLAB Klammer. Da "dectSURFFeatures" von einem Struktur-Array zurückgegeben wird, können Sie wie jede andere Matrix oder ein Array in MATLAB in dieses Verzeichnis indizieren. Die logische Indizierung ist hier wichtig, weil Sie alle Merkmale jedes Feature-Punktes beibehalten möchten. Das Kopieren nur der räumlichen Positionen würde alle wichtigen Informationen verlieren, die SURF zu etwas Besonderem machen. Übrigens, Sie sind herzlich willkommen und viel Glück! – rayryeng

+0

@Candemir Als einen Umweg, ich empfehle diesen Beitrag auf die Indizierung zu diskutieren: http://StackOverflow.com/Questions/32379805/Linear-Indexing-Logical-Indexing-and-all-that - Es erklärt über logische Indexierung in mehr Detail, sowie lineare Indexierung, die sein Großvater ist. – rayryeng

Verwandte Themen