Sie sind auf Seite 1von 5

SeeingWithOpenCV

FollowThatFace!
d e s c r i b e di n l a s t m o n t h ' sa r t i c l e T
. o do rithmin moredetail
Lastmonth'sarticlein this t h a t , h o w e v e ry, o u ' d n e e dt o d e c i d ei f C a m s h i f tw a s o r i g i n a l l yd e v e l o p e d
f o r h a n d s - f r egea m i n g .l t ' s d e s i g n e dt o
seriesexplained how to tt hh ee fsaacme yeofua dc ee .t el fc tt eh dei ndeeat ec hcftroarmf i nedi ss be veryfast and
"lightweight"
so the
implement and configurem o r e t h a n o n e f a c e i n a f r a m e ,y o u ' d computer can do other tasks while
n e e d t o d e c i d ew h i c h d e t e c t i o ni s t h e t r a c k i n g .S i n c ei t w a s d e v e l o p e da s a
Thismonth, o n e y o u ' r e t r a c k i n g . F i n a l l y ,i f a
facedetection. g a m i n gi n t e r f a c eC t l s oh a sa n
, a m s h i fa
( l i m i t e d )a b i l i t y t o d e t e c t c h a n g e si n
l'll showyou howto use p e r s o n ' s h e a d t i l t s t o wp raorfdi lse o n e h e a d p o s i t i o n s, u c ha s t i l t i n gt h e h e a d
s h o u l d e ro, r t u r n st o w a r d s view,
OpenCV to trackataceonce t h e f r o n t a lf a c ed e t e c t o rw i l l n o l o n g e r t o o n e s i d e .C o u l dy o u u s e t h a t a b i l i t y
you'vedetectedit. r i o t c r t i t c n v n r r ' dn e p dt o h a n d l et h a t
Jv t o c o m m u n i c a t ew i t h y o u r r o b o t ?
tvu
"Come
s i t u a t i o na, s w e l l . M a y b et w o f a s t h e a dt i l t s m e a n
Fortunately,OpenCV includes h e r e ,r o b o t ! "
s p e c i a l i z e dc o d e f o r t r a c k i n g a f a c e F i g u r e 1 s h o w s O p e n C V ' sf a c e
FaceTrackingin e f f i c i e n t l y ,u s i n g c o n t i n u i t y b e t w e e n t r a c k e ri n a c t i o n- f o l l o w i n ga f a c e a s
OpenCV f r a m e st o h e l p f i n d t h e b e s t m a t c hf o r i t t i l t s t o o n e s i d ea n d d u r i n g a t u r n t o
t h e f a c ei t ' sf o l l o w i n g . p r o fi l e .
T r a c k i n ga f a c e i s m o r e d r f f i c u l t T h e a l g o r i t h mt h a t O p e n C Vu s e s
t h a n t r a c k i n ga s t r o n g l y - c o l o r eodb j e c t . for face tracking is called Camshift TheCamshiftDemo
S k i nr e f l e c t st h e a m b i e n tl i g h ti n s u b t l e , C a m s h i f tu s e s c o l o r i n f o r m a t i o n ,b u t
c h a n g i n g w a y s a s a p e r s o n ' sh e a d T h e O p e n C V s a m p l e sd i r e c t o r Y
r a t h e rt h a n r e l y i n go n a s i n g l ec o l o r ,i t
t u r n so r t i l t s . c o n t a i n sa p r o g r a m c a l l e d c a m s h r f t -
t r a c k sa c o m b i n a t i o no f c o l o r s .S i n c ei t
I n p r i n c i p l ey, o u c o u l dt r a c ka f a c e tracks by color, it can follow a face d e m o .Y o u c a n g e t s o m eg o o d h a n d s -
b y l o c a t i n gi t o v e r a n d o v e r I n e v e r y on experience
t h r o u g h o r i e n t a t i o nc h a n g e st h a t t h e a n d a n i n t u i t i v ef e e l f o r
frame, using the Haar detector H a a rd e t e c t o rc a n ' th a n d l eT the Camshifa
. h es i d e b a r , t l g o r i t h mw i t h t h i s d e m o
"How O p e n C V ' s p r o g r a m .H e r ea r e t h e s t e p sf o r d o i n g
FaceTracker
Works," t h a t :
e x p l a i n st h i s a l g o -
1 ) P l u gi n a w e b c a m .
F I G U R E1 . O p e n C V ' s
face tracker in action, 2 ) L a u n c ht h e p r o g r a mc a l l e dc a m s h i f t -
It's able to follow a d e m o i n t h e s a m p l e sd i r e c t o r y .
face as it tilts to one
s i d e a n d d u r i n ga t u r n ;
to profile. 3 ) U s ey o u r m o u s et o s e l e c a t rectangle
c e n t e r e dt i g h t l yo n y o u r f a c e .

