From cfa7fcd7aa6d27b77ee7bdf96e09342b7bb36114 Mon Sep 17 00:00:00 2001 From: "Wang.Renzhu" Date: Tue, 2 Aug 2022 12:47:27 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=82=E9=85=8D=20=E6=95=B4=E5=BD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mediapipe/render/core/Filter.cpp | 8 +++ .../module/beauty/face_mesh_beauty_render.cc | 7 ++ .../render/module/beauty/face_mesh_module.h | 16 ++++- .../module/beauty/face_mesh_module_imp.cc | 3 +- .../module/beauty/face_mesh_module_imp.h | 28 +++++++- .../beauty/filters/FaceDistortionFilter.cpp | 35 +++++---- .../beauty/filters/FaceDistortionFilter.hpp | 4 +- .../Base.lproj/Main.storyboard | 71 ++++++++++++++++++- .../ViewController.mm | 14 +++- .../beauty/ios/framework/OlaFaceUnity.h | 3 + .../beauty/ios/framework/OlaFaceUnity.mm | 30 ++++++++ 11 files changed, 194 insertions(+), 25 deletions(-) diff --git a/mediapipe/render/core/Filter.cpp b/mediapipe/render/core/Filter.cpp index 7ae5eb2d4..ca511a0a2 100755 --- a/mediapipe/render/core/Filter.cpp +++ b/mediapipe/render/core/Filter.cpp @@ -653,6 +653,14 @@ Filter::Property* Filter::_getProperty(const std::string& name) { return &_stringProperties[name]; } + if (_vec2ArrayProperties.find(name) != _vec2ArrayProperties.end()) { + return &_vec2ArrayProperties[name]; + } + + if (_vec2Properties.find(name) != _vec2Properties.end()) { + return &_vec2Properties[name]; + } + return 0; } diff --git a/mediapipe/render/module/beauty/face_mesh_beauty_render.cc b/mediapipe/render/module/beauty/face_mesh_beauty_render.cc index 6643900a9..3cd0b0d77 100644 --- a/mediapipe/render/module/beauty/face_mesh_beauty_render.cc +++ b/mediapipe/render/module/beauty/face_mesh_beauty_render.cc @@ -170,6 +170,13 @@ namespace Opipe _olaBeautyFilter->setProperty("slim", slimFactor); } } + + void FaceMeshBeautyRender::setEye(float eyeFactor) { + _eyeFactor = eyeFactor; + if (_olaBeautyFilter) { + _olaBeautyFilter->setProperty("eye", eyeFactor); + } + } } diff --git a/mediapipe/render/module/beauty/face_mesh_module.h b/mediapipe/render/module/beauty/face_mesh_module.h index cfae1697f..b3dea02de 100644 --- a/mediapipe/render/module/beauty/face_mesh_module.h +++ b/mediapipe/render/module/beauty/face_mesh_module.h @@ -115,7 +115,21 @@ namespace Opipe /// 美白 virtual float getWhitening() = 0; - + + /// 瘦脸 + virtual float getSlim() = 0; + + virtual float getEye() = 0; + + /// 瘦鼻 + virtual float getNose() = 0; + + virtual void setSlim(float slim) = 0; + + + virtual void setNose(float nose) = 0; + + virtual void setEye(float eye) = 0; /// 磨皮 /// @param smoothing 磨皮 0.0 - 1.0 diff --git a/mediapipe/render/module/beauty/face_mesh_module_imp.cc b/mediapipe/render/module/beauty/face_mesh_module_imp.cc index fdeb36583..5184041e0 100644 --- a/mediapipe/render/module/beauty/face_mesh_module_imp.cc +++ b/mediapipe/render/module/beauty/face_mesh_module_imp.cc @@ -290,9 +290,8 @@ namespace Opipe facePoints.emplace_back( _lastLandmark.landmark(i).x(), _lastLandmark.landmark(i).y()); } Log("FaceMeshModule", "检测到人脸输完毕"); - } else { - _render->setFacePoints(facePoints); } + _render->setFacePoints(facePoints); return textureInfo; } diff --git a/mediapipe/render/module/beauty/face_mesh_module_imp.h b/mediapipe/render/module/beauty/face_mesh_module_imp.h index 51d3cdbf8..168907f54 100644 --- a/mediapipe/render/module/beauty/face_mesh_module_imp.h +++ b/mediapipe/render/module/beauty/face_mesh_module_imp.h @@ -96,20 +96,42 @@ namespace Opipe return _render->getWhitening(); } + float getEye() override { + return _render->getEye(); + } + + float getSlim() override { + return _render->getFace(); + } + + float getNose() override { + return _render->getNose(); + } /// 磨皮 /// @param smoothing 磨皮 0.0 - 1.0 - void setSmoothing(float smoothing) { + void setSmoothing(float smoothing) override { _render->setSmoothing(smoothing); } - /// 美白 /// @param whitening 美白 0.0 - 1.0 - void setWhitening(float whitening) { + void setWhitening(float whitening) override { _render->setWhitening(whitening); } + void setEye(float eye) override { + _render->setEye(eye); + } + + void setSlim(float slim) override { + _render->setFaceSlim(slim); + } + + void setNose(float nose) override { + _render->setNoseFactor(nose); + } + OpipeDispatch* currentDispatch() { return _dispatch.get(); } diff --git a/mediapipe/render/module/beauty/filters/FaceDistortionFilter.cpp b/mediapipe/render/module/beauty/filters/FaceDistortionFilter.cpp index 39c318db7..4097015f7 100644 --- a/mediapipe/render/module/beauty/filters/FaceDistortionFilter.cpp +++ b/mediapipe/render/module/beauty/filters/FaceDistortionFilter.cpp @@ -225,6 +225,12 @@ namespace Opipe return angle; } + Vector2 FaceDistortionFilter::_positionAt(int index) { + float x = (_facePoints[index].x - 0.5) * 2.0; + float y = (_facePoints[index].y - 0.5) * 2.0; + return Vector2(x, y); + } + void FaceDistortionFilter::setUniform() { if (_facePoints.size() > 60) @@ -236,15 +242,14 @@ namespace Opipe _filterProgram->setUniformValue("aspectRatio", height / width); - _filterProgram->setUniformValue("eye", _eye); _filterProgram->setUniformValue("slim", _slim); _filterProgram->setUniformValue("nose", _nose); //左眼放大 { - Vector2 point1 = Vector2(_facePoints[362].x, _facePoints[362].y); - Vector2 point2 = Vector2(_facePoints[263].x, _facePoints[263].y); - Vector2 point3 = Vector2(_facePoints[417].x, _facePoints[417].y); + Vector2 point1 = _positionAt(362); + Vector2 point2 = _positionAt(263); + Vector2 point3 = _positionAt(417); Vector2 center = point1.getCenter(point2); float distance = center.distance(point3); addPoint(center, distance / 2, distance / 2, 0.3, 1, 0.0f, 0.0f, 1); @@ -252,9 +257,9 @@ namespace Opipe //右眼放大 { - Vector2 point1 = Vector2(_facePoints[33].x, _facePoints[33].y); - Vector2 point2 = Vector2(_facePoints[133].x, _facePoints[133].y); - Vector2 point3 = Vector2(_facePoints[193].x, _facePoints[193].y); + Vector2 point1 = _positionAt(33); + Vector2 point2 = _positionAt(133); + Vector2 point3 = _positionAt(193); Vector2 center = point1.getCenter(point2); float distance = center.distance(point3); addPoint(center, distance / 2, distance / 2, 0.3, 1, 0.0f, 0.0f, 1); @@ -262,10 +267,10 @@ namespace Opipe //瘦左脸 { - Vector2 point1 = Vector2(_facePoints[136].x, _facePoints[136].y); - Vector2 point2 = Vector2(_facePoints[19].x, _facePoints[19].y); - Vector2 point3 = Vector2(_facePoints[234].x, _facePoints[234].y); - Vector2 point4 = Vector2(_facePoints[152].x, _facePoints[152].y); + Vector2 point1 = _positionAt(136); + Vector2 point2 = _positionAt(19); + Vector2 point3 = _positionAt(234); + Vector2 point4 = _positionAt(152); float angle = getRadius(point2, point1); addPoint(point1, point1.distance(point3), point1.distance(point4), 0.02, 2, angle, @@ -274,10 +279,10 @@ namespace Opipe } //瘦右脸 { - Vector2 point1 = Vector2(_facePoints[379].x, _facePoints[379].y); - Vector2 point2 = Vector2(_facePoints[19].x, _facePoints[19].y); - Vector2 point3 = Vector2(_facePoints[454].x, _facePoints[454].y); - Vector2 point4 = Vector2(_facePoints[152].x, _facePoints[152].y); + Vector2 point1 = _positionAt(379); + Vector2 point2 = _positionAt(19); + Vector2 point3 = _positionAt(454); + Vector2 point4 = _positionAt(152); float angle = getRadius(point2, point1); addPoint(point1, point1.distance(point3), point1.distance(point4), 0.02, 2, angle, diff --git a/mediapipe/render/module/beauty/filters/FaceDistortionFilter.hpp b/mediapipe/render/module/beauty/filters/FaceDistortionFilter.hpp index 81b8ce201..3b20c5e10 100644 --- a/mediapipe/render/module/beauty/filters/FaceDistortionFilter.hpp +++ b/mediapipe/render/module/beauty/filters/FaceDistortionFilter.hpp @@ -70,7 +70,9 @@ namespace Opipe float _u_min[20]; float _u_max[20]; int _types[20]; - float _u_facePoints[212]; + float _u_facePoints[980]; + + Vector2 _positionAt(int index); private: void generateDistoritionVBO(int numX, int numY, const GLfloat *imageTexUV); diff --git a/mediapipe/render/module/beauty/ios/example/OpipeBeautyModuleExample/OpipeBeautyModuleExample/Base.lproj/Main.storyboard b/mediapipe/render/module/beauty/ios/example/OpipeBeautyModuleExample/OpipeBeautyModuleExample/Base.lproj/Main.storyboard index e6a33c713..1326991b0 100644 --- a/mediapipe/render/module/beauty/ios/example/OpipeBeautyModuleExample/OpipeBeautyModuleExample/Base.lproj/Main.storyboard +++ b/mediapipe/render/module/beauty/ios/example/OpipeBeautyModuleExample/OpipeBeautyModuleExample/Base.lproj/Main.storyboard @@ -17,7 +17,7 @@ - + @@ -26,12 +26,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mediapipe/render/module/beauty/ios/example/OpipeBeautyModuleExample/OpipeBeautyModuleExample/ViewController.mm b/mediapipe/render/module/beauty/ios/example/OpipeBeautyModuleExample/OpipeBeautyModuleExample/ViewController.mm index 9c95af76e..9d76197cc 100644 --- a/mediapipe/render/module/beauty/ios/example/OpipeBeautyModuleExample/OpipeBeautyModuleExample/ViewController.mm +++ b/mediapipe/render/module/beauty/ios/example/OpipeBeautyModuleExample/OpipeBeautyModuleExample/ViewController.mm @@ -88,6 +88,8 @@ AVCaptureAudioDataOutputSampleBufferDelegate> { [super viewWillAppear:animated]; [self startCapture]; [[OlaFaceUnity sharedInstance] resume]; + [OlaFaceUnity sharedInstance].whiten = 0.0; + [OlaFaceUnity sharedInstance].smooth = 0.0; } - (void)setupSession { @@ -289,8 +291,16 @@ AVCaptureAudioDataOutputSampleBufferDelegate> { - (IBAction)beautyChanged:(UISlider *)sender { - [OlaFaceUnity sharedInstance].whiten = sender.value; - [OlaFaceUnity sharedInstance].smooth = sender.value; + if (sender.tag == 0) { + [OlaFaceUnity sharedInstance].whiten = sender.value; + [OlaFaceUnity sharedInstance].smooth = sender.value; + } else if (sender.tag == 1) { + [OlaFaceUnity sharedInstance].slim = sender.value; + } else if (sender.tag == 2) { + [OlaFaceUnity sharedInstance].eyeFactor = sender.value; + } else if (sender.tag == 3) { + [OlaFaceUnity sharedInstance].nose = sender.value; + } } @end diff --git a/mediapipe/render/module/beauty/ios/framework/OlaFaceUnity.h b/mediapipe/render/module/beauty/ios/framework/OlaFaceUnity.h index da055d662..3a5244c5f 100644 --- a/mediapipe/render/module/beauty/ios/framework/OlaFaceUnity.h +++ b/mediapipe/render/module/beauty/ios/framework/OlaFaceUnity.h @@ -16,6 +16,9 @@ typedef struct { @property (nonatomic) CGFloat whiten; @property (nonatomic) CGFloat smooth; +@property (nonatomic) CGFloat slim; +@property (nonatomic) CGFloat nose; +@property (nonatomic) CGFloat eyeFactor; + (instancetype)sharedInstance; diff --git a/mediapipe/render/module/beauty/ios/framework/OlaFaceUnity.mm b/mediapipe/render/module/beauty/ios/framework/OlaFaceUnity.mm index f186e0989..7677e5deb 100644 --- a/mediapipe/render/module/beauty/ios/framework/OlaFaceUnity.mm +++ b/mediapipe/render/module/beauty/ios/framework/OlaFaceUnity.mm @@ -113,6 +113,36 @@ _face_module->setSmoothing(smooth); } +- (CGFloat)slim +{ + return _face_module->getSlim(); +} + +- (void)setSlim:(CGFloat)slim +{ + _face_module->setSlim(slim); +} + +- (CGFloat)eyeFactor +{ + return _face_module->getEye(); +} + +- (void)setEyeFactor:(CGFloat)eyeFactor +{ + _face_module->setEye(eyeFactor); +} + +- (CGFloat)nose +{ + return _face_module->getNose(); +} + +- (void)setNose:(CGFloat)nose +{ + _face_module->setNose(nose); +} + - (void)resume { if (!_face_module) {