Skip to content

Commit fd64c0f

Browse files
committed
Add multiple faces rendering feature
Add multiple faces rendering feature
1 parent 0acaf13 commit fd64c0f

File tree

1 file changed

+89
-34
lines changed

1 file changed

+89
-34
lines changed

examples/ios/GPUPixelApp/ImageFilterController.mm

Lines changed: 89 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,19 @@
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

Comments
 (0)