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) {