26.02.2014 Aufrufe

smart developer Ein Code für alle (Vorschau)

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Entwicklung<br />

Bada: Face Recognition App<br />

Abb. 2: Das Ergebnis eines Durchlaufs<br />

der App.<br />

Listing 1: Die Klasse RecognizerThread<br />

Phase werden die gefundenen Dateien nach<br />

Gesichtern durchsucht. In der vierten Phase<br />

vergleicht die App die gefundenen Gesichter<br />

miteinander und ermittelt das Gesichtspaar,<br />

das sich am meisten ähnelt.<br />

Beginnen Sie mit der Implementierung der<br />

ersten Phase in Run(). Legen Sie eine Face-<br />

Recognizer-Instanz auf dem Stack an und<br />

rufen Sie Construct() darauf auf. Damit ist<br />

der FaceRecognizer vollständig initialisiert.<br />

Die Fähigkeiten der Gesichtserkennung unterscheiden<br />

sich je nach Gerät. Um die App<br />

portabel zu gestalten, sollten Sie die Fähigkeit<br />

analysieren und die FaceRecognizer-Instanz<br />

anschließend im <strong>Code</strong> konfigurieren.<br />

Mit der Methode GetRange() erhalten Sie den<br />

Wertebereich eines Parameters des Face-<br />

Recog nizers. Die Methode übernimmt vier<br />

Referenzen vom Typ long. Der erste Parameter<br />

identifiziert den Parameter, der von<br />

GetRange() ausgelesen werden soll. In die<br />

anderen drei Parameter schreibt die Methode<br />

den Minimal- und Maximalwert des Parameters<br />

und die Schrittgröße dazwischen.<br />

Übergeben Sie der Methode die Konstante<br />

FACERECOGNIZER_MAXNUMBER_IMAGE, erhalten<br />

Sie die maximale Anzahl von Gesichtern zurück,<br />

die der FaceRecognizer pro Bild erkennen<br />

kann. Listing 2 zeigt die Implementierung<br />

des Tests. Verwenden Sie die Konstante<br />

FACERECOGNIZER_SCALE_IMAGE, erhalten Sie<br />

class RecognizerThread : public Osp::Base::Runtime::Thread {<br />

public:<br />

RecognizerThread();<br />

virtual ~RecognizerThread();<br />

void Init();<br />

void SetRecognizerThreadListener(RecognizerThreadListener &listener);<br />

virtual Osp::Base::Object * Run(void);<br />

virtual bool OnStart(void);<br />

virtual void OnStop(void);<br />

private:<br />

RecognizerThreadListener *_pListener;<br />

};<br />

Angaben über die Größe der Gesichter, die<br />

der FaceRecognizer erkennen kann. Dieser<br />

Wert verhält sich relativ zur Bildgröße.<br />

Grundsätzlich gilt: Je kleiner der Wert, desto<br />

kleiner die Gesichter, die erkannt werden<br />

können, aber desto höher ist der Rechenaufwand.<br />

GetSupportedFormListN() gibt einen<br />

Zeiger auf eine alloziierte Liste der unterstützten<br />

Bildformate zurück. Die Ergebnisse<br />

der Analyse können Sie mit AppLogDebug()<br />

auf den Output-View der IDE schreiben.<br />

Im nächsten Schritt sucht der Recognizer-<br />

Thread die Bilddateien zusammen. Legen Sie<br />

dazu eine ArrayList an, in der Sie die Ergebnisse<br />

der Suche ablegen. Die Klasse<br />

Osp::Io::Directory bildet einen Ordner ab,<br />

auf dessen Inhalt Sie mit einem<br />

Osp::Io::DirEnumerator iterieren können.<br />

Legen Sie ein Directory an und übergeben Sie<br />

im Construct()-Aufruf das Define mit dem<br />

Dateipfad zu den Bildern. ReadN() erzeugt<br />

einen DirEnumerator. Er gibt beim Aufruf von<br />

GetCurrentDirEntry() eine Instanz der<br />

Klasse Osp::Io::DirEntry zurück. Testen Sie<br />

mit IsDirectory(), ob es sich bei dem aktuell<br />

betrachteten Ordnereintrag um einen Ordner<br />

handelt. Ist dies nicht der Fall, erhalten<br />

Sie mit GetName() den Dateinamen des Ordnereintrages,<br />

den Sie dann auf das Suffix untersuchen.<br />

Handelt es sich um ein JPEG,<br />

fügen Sie den vollwertigen Pfad der Liste mit<br />

Dateipfaden hinzu. Hat MoveNext den gesamten<br />

Ordner durchlaufen und <strong>alle</strong> Ordnereinträge<br />

getestet, kommunizieren Sie über den<br />

Listener, wie viele Bilddateien gefunden wurden.<br />

Zur Implementierung des Listeners<br />

legen Sie nun die neue Klasse Recognizer‐<br />

ThreadListener an und definieren die virtuelle<br />

Methode OnFinishGrabbingFiles(), die<br />

die Anzahl der gefundenen Bilddateien als<br />

Parameter übernimmt. Listing 3 zeigt <strong>alle</strong><br />

Methoden des Listeners.<br />

Analysieren und zuordnen<br />

In der dritten Phase soll der Recognizer-<br />

Thread die gefundenen Bilddateien analysieren.<br />

Zur Speicherung der gefundenen Gesichter<br />

legen Sie eine weitere ArrayList an. Implementieren<br />

Sie eine Schleife zum Iterieren<br />

Listing 2: Anzahl der Gesichter festlegen<br />

long minValue, maxValue, steppingDelta, defaultValue;<br />

result r = faceRecognizer.GetRange(FACERECOGNIZER_MAXNUMBER_IMAGE, minValue, maxValue, steppingDelta, defaultValue);<br />

if (E_SUCCESS == r) {<br />

AppLogDebug("range of maximal number of faces per image:[%d .. %d] delta:%d default:%d", minValue, maxValue, steppingDelta,<br />

defaultValue);<br />

faceRecognizer.SetProperty(FACERECOGNIZER_MAXNUMBER_IMAGE, maxValue);<br />

}<br />

68<br />

02/2011 <strong>smart</strong>-<strong>developer</strong>.de

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!