Objekterkennung: Unterschied zwischen den Versionen
(→Lösung) |
|||
Zeile 93: | Zeile 93: | ||
stats = [regionprops(L)]; % Objektdaten anlegen | stats = [regionprops(L)]; % Objektdaten anlegen | ||
</source> | </source> | ||
[[Datei:ObjekterkennungHan2.png|mini|Bearbeitetes Bild]] | |||
== Siehe auch == | == Siehe auch == |
Version vom 19. Juni 2014, 22:16 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
- Recherchieren Sie die theoretische Hintergründe der Objekterkennung.
- Recherchieren Sie welche Verfahren zur Objekterkennung und -verfolgung sich für unseren Fall anwenden lassen. Publikationen zu diesem Thema finden Sie beispielsweise [1].
- 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.
- Detektieren Sie die Kopierkartons im Videobild.
- Zeigen Sie die Kartonumrisse als Rechteck in Weltkoordinaten an.
- Ermitteln Sie den Referenzpunkt (Mittelpunkt Vorderkante).
- 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);
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
Siehe auch
- 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 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
- Mathworks: Object Detection, Motion Estimation, and Tracking. URL
Weblinks
→ zurück zum Hauptartikel: Digitale Signal- und Bildverarbeitung SoSe2014