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