Objekterkennung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(15 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 6: Zeile 6:


== Ziel ==
== Ziel ==
ˆ* Vertiefung der Lehrveranstaltung Digitale Signal- und Bildverarbeitung.\
*Vertiefung der Lehrveranstaltung Digitale Signal- und Bildverarbeitung.\
ˆ* Vorstellung eines Konzeptes zur Objekterkennung
*Vorstellung eines Konzeptes zur Objekterkennung
ˆ* Umsetzung des Konzeptes in Matlab
*Umsetzung des Konzeptes in Matlab
ˆ* Einblendung der Objekte in das Videobild
*Einblendung der Objekte in das Videobild
 


== Aufgabe ==
== Aufgabe ==
Zeile 20: Zeile 19:
# Ermitteln Sie den Referenzpunkt (Mittelpunkt Vorderkante).
# Ermitteln Sie den Referenzpunkt (Mittelpunkt Vorderkante).
# Bestimmen Sie die Objektparameter gemäß [http://193.175.248.52/usvn/svn/MTR_SDE_Praktikum/trunk/Dokumentation/Fahrzeug/Schnittstellendokumentation.docx| Schnittstellendokumentation].
# Bestimmen Sie die Objektparameter gemäß [http://193.175.248.52/usvn/svn/MTR_SDE_Praktikum/trunk/Dokumentation/Fahrzeug/Schnittstellendokumentation.docx| Schnittstellendokumentation].
== Lösung ==
=== Einlesen des Videobildes ===
Um eine Erkennung aus dem Livebild zu ermöglichen, musste zuerst das Einlesen des Videobildes der Webcam implementiert werden. Hier wurde die ''videoinput'' Befehl der Image Acquisation Toolbox verwendet. Um eine geeignete Verarbeitungsgeschwindigkeit zu ermöglichen, wurde ein Timer implementiert, der die Weitergabe von 5 Bildern pro Sekunde an die Verarbeitung realisiert.
<source lang="matlab">
%% Webcam einbinden Parameter setzen
  vid = videoinput('winvideo', 1);
     
% Triggerkonfiguration
set(vid,'FramesPerTrigger',1);
set(vid,'TriggerRepeat',Inf);
set(vid,'ReturnedColorSpace','grayscale');
 
triggerconfig(vid, 'manual')
% Timer erstellen
TimerData=timer('TimerFcn', {@Bildverarbeitung,vid},'Period',1/Bildrate,'ExecutionMode','fixedRate','BusyMode','drop');
% Start video und Timer
start(vid);
start(TimerData);
</source>
=== Bearbeitung des Bildes ===
Um aus einem Kamerabild ein Objekt zu erkennen, muss man die Überlegung angehen, welche optischen Eigenschaften des Objekts eine gute Grundlage für eine Erkennung bieten. Da die weissen Kartons auf einer schwarzen Fahrbahn detektiert werden sollen, macht es Sinn, die starken Kanten des Kartons als Grundlage zu nehmen. Der lokale Kontrast am Übergang der Fahrbahn zum Karton ist relativ hoch, sodass diese Vorgehensweise sich anbietet.
Zuerst wurde jedoch das Bild zur Kantenerkennung vorbereitet. Hierzu wurde die automatische Kontrastanpassung ''imadjust'' aus der Image Processing Toolbox verwendet und das Bild über eine Schwellwertsegmentierung in ein Binärbild umgewandelt. Der Schwellwert wurde auf 0.8 festgelegt. Es wurde außerdem ein Außenrand von 100 Pixeln von der Auswertung ausgeschlossen, um eine geeignete RoI zu ermöglichen. Hierzu wurde eine Matrix erstellt, die in diesem Außenrand mit Einsen aufgefüllt wurde und in der RoI mit Nullen. Diese Matrix wurde dann auf die vorhandene Bildmatrix addiert, sodass der Außenrand komplett schwarz ist.
<source lang="matlab">
IMAGE = imadjust(IMAGE); %Automatische Kontrastanpassung
 
  %Rand mit 1en auffüllen
 
  bild_matrix((Aussenrand:(size(IMAGE,1)-Aussenrand)),(Aussenrand:size(IMAGE,2)-Aussenrand))=1;
   
    bild_bw = im2bw(IMAGE, 0.8); % Umwandeln des Graustufenbildes in ein b/w-Bild (Schwarz-Weiß oder auch binär) in Abhängigkeit des vorherbestimmten Schwellenwertes
</source>
Das Bild wurde nun nach Kanten gefiltert. Die Image Acquisation Toolbox bietet mit dem ''Edge''-Befehl die Möglichkeit, die verschiedenen Kantenfilter anzuwenden. Es stellte sich als gute Lösung heraus, das Bild erst mit dem LaPlacien of Gaussian (LoG)- Filter zu filtern und anschließend das Sobel-Filter anzuwenden.
<source lang="matlab">
bild_log = edge(bild_bw, 'log'); % LoG Filter
 
   
bild_sobel = edge(bild_log, 'sobel'); % Sobel Filter
</source>
Um irrelevante Objekte auszuschließen, wurden mit der Funktion ''bwareaopen'' Objekte unterhalb einer Grenze ausgelöscht. Anschließend wurden Felder, die von Kanten umschlossen sind, weiss aufgefüllt. Die vorhandenen Kanten wurden anschließend durch den ''strel''-Befehl hervorgehoben.
<source lang="matlab">
bild_area = bwareaopen(bild_sobel,800,8);
   
    bild_gefuellt = imfill(bild_area,'holes');% alle schwarzen Bereiche, die von weißen Kanten umgeben sind, auf weiß gesetzt
 
  se = strel('disk',10); % Hervorhebung der geschlossenen Kanten
 
  bild_gefuellt = imclose(bild_area,se);
</source>
[[Datei:ObjekterkennungHan2.png|mini|Bearbeitetes Bild]]
Die Erkennung großer einfarbiger Objekte ist nun gegeben, sodass die Objekte nun gelabelt und mit ihren Eigenschaften abgelegt werden können.
<source lang="matlab">
L = bwlabel( bild_area2,4); %Objekte Labeln
   
    stats = [regionprops(L)]; % Objektdaten anlegen
</source>
=== Anzeigen der Ergebnisse ===
Die Ergebnisse er Erkennung werden mit einem Roten Rechteck gekennzeichnet und der Mittelpunkt der Vorderkante wird mit einem roten 'X' markiert.
Um die Anzeige der Objekte auf die wichtigen Objekte zu beschränken, wurde der Quotient der Höhe zur Breite berechnet, um nur Objekte zu berücksichtigen, die für die Erkennung in Frage kommen. Fahrbahnlinien, die sehr lang und nicht sehr breit sind, oder andersherum, werden somit nicht markiert.
[[Datei:ObjekterkennungHan3.png|mini|Erkanntes Objekt]]
<source lang="matlab">
  % Rechteckerstellung für die erkannten Objekte
    for i=1:numel(stats)
        quot = (stats(i).BoundingBox(1,3))/(stats(i).BoundingBox(1,4));
       
        if ((quot<1 && quot>0) || (quot>1 && quot<2)) % Objekt wird nur erkannt, wenn das Seitenverhältnis plausibel ist
           
        % Rechteckerstellung um die erkannte Box
      Plot2 = rectangle('Position',stats(i).BoundingBox, ...
            'Linewidth',2,'EdgeColor','r','LineStyle','-');
     
        % Ermittlung des Mittelpunkts Vorderkante der Box
      MittelpunktVK = [(stats(i).BoundingBox(1,1))+(stats(i).BoundingBox(1,3)/2) (stats(i).BoundingBox(1,2))+(stats(i).BoundingBox(1,4))];
     
      hold on;
     
      % Plot eines X an dem Mittelpunkt der Vorderkante
        Plot2 = plot(MittelpunktVK(1,1),MittelpunktVK(1,2), 'Xr','Markersize',10);
        end
  </source>
== Video ==
Das Video des Funktionsnachweises findet sich auf [http://www.youtube.com/watch?v=qF0dPcufWQY&feature=share&list=PLoyKJifb3ROe_sKfT3y3paswSyiQ8xqm1&index=5 YouTube].


== Siehe auch ==
== Siehe auch ==
# '''Corke, P.:''' ''Robotics, Vision and Control''. Heidelberg: Springer Verlag, 2013. ISBN 978-3-642-20143-1
# '''Corke, P.:''' ''Robotics, Vision and Control''. Heidelberg: Springer Verlag, 2013. ISBN 978-3-642-20143-1
# '''Doege, K.-P.:''' ''Videodetektion im Straßenverkehr.'' München: Oldenbourg Wissenschaftsverlag
# '''Doege, K.-P.:''' ''Videodetektion im Straßenverkehr.'' München: Oldenbourg Wissenschaftsverlag GmbH, 2013. ISBN 978-3-486-70893-3
GmbH, 2013. ISBN 978-3-486-70893-3
# '''Tönnies, K. D.:''' ''Grundlagen der Bildverarbeitung.'' München: Pearson Studium, 2005. ISBN 3-8273-7155-4
# '''Tönnies, K. D.:''' ''Grundlagen der Bildverarbeitung.'' München: Pearson Studium, 2005.
# '''Mathworks:''' ''Object Detection, Motion Estimation, and Tracking.'' [http://www.mathworks.de/de/help/vision/motion-analysis-and-tracking.html| URL]
ISBN 3-8273-7155-4
# '''Mathworks:''' ''Object Detection, Motion Estimation, and Tracking.'' [http://www.
mathworks.de/de/help/vision/motion-analysis-and-tracking.html|URL]


== Weblinks ==
== Weblinks ==
ˆ* [http://www.mathworks.de/discovery/object-recognition.html| Objekterkennung mit Matlab]
*[http://www.mathworks.de/discovery/object-recognition.html| Objekterkennung mit Matlab]
ˆ* [http://www.mathworks.de/de/help/images/examples/index.html| Image Processing Toolbox Examples]
*[http://www.mathworks.de/de/help/images/examples/index.html| Image Processing Toolbox Examples]




----
----
→ zurück zum Hauptartikel: [[DSB_SoSe2014| Digitale Signal- und Bildverarbeitung SoSe2014]]
→ zurück zum Hauptartikel: [[DSB_SoSe2014| Digitale Signal- und Bildverarbeitung SoSe2014]]

Aktuelle Version vom 2. Juli 2014, 10:52 Uhr

Autor: Alexander Haneke
Betreuer: Prof. Schneider

Motivation

Kartons bilden die Objekte beim Carolo-Cup. Es bedarf einer robusten Objekterkennung auf Basis des Kamerabildes.

Ziel

  • Vertiefung der Lehrveranstaltung Digitale Signal- und Bildverarbeitung.\
  • Vorstellung eines Konzeptes zur Objekterkennung
  • Umsetzung des Konzeptes in Matlab
  • Einblendung der Objekte in das Videobild

Aufgabe

  1. Recherchieren Sie die theoretische Hintergründe der Objekterkennung.
  2. Recherchieren Sie welche Verfahren zur Objekterkennung und -verfolgung sich für unseren Fall anwenden lassen. Publikationen zu diesem Thema finden Sie beispielsweise [1].
  3. Unter Demos finden Sie ein Demo zur Objekterkennung. Dieses dürfen Sie gern für die Einarbeitung nutzen. Verändern sie es jedoch bitte nicht, sondern legen Sie einen Entwicklungszweig (Branch) in Ihrem Arbeitsverzeichnis an.
  4. Detektieren Sie die Kopierkartons im Videobild.
  5. Zeigen Sie die Kartonumrisse als Rechteck in Weltkoordinaten an.
  6. Ermitteln Sie den Referenzpunkt (Mittelpunkt Vorderkante).
  7. Bestimmen Sie die Objektparameter gemäß Schnittstellendokumentation.

Lösung

Einlesen des Videobildes

Um eine Erkennung aus dem Livebild zu ermöglichen, musste zuerst das Einlesen des Videobildes der Webcam implementiert werden. Hier wurde die videoinput Befehl der Image Acquisation Toolbox verwendet. Um eine geeignete Verarbeitungsgeschwindigkeit zu ermöglichen, wurde ein Timer implementiert, der die Weitergabe von 5 Bildern pro Sekunde an die Verarbeitung realisiert.

%% Webcam einbinden Parameter setzen 

   vid = videoinput('winvideo', 1);
      
% Triggerkonfiguration
set(vid,'FramesPerTrigger',1);
set(vid,'TriggerRepeat',Inf);
set(vid,'ReturnedColorSpace','grayscale');
  
 triggerconfig(vid, 'manual')

% Timer erstellen
TimerData=timer('TimerFcn', {@Bildverarbeitung,vid},'Period',1/Bildrate,'ExecutionMode','fixedRate','BusyMode','drop');

% Start video und Timer
start(vid);
start(TimerData);

Bearbeitung des Bildes

Um aus einem Kamerabild ein Objekt zu erkennen, muss man die Überlegung angehen, welche optischen Eigenschaften des Objekts eine gute Grundlage für eine Erkennung bieten. Da die weissen Kartons auf einer schwarzen Fahrbahn detektiert werden sollen, macht es Sinn, die starken Kanten des Kartons als Grundlage zu nehmen. Der lokale Kontrast am Übergang der Fahrbahn zum Karton ist relativ hoch, sodass diese Vorgehensweise sich anbietet. Zuerst wurde jedoch das Bild zur Kantenerkennung vorbereitet. Hierzu wurde die automatische Kontrastanpassung imadjust aus der Image Processing Toolbox verwendet und das Bild über eine Schwellwertsegmentierung in ein Binärbild umgewandelt. Der Schwellwert wurde auf 0.8 festgelegt. Es wurde außerdem ein Außenrand von 100 Pixeln von der Auswertung ausgeschlossen, um eine geeignete RoI zu ermöglichen. Hierzu wurde eine Matrix erstellt, die in diesem Außenrand mit Einsen aufgefüllt wurde und in der RoI mit Nullen. Diese Matrix wurde dann auf die vorhandene Bildmatrix addiert, sodass der Außenrand komplett schwarz ist.

IMAGE = imadjust(IMAGE); %Automatische Kontrastanpassung
   
   %Rand mit 1en auffüllen
   
   bild_matrix((Aussenrand:(size(IMAGE,1)-Aussenrand)),(Aussenrand:size(IMAGE,2)-Aussenrand))=1;
    
    bild_bw = im2bw(IMAGE, 0.8); % Umwandeln des Graustufenbildes in ein b/w-Bild (Schwarz-Weiß oder auch binär) in Abhängigkeit des vorherbestimmten Schwellenwertes

Das Bild wurde nun nach Kanten gefiltert. Die Image Acquisation Toolbox bietet mit dem Edge-Befehl die Möglichkeit, die verschiedenen Kantenfilter anzuwenden. Es stellte sich als gute Lösung heraus, das Bild erst mit dem LaPlacien of Gaussian (LoG)- Filter zu filtern und anschließend das Sobel-Filter anzuwenden.

bild_log = edge(bild_bw, 'log'); % LoG Filter
   
    
bild_sobel = edge(bild_log, 'sobel'); % Sobel Filter

Um irrelevante Objekte auszuschließen, wurden mit der Funktion bwareaopen Objekte unterhalb einer Grenze ausgelöscht. Anschließend wurden Felder, die von Kanten umschlossen sind, weiss aufgefüllt. Die vorhandenen Kanten wurden anschließend durch den strel-Befehl hervorgehoben.

 bild_area = bwareaopen(bild_sobel,800,8);
    
    bild_gefuellt = imfill(bild_area,'holes');% alle schwarzen Bereiche, die von weißen Kanten umgeben sind, auf weiß gesetzt
   
   se = strel('disk',10); % Hervorhebung der geschlossenen Kanten
   
   bild_gefuellt = imclose(bild_area,se);
Bearbeitetes Bild

Die Erkennung großer einfarbiger Objekte ist nun gegeben, sodass die Objekte nun gelabelt und mit ihren Eigenschaften abgelegt werden können.

 L = bwlabel( bild_area2,4); %Objekte Labeln
    
    stats = [regionprops(L)]; % Objektdaten anlegen




Anzeigen der Ergebnisse

Die Ergebnisse er Erkennung werden mit einem Roten Rechteck gekennzeichnet und der Mittelpunkt der Vorderkante wird mit einem roten 'X' markiert. Um die Anzeige der Objekte auf die wichtigen Objekte zu beschränken, wurde der Quotient der Höhe zur Breite berechnet, um nur Objekte zu berücksichtigen, die für die Erkennung in Frage kommen. Fahrbahnlinien, die sehr lang und nicht sehr breit sind, oder andersherum, werden somit nicht markiert.


Erkanntes Objekt


  % Rechteckerstellung für die erkannten Objekte
    for i=1:numel(stats)
        quot = (stats(i).BoundingBox(1,3))/(stats(i).BoundingBox(1,4));
        
        if ((quot<1 && quot>0) || (quot>1 && quot<2)) % Objekt wird nur erkannt, wenn das Seitenverhältnis plausibel ist
            
        % Rechteckerstellung um die erkannte Box
       Plot2 = rectangle('Position',stats(i).BoundingBox, ...
            'Linewidth',2,'EdgeColor','r','LineStyle','-');
       
        % Ermittlung des Mittelpunkts Vorderkante der Box
       MittelpunktVK = [(stats(i).BoundingBox(1,1))+(stats(i).BoundingBox(1,3)/2) (stats(i).BoundingBox(1,2))+(stats(i).BoundingBox(1,4))];
       
       hold on;
       
       % Plot eines X an dem Mittelpunkt der Vorderkante
        Plot2 = plot(MittelpunktVK(1,1),MittelpunktVK(1,2), 'Xr','Markersize',10);
        end


Video

Das Video des Funktionsnachweises findet sich auf YouTube.


Siehe auch

  1. Corke, P.: Robotics, Vision and Control. Heidelberg: Springer Verlag, 2013. ISBN 978-3-642-20143-1
  2. Doege, K.-P.: Videodetektion im Straßenverkehr. München: Oldenbourg Wissenschaftsverlag GmbH, 2013. ISBN 978-3-486-70893-3
  3. Tönnies, K. D.: Grundlagen der Bildverarbeitung. München: Pearson Studium, 2005. ISBN 3-8273-7155-4
  4. Mathworks: Object Detection, Motion Estimation, and Tracking. URL

Weblinks



→ zurück zum Hauptartikel: Digitale Signal- und Bildverarbeitung SoSe2014