ich arbeite gerade im Rahmen eines Projekts an der Erkennung von Gebäuden aufgrund besonderer Merkmale. Ich bin absoluter Matlab-Anfänger und habe jetzt etliche Stunden damit verbracht einen sinnvollen Ansatz zu finden.
Um es etwas zu konkretisieren:
Aus dem angehängeten Bild einer örtlichen Location (binär), sollen nun Merkmale extrahiert werden , sprich Objekte( Rechtecke, Flächen, sontiges) die dann einer Klasse zugeordnet werden.
Später soll anhand eines anderen Fotos diese Location quasi wiedererkannt werden.
Meine Frage, was würdest ihr extrahieren? Flächen? Kanten? und mit welchem Algorithmus?
Ich habe schon mit der Kantenerkennung gearbeitet, Sobel und Canny und dann liefert mir das Bild auch Kanten, aber ich weiß nicht so recht, was ich damit nun anfangen soll?
Ich wäre über einen konkreten Ansatz sehr dankbar, damit ich mich dann einarbeiten kann.
dazu gibt es sicherlich variantenreiche Ansätze. Eine Möglichkeit wäre im Wege der Mustererkennung. Dazu benötigst du den Befehl: >> normxcorr2.
Über diesen Befehl findest du einige Beispiele im Netz.
danke für die Info, werde ich mich mit beschäftigen.
Aber gerade hätte ich da noch eine Verständnisfrage, ist es möglich auf meinem Bild, die drei Tafeln über der Tür quasi als Merkmal für die später Erkennung zu nutzen?
vom Hintergrund des Bildes zu trennen. Leider ohne Erfolg. Bevor ich den Ansatz weiter verfolge würde ich gern wissen, ob es überhaupt ein möglich und logischer Ansatz ist.
Die Tafeln bestehen aus zu vielen Einzelelementen, die sich zwar für die Mustererkennung eignen, aber nicht für andere Segmentierungen. So viel mir bekannt ist, könnte man Buchstaben detektieren, aber für die Tafeln kenne ich kein geeignetes Verfahren. Für die Mustererkennung dagegen gibt es unterschiedliche Ansätze.
Es gibt auch Funktionen ohne normxcorr2. Das Problem liegt meist darin, dass diese Funktionen nur Templates finden, die absolut identisch in Größe und Lage sind. Bereits eine kleine Drehung führt zum Nichterkennen.
Ich fand es immer sehr hilfreich, bei einem Problem auch mal zu sehen, was links und rechts am "Tellerrand" liegt. Daher das Beispiel mit den Buchstaben. Mir ist schon klar, dass du ein Gebäude nicht daran erkennen willst.
Templates sind schon der richtige Weg. Suche nach "Template Matching". Da gibt es sehr viel Informationen. Du hast das Problem schon erkannt. Das Gebäude soll auch aus anderen Blickwinkeln erkannt werden.
Es wäre jetzt zu einfach, hier einen fertigen Code zu posten. Die mir bekannte Funktion erkennt z.B. auch Gesichter in einer Personengruppe. Dabei ist es grundsätzlich unerheblich, ob die Person nach links oder rechts sieht. Es ist aber auch keine Gesichtserkennung - eben nur Mustererkennung. Sie würde auch Schrauben in einer Schraubenkiste erkennen. Ich denke, das müsste zum ersten Versuch passen.
Aber auch immer andere Wege mit einbeziehen. Die Aufgabe wird anspruchsvoller, je weiter Template und Vorlage von einander abweichen.
Problem ist hierbei, dass ich anscheinend nur Templates finde, die im Original die selbe Perspektive haben. Wenn das nicht der Fall ist, bekomme ich folgende Fehlermeldung :
Code:
Error in corrMatching (line60)
boundingBox(1,:) = [];
Ich frage mich, ob das Problem jetzt explizit mit der boundingBox oder allgemein mit dem nicht erkennen des Musters zusammenhängt.
Hier nochmal der vollständige Code :
Code:
function[corrScore, boundingBox] = corrMatching(frameImg,templateImg, threshC) % ------------------------------------------------------------------------- % Function corrMatching: Template Matching using Correlation Coefficients % Inputs: % frameImg = gray or color frame image % templateImg = gray or color template image % threshC = threshold of rejecting detected region (default = .75) % e.g. if the detected region has a corrCoef>threshC % then the algorithm accepts it as a detection, % otherwise rejects it as a false alarm. % Output: % corrScore = 2D matrix of correlation coefficients % boundingBox = [upperLeftPixel.y upperLeftPixel.x height width]
%
% ------------------------------------------------------------------------- % By Yue Wu (Rex) % Department of Electrical and Computer Engineering % Tufts University % Medford, MA % 08/30/2010 % -------------------------------------------------------------------------
%% 3. finding most likely region [maxVal,maxIdx] = max(corrScore(:));
[maxR, maxC] = ind2sub([size(corrScore,1),size(corrScore,2)],maxIdx);
%% 4. hypothesis test if ~exist('threshC','var')
threshC = .75;
end if maxVal>=threshC
boundingBox(1,:) = [max(1,maxR-round(templateHeight/2)), max(1,maxC-round(templateWidth/2)), templateHeight, templateWidth];
else
boundingBox(1,:) = [];
end
Ich kann im Moment den Code auf dem Rechner laufen lassen. Mir scheint der etwas umständlich. Wenn du mal in den M-File von normxcorr2 siehst, findest du ein Beispiel, mit dem du erst einmal zu Ergebnissen kommst um dann weiter zu sehen.
Code:
cov=rgb2gray(imread('Bild1.tif')); % Das Bild, auf dem gesucht werden soll
tem=rgb2gray(imread('Temp.tif)); % Das, was zu suchen ist [m,n]=size(tem);
Icorr=normxcorr2(tem,cov);
[max_c,imax]=max(abs(Icorr(:)));
[yp,xp]=ind2sub(size(Icorr,imax(1));
xy=[(xp-n (yp-m);
hold on
rectangle('position',[xy(1) xy(2) n m],'edgecolor','g','linewidth',2)
musste gestern die Antwort aus Zeitgründen abbrechen. Ich habe heute deine Funktion getestet und den gleichen Fehler erhalten. Das Verfahren ist weniger robust gegen Abweichungen. Das Template muss identisch mit der Vorlage sein. Die Funktion normxcorr2 verhält sich anders. Das Template kann mal weniger, mal stark von der Suchvorlage abweichen.
Wenn du ein Bild mit einem Gebäude und Fenster hast, nehme mal ein Fenster als Template und verdrehe oder spiegel es. Eigentlich müsste es klappen, jedenfalls in meinen Bildern. Wenn man ein paar Bilder damit testet wird man schnell einen guten Überblick bekommen. Es wird ohnehin deine Aufgabe sein, verschiedene Perspektiven zu testen.
leider mußte ich mich erstmal ein paar Tage um andere Uni Angelgenheiten kümmern, deshalb meine verpätete Reaktion.
Ich habe mir gerade deinen Code angeschaut, leider bekomme ich ein paar Fehler angezeigt, wenn ich ihn übernehme. (Vll so von dir gewollt? )
Ich habe ihn jetzt so angepasst, weiß aber nicht warum er immer noch einen Fehler auswirft :
Code:
cov=rgb2gray(imread('Tuer.png')); % Das Bild, auf dem gesucht werden soll
tem=rgb2gray(imread('Tafel.png')); % Das, was zu suchen ist [m,n]=size(tem);
Icorr=normxcorr2(tem,cov);
[max_c,imax]=max(abs(Icorr(:)));
[yp,xp]=ind2sub(size(Icorr,imax(1)));
xy=(xp-n (yp-m));
hold on
rectangle('position',[xy(1) xy(2) n m],'edgecolor','g','linewidth',2)
Anzeige im CommandWindow nach ausführen des Codes:
Error in U1 (line 7)
[yp,xp]=ind2sub(size(Icorr,imax(1)));
Ich weiß leider gerade nicht was ich falsch gemacht habe.
Anscheinend fehlen da Input Arguments...
Mit meiner conv2 Variante hattest du natürlich recht, ich habe auch nach lägerem probieren kein Ergebnis bekommen. Danke, dass du das nochmal bestätigt hast.
den Fehler kann ich mir auch nicht erklären. Nehme mal das Bild: "onion.png",
das zum Programm gehört. Liegt in: ...toolbox\images\imdemo. Wenn das ohne Fehlermeldung geht, und das muss, ist irgendwas mit deinem Bild. Ich habe bisher bei keinem Bild, egal welcher Extension, diese Fehlermeldung erhalten.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.