Objekterkennung: Unterschied zwischen den Versionen
(→Ziel) |
|||
(12 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 19: | 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 == | ||
Zeile 27: | Zeile 145: | ||
== Weblinks == | == Weblinks == | ||
*[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] | |||
---- | ---- | ||
→ 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
- 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
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.
% 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
- 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