4 ) C l i c k i n t h e v i d e o - d i s p l aw
yindow
and type the letter b. (The display
s h o u l dc h a n g et o l o o k s o m e t h i n gl i k e
t h e v i e w i n F i g u r e2 . )

FIGURE 2. Totunethe Camshiftparameters


smin drtd rmin" run the camshiftdemoI
i l
programin the samplesdirectory.These
parametersare easierto set if you toggle
to the backprojectionview by clickingin
the view window, then typing b,

36 srnvoo3.eoo7
t.t
- : e n C V ' sf a c et r a c k e ru s e sa n a l g o r i t h mc a l l e dC a m s h i f t , FIGUREA. Two examplesof
' - ' : c o n s i s tos f f o u r s t e P s : th€ color histogram that
Camshiftusesto represenla
.z-:e a color histogramto representthe face. face,

in OPenCV.
, :- ate a "faceprobability"for each pixelin the incoming backprojection"
'-':'::
Ihere's a built-in method
t h a t i m p l e m e n t si t , c a l l e d
^-.^^f ^n^^r,- ^l^^
- 'i the location .:_-_!!L^'
of the face rectanglein eachvid e o f r a m e . c v ( d . c d o c K P r o l e c .
..
Figure C shows the
- : : , l a t e t h e s i z ea n d a n g l e , f a c e - p r o b a b i l i t yi m a g e i n
o n e v i d e o f r a m ea s C a m s h i f t
'l : 'row each stePworks: tracks my face. Blackpixels
have the lowest probabilitY
white,the high-
.'eate a histogram.Camshift representsthe face it's v a l u g a n d
^ S ( a l s oc a l l e da b a r c h a r to) f c o l o rv a l u e s . est. Gray pixels lie somewherein the middle.
-. a sa h i s t o g r a m
'a A shows two example histogramsproduced by the
- =^ rft demo programthat shipswith OpenCV.The heightof 3) Shift to a new location. With each new video frame,
"shifts"its estimateof the face location,keepingit
-- colored bar indicateshow many pixels in an image Camshift
: . ldve that
"hue." Hue is one of three valuesdescribing centeredover the area with the highestconcentrationof
, e s c o l o r i n t h e H S V( H u e ,S a t u r a t i o nV,a l u e c) o l o r m o d e l . bright pixels in the face-probabilityimage.lt finds this new
' -ore on color and color models, see "Ihe World of f,ra"utlon OVttarting at the previow to.u-tionand computing
:' SERVO Magazine,November'05,) the cenler of gravityof the face-probabilityvalueswithin a
- the imageregionrepresentedby the top histogram,a rectangle.lt then shifts the rectangleso it's right over the
^ h u e i s m o s tc o m m o n ,a n d a s l i g h t l ym o r e l a v e n d e h r u e center of gravity. lt does this a few times to center the
:-e next most common, The bottom histogram shows a rectangle well. The OpenCV f unction cvcars rif - r )
location.
:a in which the most common hue is the rightmostbin. implementsthe stepsfor shiftingto the new
This process of shifting the rectangle to correspond with
. rue is almos! but not quite, red, "Mean
the center of gravityis based on an algorithmcalled
-atculate face probability - simpler than it sounds! fhe S h i f t , " b y D o r i n C o m a n i c i u ,I n f a c t , C a m s h i f ts t a n d s f o r
" C o n t i n u o u sAl yd a p t i v eM e a nS h i f t . "
::gram is created only once, at the start of tracking.
"face-probability" value to
:e'wards, it's used to assigna
-- rrrl6g€ pixel in the video frames that follow' 4) Calcutate size and angte. The OpenCV method is
"ContinuouslyAdaptive" and not just "Mean Shift"
Faceprobability"soundsterribly complicatedand heav- called
* athematical, but it's neither!Here'show it works.FigureB because it also adjusts the size and angle of the face
- ^'s the barsfrom a histogramstackedone atop the other. rectangleeach time it shifts it, lt does this by selectingthe
':e' stacking t h e m ,i t ' sc l e a rt h a t t h € r i g h t m o sbt a r a c c o u n t s s c a l e a n d o r i e n t a t i o n F I G U R E C. The normal and face-
- :oout 457oof the pixels in the region.That meansthe that are the best fit to probabilityviewsas Camshift tracks
:caoility that a pixel seleded randomlyfrom this region t h e f a c e - p r o b a b i l i t y m y f a c e . I n t h e f a c e - p r o b a b i l i t y
"faceprob- pixels inside the n€w view, black pixelshave the lowest
: - d fall into the rightmostbin is 45%.That'sthe
'- i,' for a pixelwith this hue.The samereasoningindicates r;."ii."
iu.ii"si" il:#2i1,"f"'f,lf,fil;f.',?
;?];?
:: tf'e face probabilitYfor
'z rext histogram b i nt o t h e
:-: ls about 2O7o,since it
-:rutts for about 207oof
stack's total
- :: s all there isto it..
As new video frames
' .e, the hue value for
':. pixel is determined.
'': r that,the facehistogram
, ..;sed to assign a face
-h€ight.

