Nein, mein Code ist das Problem. Ich habe den Code abgetippt, weil ich von diesem Rechner keinen Zugriff auf die M-Files habe und jemand auch noch genervt hat. Ein Stück aus dem Arbeitsleben!
Noch einnmal:
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)];
figure; imshow(cov)% Das fehlte auch noch hold on
rectangle('position',[xy(1) xy(2) n m],'edgecolor','g','linewidth',2)
Jetzt ist auch noch meine Antwort weg, obwohl ich sie nach dem Absenden bereits gelesen habe.
Ich musste den Code abtippen, da ich von diesem Rechner keinen Zugriff auf meine M-Files habe. Dann hat noch jemand genervt. So sind die Fehler entstanden. Sehr unglücklich:
Auf ein Neues:
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)];
figure; imshow(cov) hold on
rectangle('position',[xy(1) xy(2) n m],'edgecolor','g','linewidth',2)
jetzt ist alles etwas durcheinander gegangen, dein editierter Post kam einfach nur ne Sekunde zu spät , da hatte ich schon wieder geschrieben. Und war danach unterwegs... Funktioniert jetzt aber, werde mich jetzt erstmal weiter damit beschäftigen und melde mich später bestimmt wieder
Ich habe jetzt einiges ausprobiert mit deinem Code, auf verschieden gefilterte Bilder (Schwellenwert, Kanten etc.) ein bestimmtest Template gesucht. Dabei funktioniert die Erkennung des Templates mal mehr , mal weniger gut.
Ein Beispiel:
Die Location und das gesuchte Template hab ich angehangen. Auf dem Original wird es erkannt, auf leichten perspektivischen Abweichungen auch noch, aber auf diesem Beispiel nicht mehr.
Wie kann ich das Bild "säubern" damit sich die Chance erhöht, dass das Template erkannt wird? Geht das überhaupt? Ist die Auswahl des Templates vielleicht auch schlecht?
Ich habe deine Frage eben erst lesen können. Das einzige "Säubern" eines Bildes, das man gemeinhin gefahrlos unternehmen kann, ist das Entfernen von Rauschen. Aber das wird nicht das Problem sein. Der Algorithmus ist nicht weiter belastbar. Wenn das Template über ein bestimmtes Maß gedreht oder verzerrt ist, gibt es kein verwertbares Ergebnis. Wenn es nur die Drehung ist, könnte man sich vielleicht noch behelfen, in dem man das Template in vorgegebenen Stufen dreht (als Funktion). Wenn Verzerrungen hinzu kommen, wird es problematisch.
Ja die Abweichungen zwischen Template und Bild sind einfach zu groß. Ich denke aber dass ich mit dem was ich jetzt schon "erkenne" erstmal weiterarbeiten kann.
Und das bringt mich zu meinem nächsten Problem. Ich weiß nicht genau wie ich das nun weiterverarbeiten soll.
Ich kann das Template jetzt in verschiedenen Fotos einer Location wiedererkennen und muß damit jetzt auf die Location schließen können, die mit dem Originalbild in einer Datenbank liegt. Das heißt ich brauche ein Vergleich. Mein Vergleichswert ist ja dann das Template.
Vielleicht könnte ich das über die Koordinaten des Templates realisieren oder über die Form des Templates.Ich könnte ja den anderen Locations andere Templateformen als "rectangle" zuweisen um sie so zu unterscheiden.
Wie komme ich jetzt an Information über das gefundene Template- Rechteck? Koordinaten?
Ich weiß, das ist gerade nicht konkret, mir fehlt glaube ich der logische Ansatz.
Wenn du dir die Werte: xp,yp und xy ansiehst hast du die Koordinaten des rechtecks im Suchergebnis. max_c zeigt an, wie genau Template und Bild überein stimmen.
In eigenen Beispielen zeigten Werte unter 0.56 keinen Treffer. Du müsstes das mal mit deinen Beispielen prüfen, denn Werte unter einer definierten Schwelle zeigen falsche Ergebnisse. Das Rechteck liegt dann fälschlicherweise irgendwo im Bild. Den Wert kannst du dir in der Funktion ausgeben lassen und so Treffer von Nichttreffer unterscheiden.
Super danke, da hatte ich ein Brett vorm Kopf, steht ja alles im Workspace.
Jetzt hab ich die max_c Werte mal geprüft und leider festgestellt, dass auf meinem Perspektive Bild der Wert bei 0.39 liegt und somit ja theoretisch kein match vorliegen kann? Aber er zieht das Rechteck schon um den richtigen Bereich? Zufall?
Ich habe die Templates immer mit Halbtonbilder korreliert und daher keine Erfahrungswerte mit Segmentierungen. Daher mein Hinweis von vorhin, eigene Schwellwerte zu ermitteln. Ob dein Ergebnis ein Zufall ist müssen Vergleichsaufnahmen mit anderen Motiven bringen. Es könnte sein, dass ursächlich die statische Struktur deines Templates zu der Vermutung geführt hat. Ein Rechteck um 180 Grad gedreht bleibt in deinem Fall ein Rechteck. Nehme mal Templates, die nicht spiegelgleich sind. So müssten sich die Grenzen eindeutig ergeben.
ich habe mal etwas weiter gebastelt, anders kann man das nicht nennen, also bitte entschuldige den wahrscheinlich eher uneleganten code
Im Moment lese ich ein einziges Template ein, um es auf dem Bild zu suchen. Dann zeigt er mir aufgrund des max_c Wertes ein Match oder kein Match. Soweit so gut.
Ich würde gerne meinen Code dahingehend erweitern, so dass 6 verschiedene Templates nacheinander in dem Bild gesucht werden können. Dabei sollte jedes Match auch angezeigt werden. Leider weiß ich nicht ganz genau wie ich zum Ziel komme, ohne alles 6 mal hintereinander in den Code zu schreiben.
ich bin in Zeitdruck, will dir aber noch schnell eine Lösung für die Stapelverarbeitung posten, und zwar das Einlesen und Speichern. Die musst du, zusätzlich das 2. imread, in dein File einsetzen:
Code:
oldpath=pwd;
pname=uigetdir;
cd(pname)
dd=dir('*.tif');
len=length(dd);
disp(['Files to processed: ' num2str(len)]) for nr=1:len
try disp(dd(nr).name)
PathFileName=[pname '\' dd(nr).name];
tem1=imread(PathFileName)
Es gibt da noch ein Problem. Wenn du das Bild mit der Markierung speicherst, dann musst du den Inhalt der figur speichern, sonst fällt der Rahmen weg. Das ist die Position:
Es wird hier im ersten Schleifendurchlauf ein Frame mit Inhalt gespeichert, dieser wird aber als Res_xxx .jpg in meine Folder geschrieben, so das dieses im nächsten Schleifendurchlauf anscheinend korreliert wird. Eigentlich ist die Anzahl der .jpgs doch vor der Schleife abgefragt worden und wenn nun eins dazu kommt dürfte dieses doch nicht korelliert werden? Nunja das führt dann zu einem Fehler in Normxcorr2. Ich versteh nicht warum. Und auch nicht warum es nicht in 'tif' geschrieben wird, obwohl es als fmt angegeben ist.
Wenn ich nur einen Schleifendurchlauf zulasse, funktioniert es wie es soll.
Ergibt für jedes Bild ein helleres Bild als Ergebnis der Berechnung. Das berechnete Bild (Ergebnis) hat das Vorzeichen "_ .tif" und wird in dem vorgegebenen Ordner gespeichert.
Den Fehler hab ich jetzt trotz intensiver Bemühungen nicht finden können, habe aber das Problem anderweitig lösen können, so werden mir jetzt alle gefundenen Templates in Rechtecken in verschiedenen Farben auf einem Bild angezeigt, was ich daraufhin abspeichern kann. Gut
Jetzt noch eine hoffentlich letzte Frage. Ich muß die gefundenen Templates einem bestimmten Gebäude zuordnen und dieses dann dem User ausgeben.
Mein Ansatz:
- Templates werden in Reichenfolge im Ordner abgelegt.
- Templates haben laufende Nummerierung.
- So kann ich Templates durch ihre Nr einem Gebäude zuordnen.
Bsp: Template mit Nr.2 gehört zu Gebäude A. Wenn Nr.2 im Bild gefunden wird gib Gebäude A aus.
Ich kann dir im Moment nicht weiter helfen, da ich bis zum Jahreswechsel wegen Umstellungen keinen Zugang mehr zum Matlab-Rechner habe und das Problem so auch nicht finde.
Vielleicht hat ein anderer User eine Idee. Wenn sich keiner meldet frage noch einmal nach. Kann sein, dass in längeren Threads nicht alle mehr hinsehen und bei erneuter Anfrage vielleicht doch zur Lösung beitragen können.
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.