WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Gebäudeerkennung/Segmentierung

 

Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 28.11.2012, 11:35     Titel:
  Antworten mit Zitat      
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)


Sehr peinlich!

Zuletzt bearbeitet von Hubertus am 28.11.2012, 11:48, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 28.11.2012, 11:44     Titel:
  Antworten mit Zitat      
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)
Private Nachricht senden Benutzer-Profile anzeigen
 
thegrandtheft
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2012, 14:44     Titel:
  Antworten mit Zitat      
Hallo Hubertus,

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 Smile

Vielen dank!

Gruß Tim
Private Nachricht senden Benutzer-Profile anzeigen
 
thegrandtheft
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2012, 11:39     Titel:
  Antworten mit Zitat      
So ich bin es mal wieder Smile

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?

Beste Grüße

Tim

Template.png
 Beschreibung:

Download
 Dateiname:  Template.png
 Dateigröße:  32.54 KB
 Heruntergeladen:  654 mal
K4.sobel.png
 Beschreibung:
Perspektive Gebäude

Download
 Dateiname:  K4.sobel.png
 Dateigröße:  2.48 MB
 Heruntergeladen:  715 mal
K1.sobel.png
 Beschreibung:
Original Gebäude

Download
 Dateiname:  K1.sobel.png
 Dateigröße:  2.32 MB
 Heruntergeladen:  642 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 07.12.2012, 07:36     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
thegrandtheft
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.12.2012, 13:18     Titel:
  Antworten mit Zitat      
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.

Gruß

Tim
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 10.12.2012, 15:58     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
thegrandtheft
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.12.2012, 18:00     Titel:
  Antworten mit Zitat      
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?

Tafeln.png
 Beschreibung:

Download
 Dateiname:  Tafeln.png
 Dateigröße:  465 Bytes
 Heruntergeladen:  678 mal
K3b.png
 Beschreibung:

Download
 Dateiname:  K3b.png
 Dateigröße:  4.34 KB
 Heruntergeladen:  648 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 10.12.2012, 19:41     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
thegrandtheft
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.12.2012, 17:54     Titel:
  Antworten mit Zitat      
Guten Abend,

ich habe mal etwas weiter gebastelt, anders kann man das nicht nennen, also bitte entschuldige den wahrscheinlich eher uneleganten code Wink

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.

Gruß und vielen Dank

Tim




Code:

max_ca = 0
index = 0

while max_ca < 0.65
   
   
       cov=rgb2gray(imread('haus1.jpg'));                                                       %Loacation-Foto
       tem1=rgb2gray(imread('fenster1.jpg'));                                                    %Template1
       %tem2=rgb2gray(imread('tuer.jpg'));                                                      %Template2
       %tem3=rgb2gray(imread('xxx.jpg'));
       %tem4=rgb2gray(imread('xxx.jpg'));
       %tem5=rgb2gray(imread('xxx.jpg'));
       
       
       
       
       [m,n]=size(tem1);                                                                        
       Icorr=normxcorr2(tem1,cov);
       [max_ca,imax]=max(abs(Icorr(:)));
       [yp,xp]=ind2sub(size(Icorr),imax(1));
       xy=[(xp-n) (yp-m)];
       
       index = index+1
       
       if index == 6
          break
         
       end
       
       
end

if max_ca > 0.65
          figure; imshow(cov)
          hold on
          rectangle('position',[xy(1) xy(2) n m],'edgecolor','b','linewidth',5)
         

else
    errordlg('Keine Location gefunden, bitte machen Sie ein neues Foto :-)')
 end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 12.12.2012, 07:55     Titel:
  Antworten mit Zitat      
Hallo Tim,

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)


Verarbeitung:

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:

Code:
figure; imshow(cov)
hold on
rect........

frame=getframe(gcf);
cov=frame2im(frame);


Speichern:
Code:
ResultFileName=['Res_' dd(nr).name];
imwrite(cov,ResultFileName,'tif');
catch
disp(['cannot process file_ 'dd(nr).name])
end
end


Jetzt musst du leider wieder "basteln", aber ich sehe, dass du das gut hin bekommst.

Alles Gute

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
thegrandtheft
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2012, 00:10     Titel:
  Antworten mit Zitat      
Hallo Hubertus,

vielen Dank, das hat mir sehr geholfen Smile Verstanden hab ich es mittlerweile auch zum größten Teil.

Eine Frage zum speichern :

Code:

ResultFileName=['Res_' dd(nr).name];
imwrite(cov,ResultFileName,'tif');
 


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.

Ratlose Grüße

Tim
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 14.12.2012, 07:24     Titel:
  Antworten mit Zitat      
Einlesen und Speichern funktioniert bei mir. Dann muss der Fehler "dazwischen" liegen. Noch einmal kurz zusammen gefasst:

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)

tem1=tem1+50;  % irgendeine Berechnung starten

cd 'C:\Ergebnisse\'   % Ergebnisse in einem anderen Ordner ablegen
ResultFileName=['_' dd(nr).name];
imwrite(tem1,ResultFileName,'tif');

 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
thegrandtheft
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 20.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.12.2012, 15:55     Titel:
  Antworten mit Zitat      
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 Smile


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.

Code:

for nr=1:len

.....Matching

if max_ca > 0.65
         
         
          rectangle('position',[xy(1) xy(2) n m],'edgecolor',farbe(nr),'linewidth',5)
       
y=nr;

         switch y
           
            case y==1
                disp('Gebäude A')
            case y==2
                disp('Gebäude A')
            case y==3
                disp('Gebäude B')
            case y==4
                disp('Gebäude B')
            otherwise
                disp(' Kein Gebäude gefunden')
               
        end          
 



Leider funktioniert es so nicht und ich weiß nicht warum, wenn z.b Template 3 und 4 im Bild gefunden wurden bekomme ich folgende Ausgabe:

TemplateC.tif
3

Keine Location gefunden
TemplateD.tif
4


Vielen Dank fürs drüberschauen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 16.12.2012, 16:13     Titel:
  Antworten mit Zitat      
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.

Viel Glück

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.