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

Alarmsymbol Erkennung

 

Canni
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2013, 11:38     Titel: Alarmsymbol Erkennung
  Antworten mit Zitat      
Hallo,

Ich mache gerade eine Projekt zur Erkennung von Alarmsignalen im Armaturenbrett. Meine Aufgabe ich so aufgebaut, dass ich von verschiedenen Armaturenbrettern das Alarmsymbol für ein zu nahes Auto erkennen lassen muss. Dazu stehen mir Videoaufnahme (.avi) vom Armaturenbrett zur Verfügung.

Da die Alarmsymbole aber ziemlich unterschiedlich sind, stehe ich vor einigen Problemen. Die Symbole können in der Farbe (rot, orange, grau) und in der Form (autoförmig/viereckiges Popup) sowie das Video in der Qualität variieren. Außerdem gibt es Spiegelungen und manche Armaturenbretter sind beleuchtet.

Zurzeit löse ich das Problem über eine Differenzbildanalyse und Schleife:


Code:

% Schleife
 

% Vorbereitung
 
bild=read(autovideo, 1);            % Video ist bereits eingelesen
r=1*bild(:,:,1);                  
 
n=anfang-1;
Bild_Wert=0;
bild=0;
bild_1=0;
bild_abw=0;
 
while Bild_Wert < 1
 
 n=n+1;
 bildspeicher_rot=r;

 bild=read(autovideo, n);           % Frame Nummer n lesen
                           
 r=1*bild(:,:,1);                   % Rotwert
 bild_1=abs(r-bildspeicher_rot);    % Differenzbild Berechnung

 bild_abw=bild_1;                   % Abweichungsbild in Graustufen
 bild_1=imadjust(bild_1);           % Kontrast erhöhen
 sw=graythresh(bild_1);             % Findet automatisch den Schwellenwert
 bild_1=im2bw(bild_1,sw);           % Umwandeln in schwarz-weiß / Binär
 
 bild_1=bwareaopen(bild_1,Pixel);   % Entferne objekte mit weniger Pixel  
 bild_1=imclearborder(bild_1,8);    % Alle zusammenhängende Punkte am Rand werden entfernt
 %bild_1=imfill(bild_1,'holes');    % Alle Löcher werden gefüllt.
 Bild_Wert=sum(sum(bild_1));        % Summe der Werte der Matrix
 
end
 


Leider schlägt das Tool jetzt schon bei kleinesten Bewegungen von Drehzahlzeiger aus. Ich könnte den Pixelwert höher setzten damit der Zeiger auch weggeschnitten wird. Aber das muss man wieder manuell machen, was ich gerne verhindern würde.

Ich habe vom jemanden den Tipp bekommen, dass, da der Zeiger relativ lang und dünn ist, ich ihn mit „shrink“ verschwinden lassen kann. Dazu habe ich aber nichts gefunden. Kann mir jemand sagen wie die Funktion in Matlab aussieht und/oder auch eine andere Möglichkeit nennen, wie ich Störobjekte (Spiegelungen/Blinker) entferne außer mit bwareaopen ?

Außerdem möchte ich gerne alle Pixel wegschneiden, die nicht die richtige Farbe haben (ich gehe jetzt erst mal nur von roten Symbolen aus). ich habe dazu was vom Threshvalue gehört. Weiß leider auch nicht wie ich diese einbauen kann. Soll so aussehen, dass man Matlab aus der Matrix alle Werte löscht, die kleiner als dieser Wert sind.

Wenn jemand Tipps zur Vorgehensweise hat, die vielleicht erfolgsversprechender ist, wäre ich natürlich auch sehr dankbar. Ich dachte mir, dass eine Differenzbildanalyse flexibler auf sich ändernde Symbole reagiert.

Beste Grüße
Canni
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: 18.01.2013, 12:59     Titel:
  Antworten mit Zitat      
Moin,

das sind gleich viele Fragen. Daher zunächst die Antwort auf die Funktion "shrink", die zu >>bwmorph gehört. Ob sie zum richtigen Resultat führt lässt sich nicht vorhersagen, da Bilder extrem empfindlich auf diese Funktion reagieren und zu nicht vorhersehbaren Ergebnissen führen. Dazu ein Beispiel. Das Bild gehört zu Matlab.

Code:
I=imread('circuit.tif');
figure; imshow(I)
bw=im2bw(I,0.5);   % 'Schwelle festlegen
bw2=~bw;
bw3=bwmorph(bw,'shrink',inf);
figure; imshow(bw3)



http://www.mathworks.de/de/help/images/ref/imclose.html
http://www.mathworks.de/de/help/images/ref/bwmorph.html


Ändere den Schwellwert und stelle fest, ob die Funktion passt. Ein 2. Weg wäre über die Mustererkennung. Die Symbole, die erscheinen, lassen sich bestimmt abschließend auflisten - oder sind sie noch vielfältiger?

Wenn sich die Bildqualität verschlechtert, vermutlich nimmt das Rauschen zu, müsste die richtige Funktion zum entrauschen gefunden werden. Eine, die nicht so stark die Kanten aufweicht.

Ich würde zunächst feststellen, ob dir die obige Funktion weiter hilft. Wenn nicht, kann man den nächsten Schritt angehen.

Soweit erst einmal und viel Glück

Hubertus


Nachtrag:

Versuche mal das:

Code:
I2=imclose(I,strel('disk',6);
Private Nachricht senden Benutzer-Profile anzeigen
 
Canni
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.01.2013, 23:34     Titel:
  Antworten mit Zitat      
Abend,

danke für die Hilfe, mit
Code:
bild_1=bwmorph(bild_1,'shrink',3)
kriege ich den Zeiger wirklich weg, muss dazu aber den Schwellwert sw höher setzen(0.7), damit die (leichten) Spiegelungen auch verschwinden.

Ich möchte die Aufnahmen gern synchron zur Zeit angeben, habe aber gesehen, dass es einen Delay gibt. Du weißt nicht zufällig, wie ich aus den Videos den Delay berechnen kann. Das Problem ist, dass der Delay variabel sein soll, also sich vergrößert oder verkleinert jenachdem wie gut die Qualität des Videos ist und die Lichtverhältnisse sind.

Wollte jetzt nicht unbedingt ein neues Thema dafür eröffnen.

Kannst du mir (obwohl das mit shrink funktioniert hat) auch noch kurz erklären, wie ich das mit den threshvalue bei den Farben machen kann. Also wenn ich alle Pixel entfernen möchte die keinen Rotwert von z.B. 150 haben?

Danke nochmal für die Hilfe

Canni
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: 19.01.2013, 10:29     Titel:
  Antworten mit Zitat      
Mit Video kenne ich mich nicht aus. Es gibt aber hier ein paar Videoexperten, die dir weiter helfen können. Das Indizieren von Farbwerten erfolgt wie:

Code:
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
ind=(R<150);
Y=R;
Y(ind)=0;
x=cat(3,Y,G,B);


Das geht natürlich nur bei der Vollfarbe Rot, sonst musst du in den anderen Auszügen sehen, ob dort noch Restwerte vorhanden sind.

Ein schönes Wochenende
Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Canni
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 27.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2013, 17:03     Titel:
  Antworten mit Zitat      
Vielen Dank erstmal dafür.

Sobald ich etwas Zeit finde, werde ich mich an Matlab setzen und es mal ausprobieren.

Grüße
Canni
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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.