%
: c a b i l i t yt o t h e p i x e l .T h i s
"histogram
:cess is called
-:JRE B. To see what
..e probability" means/
:grre stacking t h e b a r si n
: histogram on€ atoP
'-e other. The probability
. . ; o c i a t e dw i t h e a c hc o l o ri s
' z p e r c e n lt h a t c o l o r b a r
: : rtributes to the total
-:ght of this stack.

3V
SERVOO3.2OO1
FIGURE3. The main not onlymy face,but halfthe roomas
program listing for well!Thereasonfor the oversized face
1- //// Constants detectinga face in a detectionis clearlyvisiblein the face-
2 const char * DISPLAY_WINDOUI= "Di-splayWindow"; live video stream,then
3 #def ine OPniCV_R@I "C: /Proqrarn Files/@enCv/1.0" tracking it using the probabilityview. Backgroundpixels
A Camshift wrapperAPl. with a nearlyneutralshadecontributed
5 //// cLoi:p.l variables too muchnoisewhen vrnindfld smin
5 Ipllmage * pvideoFramecopy = 0;
gray,or black).Color wereat theirdefaultvalues.
1
B void main( inc argc, char** argTv ) canbe computed for The middle and right views in
g { pixels that are Figure2 showthe effectof increasing
10 CvRect. * pFaceRect = 0; almost neutral,but first snj-n,then rzmin.In the right-hand
11 if( linitAllO ) exitprogram(-1); theircolorvaluesare view, noisy pixelshave been largely
L2
13 // Capture and display video frames until a face
unstable,and these eliminated,but the face region still
L4 // is detected pixels contribute producesa strongsignal.Trackingis
15 while( I ) noisethat interferes now quitegood,and the ellipseis well
1 6 { with tracking. oositioned.
L] / / Ir,ok for a face in the next video frame
fB capEureVideoFrameO;
Camshift uses
L9 pFaceRect = detectFace(pvideoFramecopy); two parameters Ihe SimpleCamshift
smin ood vmin - to
20
2I // Showthe display image screenout thisnoise.
Wrapper
22 cvSlor./Tfiage( DISPI,AY-WINffi,i. pVideoFrarreCoEl ) ;
23 if( (char)27==cvlvaitKey(1)) exitprogram(0);
These parameters OoenCVincludessourcecodefor
24 definethresholds for camshiftdemo, but it's not easy to
25 // *it loop when a face is detected ignoringpixelsthat adapt, since it combinesuser-input
26 if(pFaceRect) break; are too close to handlersand view togglingwith the
21 )
28
neutral.rrminsetsthe stepsfor facetracking.
"almost
29 // inLtLalize tracking threshold for lf you're programmingin C++,
30 startTracking(pVideoFrameCogl, pFaceRect); black,"and smi-nfor ratherthan in C, you could use the
31 "almostgray."
These CvCamShiftTracker class,defined in
32 / / Track the detected face using Camshift
33 while( I )
two thresholdlevels cvaux.hpp. Again,however,this class
3 4 { will need to be is fairly complex, with many I
35 CvBolD faceBox; adjusted for your interfaces, and is onlyavailableto C++ J

36 setup to get good programmers.


17 / / dcr lhe next video frame
?A ^ . n t s 1 , r 6 l / i A a ^ F r. a a m e ( l ;
resultswithCamshift. To make the Camshifttracker
39 Camshift also moreaccessible, l'vewrittena wrapper '
40 / / track the face in the new video frame usesa third parame- for it in C with four maininterfaces:
4L faceBox = track(pVideoFrameCopy); ter called r,rmax,to
42 )
set a thresholdfor 1) createTrackerO pre-allocates
43 // outli-ne face ellipse
44 cvEllipseBox(pvideoFramecopEr,faceBox, pixelsthat are too internaldatastructures. J

45 C V _ R G B ( 2 5 5 , 0 , 03) ., C V _ A A ,0 ) ; bright. But smin


