1818@interface ImageFilterController () {
1919 GPUPixelView *gpuPixelView;
2020 std::shared_ptr<BeautyFaceFilter> beauty_face_filter_;
21- std::shared_ptr<FaceReshapeFilter> face_reshape_filter_;
22- std::shared_ptr<gpupixel::FaceMakeupFilter> lipstick_filter_;
23- std::shared_ptr<gpupixel::FaceMakeupFilter> blusher_filter_;
21+
22+ std::vector<std::shared_ptr<FaceReshapeFilter>> face_reshape_filters_array_;
23+ std::vector<std::shared_ptr<FaceMakeupFilter>> lipstick_filters_array_;
24+ std::vector<std::shared_ptr<FaceMakeupFilter>> blusher_filters_array_;
25+
26+ std::vector<std::shared_ptr<Filter>> render_filters_array_;
27+ int render_filters_array_count;
28+
2429 std::shared_ptr<SourceImage> gpuSourceImage;
2530 CADisplayLink *_displayLink;
31+
32+ std::vector<std::vector<float >> facesArray_;
33+ int facesNum_;
2634}
2735
2836//
@@ -40,6 +48,8 @@ @interface ImageFilterController () {
4048@property (strong , nonatomic ) UISegmentedControl *effectSwitch;
4149@property (strong , nonatomic ) UISlider *slider;
4250
51+ @property (assign , nonatomic ) BOOL isDidRecognizedFaces;
52+
4353@end
4454
4555@implementation ImageFilterController
@@ -103,38 +113,66 @@ -(void)initVideoFilter {
103113 gpupixel::GPUPixelContext::getInstance ()->runSync ([&] {
104114 gpuPixelView = [[GPUPixelView alloc ] initWithFrame: self .view.frame];
105115 [self .view addSubview: gpuPixelView];
106-
107-
108- lipstick_filter_ = LipstickFilter::create ();
109- blusher_filter_ = BlusherFilter::create ();
110116
111-
112- beauty_face_filter_ = BeautyFaceFilter::create ();
113- face_reshape_filter_ = FaceReshapeFilter::create ();
114117 // 将图像资源加载到GPUPixel图形引擎
115118 [self loadImageSourceToGPUPixel ];
116119 // 对图像进行人脸识别, 并赋值到需要人脸识别的滤镜中
117120 gpuSourceImage->RegFacesDetectorCallback ([=](std::vector<std::vector<float >> facesArray, int facesNum) {
118- // NSLog(@"facesNum = %d", facesNum);
119- if (facesNum > 0 ) {
120- lipstick_filter_->SetFaceLandmarks (facesArray[0 ]);
121- blusher_filter_->SetFaceLandmarks (facesArray[0 ]);
122- face_reshape_filter_->SetFaceLandmarks (facesArray[0 ]);
121+ if (self.isDidRecognizedFaces == NO ) {
122+ if (facesNum > 0 ) {
123+ facesArray_ = facesArray;
124+ facesNum_ = facesNum;
125+ }
126+
127+ self.isDidRecognizedFaces = YES ;
123128 }
124129 });
125-
126- // filter pipline
127- gpuSourceImage->addTarget (lipstick_filter_)
128- ->addTarget (blusher_filter_)
129- ->addTarget (face_reshape_filter_)
130- ->addTarget (beauty_face_filter_)
131- ->addTarget (gpuPixelView);
132130
133131 [gpuPixelView setBackgroundColor: [UIColor clearColor ]];
134132 [gpuPixelView setFillMode: (gpupixel: :TargetView: :PreserveAspectRatioAndFill)];
135-
136133 });
137134}
135+ - (void )setIsDidRecognizedFaces : (BOOL )isDidRecognizedFaces {
136+ _isDidRecognizedFaces = isDidRecognizedFaces;
137+
138+ for (int index = 0 ; index < facesNum_; index++) {
139+ std::shared_ptr<FaceMakeupFilter> lipstick_filter = LipstickFilter::create ();
140+ lipstick_filter->SetFaceLandmarks (facesArray_[index]);
141+ lipstick_filters_array_.push_back (lipstick_filter);
142+
143+ std::shared_ptr<FaceMakeupFilter> blusher_filter = BlusherFilter::create ();
144+ blusher_filter->SetFaceLandmarks (facesArray_[index]);
145+ blusher_filters_array_.push_back (blusher_filter);
146+
147+ std::shared_ptr<FaceReshapeFilter> face_reshape_filter = FaceReshapeFilter::create ();
148+ face_reshape_filter->SetFaceLandmarks (facesArray_[index]);
149+ face_reshape_filters_array_.push_back (face_reshape_filter);
150+ }
151+
152+ beauty_face_filter_ = BeautyFaceFilter::create ();
153+ [self addTarget: beauty_face_filter_];
154+
155+ for (int index = 0 ; index < facesNum_; index++) {
156+ [self addTarget: lipstick_filters_array_[index]];
157+ [self addTarget: blusher_filters_array_[index]];
158+ [self addTarget: face_reshape_filters_array_[index]];
159+ }
160+
161+ render_filters_array_.back ()->addTarget (gpuPixelView);
162+ }
163+ - (void )addTarget : (std::shared_ptr<Filter>)target {
164+ if (render_filters_array_count == 0 ) {
165+ gpuSourceImage->addTarget (target);
166+ render_filters_array_.push_back (target);
167+ render_filters_array_count = render_filters_array_count + 1 ;
168+ return ;
169+ }
170+
171+ render_filters_array_.back ()->addTarget (target);
172+ render_filters_array_.push_back (target);
173+ render_filters_array_count = render_filters_array_count + 1 ;
174+ }
175+
138176
139177- (void )backAction {
140178 // 销毁GPUPixel相关组件, 防止内存泄漏
@@ -148,9 +186,15 @@ - (void)destroyAction {
148186 _displayLink = nil ;
149187
150188 beauty_face_filter_ = nil ;
151- face_reshape_filter_ = nil ;
152- lipstick_filter_ = nil ;
153- blusher_filter_ = nil ;
189+ for (int index = 0 ; index < facesNum_; index++) {
190+ face_reshape_filters_array_[index] = nil ;
191+ lipstick_filters_array_[index] = nil ;
192+ blusher_filters_array_[index] = nil ;
193+ }
194+ for (int index = 0 ; index < render_filters_array_count; index++) {
195+ render_filters_array_[index] = nil ;
196+ }
197+
154198 [gpuPixelView removeFromSuperview ];
155199 gpuPixelView = nil ;
156200 gpuSourceImage = nil ;
@@ -236,22 +280,30 @@ - (void)setSaturationValue:(CGFloat)value{
236280
237281- (void )setThinFaceValue : (CGFloat)value {
238282 _thinFaceValue = value;
239- face_reshape_filter_->setFaceSlimLevel (value/100 );
283+ for (int index = 0 ; index < facesNum_; index++) {
284+ face_reshape_filters_array_[index]->setFaceSlimLevel (value/100 );
285+ }
240286}
241287
242288- (void )setEyeValue : (CGFloat)value {
243289 _eyeValue = value;
244- face_reshape_filter_->setEyeZoomLevel (value/50 );
290+ for (int index = 0 ; index < facesNum_; index++) {
291+ face_reshape_filters_array_[index]->setEyeZoomLevel (value/50 );
292+ }
245293}
246294
247295- (void )setLipstickValue : (CGFloat)value {
248296 _lipstickValue = value;
249- lipstick_filter_->setBlendLevel (value/10 );
297+ for (int index = 0 ; index < facesNum_; index++) {
298+ lipstick_filters_array_[index]->setBlendLevel (value/10 );
299+ }
250300}
251301
252302- (void )setBlusherValue : (CGFloat)value {
253303 _blusherValue = value;
254- blusher_filter_->setBlendLevel (value/10 );
304+ for (int index = 0 ; index < facesNum_; index++) {
305+ blusher_filters_array_[index]->setBlendLevel (value/10 );
306+ }
255307}
256308
257309- (void )displayLinkDidFire : (CADisplayLink *)displayLink {
@@ -272,10 +324,13 @@ -(void)onFilterSwitchChange:(UISegmentedControl *)sender{
272324 beauty_face_filter_->setBlurAlpha (0 );
273325 beauty_face_filter_->setSharpen (0 );
274326 beauty_face_filter_->setWhite (0 );
275- face_reshape_filter_->setFaceSlimLevel (0 );
276- face_reshape_filter_->setEyeZoomLevel (0 );
277- lipstick_filter_->setBlendLevel (0 );
278- blusher_filter_->setBlendLevel (0 );
327+ for (int index = 0 ; index < facesNum_; index++) {
328+ face_reshape_filters_array_[index]->setFaceSlimLevel (0 );
329+ face_reshape_filters_array_[index]->setEyeZoomLevel (0 );
330+ lipstick_filters_array_[index]->setBlendLevel (0 );
331+ blusher_filters_array_[index]->setBlendLevel (0 );
332+ }
333+
279334 }
280335}
281336
0 commit comments