3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.tizenopensource.org/license
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an AS IS BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
18 #include "FaceThread.h"
20 #define SAFE_DELETE(x) if (x) { delete x; x = null; }
22 using namespace Tizen::Base;
23 using namespace Tizen::Base::Collection;
24 using namespace Tizen::Base::Runtime;
25 using namespace Tizen::Graphics;
26 using namespace Tizen::Uix::Vision;
27 using namespace Tizen::Ui::Controls;
29 static const int PREVIEW_WIDTH = 320;
30 static const int PREVIEW_HEIGHT = 240;
33 FaceThread::FaceThread(void)
34 : __pFaceDetector(null)
35 , __pFaceReconizer(null)
36 , __pFInfoReference(null)
37 , __pFaceComponents(null)
38 , __pFaceRect(new Rectangle(0,0,0,0))
40 , __pPrevFaceBuffer(null)
41 , __pCurFaceBuffer(null)
45 FaceThread::~FaceThread(void)
47 SAFE_DELETE(__pFaceRect);
48 SAFE_DELETE(__pFaceComponents);
49 SAFE_DELETE(__pPrevFaceBuffer);
50 SAFE_DELETE(__pCurFaceBuffer);
54 FaceThread::Construct(void)
56 Thread::Construct(THREAD_TYPE_EVENT_DRIVEN);
61 FaceThread::OnStart(void)
67 FaceThread::OnStop(void)
73 FaceThread::SetFaceDetectData(FaceDetector *pFD, FaceRecognizer *pFR, FaceRecognitionInfo *pFI, FaceData *pFaceData, Form* pForm)
75 __pFaceDetector = pFD;
76 __pFaceReconizer = pFR;
77 __pFInfoReference = pFI;
78 __pFaceData = pFaceData;
79 __pFaceTrackerForm = pForm;
85 FaceThread::OnUserEventReceivedN (RequestId requestId, Tizen::Base::Collection::IList *pArgs)
87 __pFaceData->SetThreadCompleted(false);
89 ArrayList* pList = (Tizen::Base::Collection::ArrayList*)pArgs;
90 ByteBuffer* pCurBuffer = (ByteBuffer*)pList->GetAt(0);
92 __pCurFaceBuffer = __pFaceDetector->PreprocessDataN(*pCurBuffer, Dimension(PREVIEW_WIDTH, PREVIEW_HEIGHT), PIXEL_FORMAT_YCbCr420_PLANAR);
96 SAFE_DELETE(pCurBuffer);
98 TryReturn(__pCurFaceBuffer != null, , "Failed to create FaceBuffer");
100 static int frameCnt = 20;
101 static int similarity = 0;
102 static RunMode runMode = RUN_MODE_FACE_DETECTION;
106 case RUN_MODE_FACE_DETECTION:
108 IList *pFaceDetectList = __pFaceDetector->DetectFacesN(*__pCurFaceBuffer);
109 if (pFaceDetectList != null)
111 if (pFaceDetectList->GetCount() > 0)
113 Rectangle* pFaceRect = (Tizen::Graphics::Rectangle*)pFaceDetectList->GetAt(0);
114 __pFaceRect->SetBounds(pFaceRect->x , pFaceRect->y , pFaceRect->width,pFaceRect->height);
116 pFaceDetectList->RemoveAll(true);
117 __pFaceData->SetFaceDetected(true);
121 __pFaceData->SetFaceDetected(false);
124 SAFE_DELETE(pFaceDetectList);
126 if (__pFaceData->GetFaceDetected() == false)
130 __pFaceComponents = __pFaceDetector->ExtractFaceComponentsN(*__pCurFaceBuffer, *__pFaceRect);
131 if (__pFaceComponents == null)
135 ByteBuffer* pFeatureBuffer = __pFaceReconizer->ExtractFeatureN(*__pCurFaceBuffer,*__pFaceComponents);
136 if (pFeatureBuffer != null)
138 FaceRecognitionInfo *pFInfoCurrent = new FaceRecognitionInfo();
139 if (pFInfoCurrent != null)
141 result r = pFInfoCurrent->Construct(*pFeatureBuffer);
144 similarity = __pFaceReconizer->MeasureSimilarity(*__pFInfoReference, *pFInfoCurrent);
147 SAFE_DELETE(pFInfoCurrent);
148 SAFE_DELETE(pFeatureBuffer);
150 runMode = RUN_MODE_FACE_TRACKING;
154 runMode = RUN_MODE_FACE_DETECTION;
156 SAFE_DELETE(__pFaceComponents);
159 case RUN_MODE_FACE_TRACKING:
164 runMode = RUN_MODE_FACE_DETECTION;
169 if(E_SUCCESS == __pFaceDetector->GetFaceMovement(*__pPrevFaceBuffer, *__pCurFaceBuffer, *__pFaceRect, xDiff , yDiff))
171 __pFaceData->SetFaceDetected(true);
172 __pFaceRect->x += xDiff;
173 __pFaceRect->y += yDiff;
177 __pFaceData->SetFaceDetected(false);
178 runMode = RUN_MODE_FACE_DETECTION;
181 SAFE_DELETE(__pPrevFaceBuffer);
188 if(runMode == RUN_MODE_FACE_TRACKING)
190 __pPrevFaceBuffer = __pCurFaceBuffer;
191 __pCurFaceBuffer = null;
195 SAFE_DELETE(__pCurFaceBuffer);
198 __pFaceData->SetRectangle(*__pFaceRect);
199 __pFaceData->SetSimilarity(similarity);
201 __pFaceTrackerForm->SendUserEvent(RUN_MODE_FACE_DETECTION, null);
202 __pFaceData->SetThreadCompleted(true);