46 cvShovulrnage(DISPIAY_WINDC&\I, pVideoFrarpCoEf ); has the side effect 2) releaselracker ( ) releasesthese J
4'1 if( (char)27==cwlaitKq/(l) ) break;
of also eliminating resources.
4 8 )
49 pixelsthat are close G

50 exitProgram(0); to white, so you 3) startrrackinsO initiatestracking aa


51 ) shouldn't need to f rom an image plus a rectangular a
tweak r,'maxto get region. t
5) Adjustthe slidersfor sminand vmin good results. :
untilthe ellipseis well positioned
and The easiestway to selectgood 4) tracko tracksthe object in this :s
the background is mostlyblack. valuesfor your setupis with camshift- region f rom f rame to f rame using r'6
demo.As suggested in the preceding Camshift. !:lo
6) RepeatStep 4 to toggle back to section,it's easierto set theseif you r:l
normal view, then use Camshiftto toggle the viewingmode by clicking Therearetwo additional
interfaces
trackyourface. the view window and typingb. (This for settingthe parameters
vmin and
alternativeviewis the calledthe "face- smrn: !l
"backprojection"
TuningCamshift probability,"or view. .1"5 I
It'sexplained in the sidebar.) 1) setvmino 0t
As mentioned above, Camshift Figure 2 shows the effect of 2) setsrnin() rraa
usesa combination of colorsto track adjustingsminondvrnj-n. Initially,
in the -
faces. In the representation that firstframe,thesewereat theirdefault TheCamshiftwrapperis onlineat
Camshiftuses,color is undefinedfor values.At these levels,Camshiftdis- www.cog notics.com/opencv/down -
pixelsthat havea neutralshade(white, playeda verylargeellipse that included loads/camshift-wra pper/i ndex.html. I

38 sEnvoo3.9oo7
FIGURE 4. ThehelperfunctionsinirAll ( )
and exitProgramO handle program
initializationand cleanup. 1 t-nt initAll o
2 t
3 if{ linicCapture{} ) return 0;
Combinins Face
-and 4
5
if ( !initFaceDet (OPn{CV_R@T
" /daLa/haarcascades/haarcascade_fronLaI f ace-def aulc . xn] " ) )
Detection Tracking 6 return 0;
7
In camshiftdemo, you neededto 8 // Sfarr'rn mpqq^da fplls rqpr how ro l-eoin and how tO exit
manuallyinitializetrackingwith the 9 pfintf ( \\ni*******************************************\n"
!
"To
mouse.For a roboticsapplication,it 10 exit, click inside the video display,\n"
1t- "then press
wouldbe muchnicerto initializetrack- the ESC key\n\n"
\ L2 "Press <mJIER>to begin"
'l ing automatically,usinga face detec- 13 \\\n********************************************\n/ ),
tion that the Haardetectorreturned. I4 fdof./cl-din\.

(Seelastmonth'sarticlefor detailson 15
implementing facedetection.) l6 // CrcarP fhe disnlaw windOw
L] cvNamedwindow( DISPLAY_WINmW, I );
Thissectionshowshow to do that t-8
usingthe Camshiftwrapperdescribed L9 / / IntLialtze t.racker
above.The programdescribedhere 20 n:nfr rrol/i donE r^ma / I '

detectsa face in a livevideostream, 21, if ( lcreateTracker(pVideoFramecopy) ) return 0;


22
or then tracks it with Camshift.The // Sef Camshift n:r:metefs
23
io sourcefor code for the complete 24 set\iinin(60);
Jt program,called"TrackFaces,"is also 25 setSmin(50);
he availableonline at www.cognotics. 26
com/opencv/down loads/camshift- 21 return 1;
28
wrapper/index.html.
ne
rn The Main Program
I ))
Figure3 showsthe mainprogram 1 void exitProgram(int code)
rry listingfor detectinga face in a live 2 {
videostream,thentrackingit usingthe 3 // Release resources allocated in this file
.++ 4 cvDestroyWindow ( DISPI"AY-WINDOW) ;
CamshiftwrapperAPl.(Thisportionis 5 cvReleaselmage ( &pvideoFrameCopy ) ;
ker in TrackFaces.c There
in the download.) 6
arethreemainprogramsegments: 1 // Release resources allocated in oLher projecc files
B .l^eoa^nfrrroll.

9 closeFaceDet ( ) ;
1) Detecta face.
10 -^t ^-^^m-^^t,^-
lElgoJg1!aLAYr
/ \ -
\ / i

)t e s 2) Startthe tracker. 11
3) Trackthe face. L2 exit (code) ;
L3 ]

rese 1) Detect a face. Lines 15-27


molementa looo to examinevideo 3) Trackthe face.Lines33-48contain datatyperepresents a rectanglewith a
'ramesuntil a face is detected.The the face-trackingloop.Eachcallto the rotation angle. The call to
krng :all to capLureVideoFrameO invokes wrapper'strackO method(line 41) cvEJ-lipseBox0at lines44-45 draws
't - 'l-:' r a helper method to bring in the invokesCamshiftto find the face the ellipsedefinedby thisbox.
-ext videoframeand createa copyof locationin the currentvideoframe.The
: (RecallfromPart1 of thisseries
that Camshiftresult is returnedas an HelperFunctions
t hl s : s neversafeto modifythe original OpenCVdatatypecalledcveoxzn.This In additionto the mainprogram,
r snl g . Jeo image!)The working copy is
.:rred as pVideoPramecopy, declared
:: rrne
6.
1 rrnid ^ ^ n t s , , r 6 \ I i d a ^ t r r . . -a]neo
races 2 {
and . Start the tracker.When a face is 3 / / Capture the next frame
:=:ected, the codeexitsthisloop(line 4 lplIrnage * pvideoFrarne = nextVideoFrameo;
- a and startsthe tracker(line 30), C if/ In\Iido^trr^mo I owirDr^dr:ml-11.

',; ng it the facerectanglefrom the 6


'7
// a nnz it f^ fha dicnlrrr im:aa inrzorfinc ir if nccdcd
",:'detector. t rt tvPl ufJPrsJ

B if( lpVideoFrameCopy )
Q n\/i danFr^maf-^n/ - .\raro:f FTm:ao /errCci-Qi zc ln\/i dcotrr:mel R ? \ .
tTGURE 5. The helper function J Pr Luuvl r\r,'LLwJ uY! \! vvvev+g

r-? aI '::reVideoFrame0. At line '11,the I n ^!,.^^,,


v v v v y j
/
\
^\/r
y v r v v v r
i ^ ^ E r . m ar t 4 , , v , nr/i rlaatr-:ma.an,,
y v 4 s ! v r r w , ! ! ! v t s J , 0 ) ;

Ll- if1 6==pVideoFramecopy->origin ) cvFlip(pvideoFrameCopy,0,0) ;


lown :all to cvFlipO flips the imageupside
L 2 \
html. or,vn if th" orisin fi"ld ir 0.

SERVO
03.e00739
detectFace ( )

. OpenCVon Sourceforge
http :// sourcef orge.na/ Proleds/
opencvllbrary
a,= .,

. Official OpenCVusergrouP
hllp: / / lech.groups.yahoo.com/
group/Open€V

. G.R.Bradski, "Computer videoface


trackingfor usein a perceptualuser
interface,"lntel TechnologyJournal,
Q9 1998.
. D. Comaniciuand P.Meer, "Robust
Analysisof FeatureSPaces:Color
fmageSegmentation,"CVPR,1997. ffClne 6. Th; detecipaceO function.
deliver image pixelsstarting at the
Themin-neighborsparameteris setto 6 to
. The Simple Camshift \VraPPer reduce the chance of a false detection. b o t t o m , r a t h e rt h a n a t t h e t o p , o f t h e
www.cognotics.com/opencv/down i m a g e T h er r ' : r . n f i e l di n d i c a t ewsh i c h
loads/camshilt-wr apger/ index. htmI a l l o c a t ten e t r a c k i n gd a t a ,b u t d o i n gs o r o w o r d e ' t h e l p l l m a g eu s e s . S o m e
speeds the transition from face O p e n C Vf u n c t i o n sw i l l o n l y w o r k c o r -
. Sourcecode in this articlecan be d e t e c t i o nt o t r a c k i n g T h e n e x t t w o r e c t l yw h e n t h e s ei m a g e sa r e i n v e r t e d .
downloaded from: statements (lines 24 25) set the F i n a l l y ,F i g u r e 6 c o n t a i n s t h e
www. cognotics. com/ ope ncv/ sewo n:rameters a n d . . :- : . . Ti r e b e s t r i e - e c i , : a r , -ie if u n c t i o n .A l t h o u g ht h i s
v a l u e st o u s e f o r t h e s e d e p e n d s o n code should be famlliarfrom last
T r a c k F a c ec s a l s o c o n t a i n s h e l p e r y o u r s e t u p ,s o i t ' s a g o o d i d e at o s e l e c t m o n t h ' s a r t i c l e , o n e p o i n t w o r t h
f u n c t i o n sf o r i n i t i a l i z a t i oann d c l e a n u p t h e m a h e a do f t i m e u s i n gt h e c a m s h i f t - n o t i n g i s t h a t t h e r r : r - r - , c , q : b o r ' : ' ,
i:,i t;---i ) a n d e x t , t i l ql al 1I . d e m o p r o g r a m ,a s d e s c r i b e da b o v e . p a r a m e t esr h o u l db e s e t h i g h e n o u g h
T h e s ea r e s h o w n i n F i g u r e4 . Figure 5 shows the listingfor t h a t f a l s ef a c ed e t e c t i o n as r e u n l i k e l y
A t l i n e 2 1 i n r - . : r . . .. 1 , t h e c a l l rl
-
.1' i t , . r : r . i : : f r l .A t l i n e 1 1 , a c a l l ( O t h e r w i s e ,y o u r r o b o t m i g h t s t a r t
to the Camshrft wraPper's to .- -,'' f l r p st h e i m a g eu p s i d e t r a c k i n gt h e r e f r i g e r a t om r a g n e t s l )A t
': i: function Pre- d o w n i f t h e l r r o ; r - .f i e l d i s O T h e l i n e 1 0 , l ' v e s e t i t t o 6 , w h i c h i s m o r e
a l l o c a t e st h e w r a p p e r ' si n t e r n a ld a t a reason for doingthrsisthatsomeweb- r e s t r i c t i vteh a n t h e d e f a u l tv a l u eo f 3
to pre- - ^ ^ A . .v ,c,r ^) . . ^c ).P^v^L -t o, i-l ,) r , 7O n W i n d o w s _
structures1t'snot necessarV LdtTr ur

ComingUp
Showthe punk with the volcono S o f a r ,t h e f a c e sw e ' v eb e e nf i n d i n g
a n d f o l l o w i n gh a v e b e e n a n o n y m o u s

o reol sciencefoir proiect. T l " er o b o tc a nt e l lt h e r e ' sa f a c ep r e s e n t ,


and can follow it, but has no waYof

\ t/ Poper Mdche hos been done.


k n o w i n gw h o s e f a c e i t i s . T h e p r o c e s s
o f l r n k i n gf a c e st o n a m e si s c a l l e df a c e
recognition OpenCV contains a
Build your proiect with c o m p l e t e i m p l e m e n t a t i o no f a f a c e -
some unique technology! recognitiom n e t h o dc a l l e de i g e n f a c e .
The remaining t w o a r t i c l e si n t h i s
s e r i e sw i l l e x p l a i nh o w t o u s eO p e n C V ' s
e i g e n f a c e i m p l e m e n t a t i o nf o r f a c e
r e c o g n i t i o nI .n t h e f i r s t o f t h e s e ,l ' l l
e x p l a i nh o w t h e a l g o r i t h mw o r k s a n d
n ^ .{-+.1-...^ ^{
g il ,vr (o ryrUn U
r r rl U
n rU1 qo lLnU .L(lFqAq +LtC d Udlduo)q Vl
"knows."
p e o p l ey o u r r o b o t Thearticle
f o l l o w i n gt h a t t a k e s y o u t h r o u g h t h e
s t e p s f o r r e c o g n i t i o nf r o m l i v e v i d e o ,
a n d g i v e sy o u t i p s t o h e l p y o u g e t t h e
m o s to u t o f e i g e n f a c e
B e s e e t n gy o u l

40 sEnvoo3.eoo7

Das könnte Ihnen auch gefallen