美白 磨皮 work

This commit is contained in:
Wang.Renzhu 2022-07-28 14:19:01 +08:00
parent 6bd85ac487
commit 49e285db9c
30 changed files with 2563 additions and 2230 deletions

View File

@ -36,6 +36,11 @@ namespace Opipe {
return true;
}
void AlphaBlendFilter::setInputFramebuffer(Framebuffer* framebuffer,
RotationMode rotationMode,
int texIdx, bool ignoreForPrepared) {
Filter::setInputFramebuffer(framebuffer, rotationMode, texIdx, ignoreForPrepared);
}
bool AlphaBlendFilter::proceed(float frameTime,
bool bUpdateTargets/* = true*/) {

View File

@ -21,6 +21,10 @@ namespace Opipe {
_mix = mix;
}
void setInputFramebuffer(Framebuffer* framebuffer,
RotationMode rotationMode,
int texIdx, bool ignoreForPrepared) override;
public:
AlphaBlendFilter(Context *context);
virtual ~AlphaBlendFilter() {};

View File

@ -142,7 +142,7 @@ namespace Opipe {
}
_lockKey = lockKey;
_framebufferRetainCount = 1;
_framebufferRetainCount++;
Log("Framebuffer LOCK", "lock retainCount == :%d lockKey:%s 【framebufferCode:%s】",
_framebufferRetainCount,
lockKey.c_str(), _hashCode.c_str());
@ -152,7 +152,7 @@ namespace Opipe {
if (_framebufferRetainCount > 0) {
_framebufferRetainCount--;
} else {
// assert("过度释放 请检查"); 此处不要崩溃引用计数管理Framebuffer不会导致过度释放。
// assert("过度释放 请检查"); 此处不要崩溃引用计数管理Framebuffer不会导致过度释放。
}
if (lockKey != _lockKey) {
@ -169,7 +169,7 @@ namespace Opipe {
}
void Framebuffer::resetRetainCount() {
_framebufferRetainCount = 1;
_framebufferRetainCount = 0;
}
void *Framebuffer::frameBufferGetBaseAddress() {
@ -183,7 +183,7 @@ namespace Opipe {
return _width * 4;
}
//#if defined(__ANDROID__) || defined(ANDROID)
//#if PLATFORM == PLATFORM_ANDROID
// AHardwareBuffer_Desc& Framebuffer::getAHardwareBufferDesc(){
// return _graphicBufDes;
// }
@ -229,7 +229,7 @@ namespace Opipe {
CHECK_GL(glBindTexture(GL_TEXTURE_2D, 0));
CHECK_GL(glBindFramebuffer(GL_FRAMEBUFFER, 0));
// Opipe::Log("QuarameraGL", "_generateFramebuffer %d ", _framebuffer);
// Opipe::Log("QuarameraGL", "_generateFramebuffer %d ", _framebuffer);
}
Context *Framebuffer::getContext() {

View File

@ -91,7 +91,6 @@ Framebuffer* FramebufferCache::fetchFramebuffer(Context *context,
Log("Framebuffer 【命中缓存】", "hashcode:%s count:%d",
framebufferHashCodeKey.first.c_str(),
framebuffer->framebufferRetainCount());
framebuffer->resetRetainCount();
return framebuffer;
}
}

View File

@ -74,4 +74,61 @@ namespace Opipe
_filterProgram->setUniformValue("step", _step);
return Filter::proceed(frameTime, bUpdateTargets);
}
void LUTFilter::update(float frameTime) {
if (_inputFramebuffers.empty()) return;
if (!_enable) {
_framebuffer = _inputFramebuffers.begin()->second.frameBuffer;
Source::updateTargets(frameTime);
_framebuffer = 0;
return;
}
if (getContext()->isCapturingFrame && this == getContext()->captureUpToFilter) {
int captureWidth = getContext()->captureWidth;
int captureHeight = getContext()->captureHeight;
_framebuffer = getContext()->getFramebufferCache()->fetchFramebuffer(_context, captureWidth, captureHeight);
#if DEBUG
_framebuffer->lock(typeid(*this).name());
#else
_framebuffer->lock();
#endif
proceed(false);
_framebuffer->active();
getContext()->capturedFrameData = new unsigned char[captureWidth * captureHeight * 4];
CHECK_GL(glReadPixels(0, 0, captureWidth, captureHeight, GL_RGBA, GL_UNSIGNED_BYTE, getContext()->capturedFrameData));
_framebuffer->inactive();
#if DEBUG
_framebuffer->unlock(typeid(*this).name());
#else
_framebuffer->unlock();
#endif
} else {
// todo
Framebuffer* firstInputFramebuffer = _inputFramebuffers.begin()->second.frameBuffer;
RotationMode firstInputRotation = _inputFramebuffers.begin()->second.rotationMode;
if (!firstInputFramebuffer) return;
int rotatedFramebufferWidth = firstInputFramebuffer->getWidth();
int rotatedFramebufferHeight = firstInputFramebuffer->getHeight();
if (rotationSwapsSize(firstInputRotation))
{
rotatedFramebufferWidth = firstInputFramebuffer->getHeight();
rotatedFramebufferHeight = firstInputFramebuffer->getWidth();
}
if (_framebufferScale != 1.0) {
rotatedFramebufferWidth = int(rotatedFramebufferWidth * _framebufferScale);
rotatedFramebufferHeight = int(rotatedFramebufferHeight * _framebufferScale);
}
_framebuffer = getContext()->getFramebufferCache()->fetchFramebuffer(_context, rotatedFramebufferWidth, rotatedFramebufferHeight);
proceed(frameTime);
}
// _context->getFramebufferCache()->returnFramebuffer(_framebuffer);
_framebuffer = 0;
}
}

View File

@ -14,10 +14,15 @@ namespace Opipe
bool init(Context *context);
void setStep(float step);
virtual bool proceed(float frameTime = 0, bool bUpdateTargets = true) override;
virtual void update(float frameTime) override;
public:
LUTFilter(Context *context);
~LUTFilter(){};
~LUTFilter()
{
delete _framebuffer;
_framebuffer = nullptr;
};
float _step;
};

View File

@ -100,33 +100,21 @@ namespace Opipe {
if (_framebuffer != nullptr && (_framebuffer->getWidth() != rotatedFramebufferWidth ||
_framebuffer->getHeight() != rotatedFramebufferHeight)) {
_framebuffer = nullptr;
_framebuffer = 0;
}
if (_framebuffer == nullptr || (_framebuffer && _framebuffer->getTexture() != targetTextureId)) {
if (_framebuffer) {
delete _framebuffer;
_framebuffer = 0;
}
if (targetTextureId == -1) {
_framebuffer = getContext()->getFramebufferCache()->
fetchFramebuffer(_context,
rotatedFramebufferWidth,
rotatedFramebufferHeight);
_framebuffer->lock();
targetTextureId = _framebuffer->getTexture();
} else {
_framebuffer = getContext()->getFramebufferCache()->
fetchFramebufferUseTextureId(_context,
rotatedFramebufferWidth,
rotatedFramebufferHeight,
targetTextureId,
false,
targetTextureAttr);
_framebuffer->lock();
_targetFramebuffer = true;
}
if (_framebuffer == nullptr || _framebuffer->isDealloc) {
_framebuffer = getContext()->getFramebufferCache()->
fetchFramebuffer(_context,
rotatedFramebufferWidth,
rotatedFramebufferHeight,
false,
targetTextureAttr);
_framebuffer->lock();
}
if (_framebuffer) {
targetTextureId = _framebuffer->getTexture();
}
proceed(frameTime);

View File

@ -25,7 +25,7 @@ namespace Opipe {
public:
void runSync(std::function<void(void)> func, Context::ContextType type = Context::GPUImageContext);
void runAsync(std::function<void(void)> func, Context::ContextType type = Context::GPUImageContext,
bool async = false);
bool async = true);
void setGLThreadDispatch(GLThreadDispatch *glDispatch){
_glThreadDispatch = glDispatch;

View File

@ -141,7 +141,7 @@ void Source::updateTargets(float frameTime) {
target->setInputFramebuffer(_framebuffer, _outputRotation, _targets[target]);
}
for(auto& it : _targets){
for(auto& it : _targets) {
Target* target = it.first;
if (target == NULL) {
return;

View File

@ -29,11 +29,7 @@ namespace Opipe
FaceMeshBeautyRender::~FaceMeshBeautyRender()
{
if (_lutImage)
{
_lutImage->release();
_lutImage = nullptr;
}
_olaBeautyFilter->removeAllTargets();
if (_olaBeautyFilter)
{
@ -46,22 +42,38 @@ namespace Opipe
_outputFilter->release();
_outputFilter = nullptr;
}
if (_lutImage)
{
auto *framebuffer = _lutImage->getFramebuffer();
delete framebuffer;
_lutImage->release();
_lutImage = nullptr;
}
if (_inputFramebuffer) {
delete _inputFramebuffer;
_inputFramebuffer = nullptr;
}
_context->getFramebufferCache()->purge();
}
void FaceMeshBeautyRender::suspend()
{
_isRendering = true;
_isRendering = false;
}
void FaceMeshBeautyRender::resume()
{
_isRendering = false;
_isRendering = true;
}
TextureInfo FaceMeshBeautyRender::renderTexture(TextureInfo inputTexture)
void FaceMeshBeautyRender::renderTexture(TextureInfo inputTexture)
{
TextureInfo outputTexture;
outputTexture.frameTime = inputTexture.frameTime;
if (!_isRendering) {
return;
}
if (!_inputFramebuffer)
{
_inputFramebuffer = new Framebuffer(_context, inputTexture.width, inputTexture.height,
@ -77,10 +89,20 @@ namespace Opipe
Framebuffer::defaultTextureAttribures,
inputTexture.textureId);
}
_olaBeautyFilter->setInputFramebuffer(_inputFramebuffer);
_inputFramebuffer->lock();
_olaBeautyFilter->setInputFramebuffer(_inputFramebuffer, NoRotation, 0, true);
_olaBeautyFilter->update(inputTexture.frameTime);
_inputFramebuffer->unlock();
}
TextureInfo FaceMeshBeautyRender::outputRenderTexture(TextureInfo inputTexture)
{
if (_outputFilter == nullptr) {
return inputTexture;
}
TextureInfo outputTexture;
outputTexture.frameTime = inputTexture.frameTime;
auto *outputFramebuffer = _outputFilter->getFramebuffer();
if (outputFramebuffer) {
outputTexture.width = outputFramebuffer->getWidth();
@ -97,8 +119,6 @@ namespace Opipe
outputTexture.textureId = inputTexture.textureId;
outputTexture.ioSurfaceId = inputTexture.ioSurfaceId;
}
return outputTexture;
}

View File

@ -15,7 +15,9 @@ namespace Opipe {
void resume();
TextureInfo renderTexture(TextureInfo inputTexture);
void renderTexture(TextureInfo inputTexture);
TextureInfo outputRenderTexture(TextureInfo inputTexture);
/// 磨皮
float getSmoothing();

View File

@ -110,8 +110,25 @@ namespace Opipe
virtual void stopModule() = 0;
/// 磨皮
virtual float getSmoothing() = 0;
/// 美白
virtual float getWhitening() = 0;
/// 磨皮
/// @param smoothing 磨皮 0.0 - 1.0
virtual void setSmoothing(float smoothing) = 0;
/// 美白
/// @param whitening 美白 0.0 - 1.0
virtual void setWhitening(float whitening) = 0;
virtual TextureInfo renderTexture(TextureInfo inputTexture) = 0;
#if defined(__APPLE__)
virtual void processVideoFrame(CVPixelBufferRef pixelbuffer, int64_t timeStamp) = 0;
#endif

View File

@ -1,4 +1,5 @@
#include "face_mesh_module_imp.h"
#include "mediapipe/render/core/Context.hpp"
static const char* kNumFacesInputSidePacket = "num_faces";
static const char* kLandmarksOutputStream = "multi_face_landmarks";
@ -113,7 +114,7 @@ namespace Opipe
_render = nullptr;
});
}
delete _context;
_context = nullptr;
@ -121,12 +122,16 @@ namespace Opipe
void FaceMeshModuleIMP::suspend()
{
_render->suspend();
if (_render) {
_render->suspend();
}
}
void FaceMeshModuleIMP::resume()
{
_render->resume();
if (_render) {
_render->resume();
}
}
bool FaceMeshModuleIMP::init(void *env, void *binaryData,
@ -139,11 +144,10 @@ namespace Opipe
config.ParseFromArray(binaryData, size);
_olaContext = new OlaContext();
_context = _olaContext->glContext();
_render = new FaceMeshBeautyRender(_context);
#if defined(__ANDROID__)
_context->initEGLContext(env);
#endif
#if defined(__ANDROID__)
_context->initEGLContext(env);
#endif
_dispatch = std::make_unique<OpipeDispatch>(_context, nullptr, nullptr);
@ -155,6 +159,13 @@ namespace Opipe
_graph->addFrameOutputStream(kOutputVideo, MPPPacketTypePixelBuffer);
#endif
_isInit = true;
if (_render == nullptr) {
_dispatch->runSync([&] {
if (_render == nullptr) {
_render = new FaceMeshBeautyRender(_context);
}
});
}
return true;
}
@ -162,17 +173,17 @@ namespace Opipe
void FaceMeshModuleIMP::setLandmark(NormalizedLandmarkList landmark)
{
_lastLandmark = std::move(landmark);
if (_lastLandmark.landmark_size() == 0) {
#if defined(__APPLE__)
NSLog(@"没有人脸");
#endif
}
for (int i = 0; i < _lastLandmark.landmark_size(); ++i) {
#if defined(__APPLE__)
NSLog(@"######## Set Landmark[%d]: (%f, %f, %f)", i, _lastLandmark.landmark(i).x(),
_lastLandmark.landmark(i).y(), _lastLandmark.landmark(i).z());
#endif
}
// if (_lastLandmark.landmark_size() == 0) {
//#if defined(__APPLE__)
// NSLog(@"没有人脸");
//#endif
// }
// for (int i = 0; i < _lastLandmark.landmark_size(); ++i) {
//#if defined(__APPLE__)
// NSLog(@"######## Set Landmark[%d]: (%f, %f, %f)", i, _lastLandmark.landmark(i).x(),
// _lastLandmark.landmark(i).y(), _lastLandmark.landmark(i).z());
//#endif
// }
}
void FaceMeshModuleIMP::startModule()
@ -233,16 +244,29 @@ namespace Opipe
{
return textureInfo;
}
if (_render == nullptr) {
_dispatch->runSync([&] {
if (_render == nullptr) {
_render = new FaceMeshBeautyRender(_context);
}
});
}
_dispatch->runSync([&] {
textureInfo = _render->renderTexture(inputTexture);
// GLsync sync;
// _dispatch->runAsync([&] {
// _render->renderTexture(inputTexture);
// sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
// glFlush();
// });
// glWaitSync(sync, 0, GL_TIMEOUT_IGNORED);
// glDeleteSync(sync);
_render->renderTexture(inputTexture);
});
textureInfo = _render->outputRenderTexture(inputTexture);
return textureInfo;
}
// OlaContext* currentContext() {
// return _olaContext;
// }
}

View File

@ -81,6 +81,30 @@ namespace Opipe
virtual void setLandmark(NormalizedLandmarkList landmark);
/// 磨皮
float getSmoothing() override {
return _render->getSmoothing();
}
/// 美白
float getWhitening() override {
return _render->getWhitening();
}
/// 磨皮
/// @param smoothing 磨皮 0.0 - 1.0
void setSmoothing(float smoothing) {
_render->setSmoothing(smoothing);
}
/// 美白
/// @param whitening 美白 0.0 - 1.0
void setWhitening(float whitening) {
_render->setWhitening(whitening);
}
private:
std::unique_ptr<OpipeDispatch> _dispatch;
std::unique_ptr<OlaGraph> _graph;

View File

@ -79,6 +79,7 @@ namespace Opipe
if (factor7 < 0.999)
{
lowp vec3 mix116Color = mix(inputColor.rgb, mix115Color.rgb, factor7);
// lowp vec3 mix116Color = vec3(1.0);
mix12Color = mix(mix116Color.rgb, blurColor.rgb, opacityLimit);
}
else

View File

@ -64,48 +64,80 @@ namespace Opipe {
if (!FilterGroup::init(context)) {
return false;
}
_bilateralFilter = BilateralFilter::create(context);
addFilter(_bilateralFilter);
_lutFilter = LUTFilter::create(context);
_unSharpMaskFilter = UnSharpMaskFilter::create(context);
_unSharpMaskFilter->addTarget(_lutFilter, 0);
_bilateralAdjustFilter = BilateralAdjustFilter::create(context);
addFilter(_bilateralAdjustFilter);
_unSharpMaskFilter = UnSharpMaskFilter::create(context);
addFilter(_unSharpMaskFilter);
_lutFilter = LUTFilter::create(context);
_unSharpMaskFilter->addTarget(_lutFilter, 0);
_lookUpGroupFilter = FilterGroup::create(context);
_lookUpGroupFilter->addFilter(_unSharpMaskFilter);
_alphaBlendFilter = AlphaBlendFilter::create(context);
_faceDistortFilter = FaceDistortionFilter::create(context);
// addFilter(_lookUpGroupFilter);
// addFilter(_lutFilter);
_bilateralFilter->addTarget(_bilateralAdjustFilter, 1)->
addTarget(_alphaBlendFilter, 0);
// setTerminalFilter(_lutFilter);
_bilateralAdjustFilter->addTarget(_lookUpGroupFilter)->
addTarget(_alphaBlendFilter, 1)->addTarget(_faceDistortFilter);
_bilateralFilter = BilateralFilter::create(context);
addFilter(_bilateralFilter);
_bilateralAdjustFilter->addTarget(_lookUpGroupFilter)->addTarget(_alphaBlendFilter, 1);
_bilateralFilter->addTarget(_bilateralAdjustFilter, 1)->addTarget(_alphaBlendFilter, 0);
_alphaBlendFilter->setMix(0.0);
setTerminalFilter(_alphaBlendFilter);
_bilateralAdjustFilter->setOpacityLimit(0.6);
_bilateralFilter->setDistanceNormalizationFactor(2.746);
_bilateralFilter->setTexelSpacingMultiplier(2.7);
_unSharpMaskFilter->setBlurRadiusInPixel(4.0f, true);
_unSharpMaskFilter->setBlurRadiusInPixel(2.0f, false);
_unSharpMaskFilter->setIntensity(1.365);
_bilateralAdjustFilter->setOpacityLimit(0.6);
_bilateralFilter->setDistanceNormalizationFactor(2.746);
_bilateralFilter->setTexelSpacingMultiplier(2.7);
setTerminalFilter(_faceDistortFilter);
// _bilateralFilter = BilateralFilter::create(context);
// addFilter(_bilateralFilter);
//
// _bilateralAdjustFilter = BilateralAdjustFilter::create(context);
// addFilter(_bilateralAdjustFilter);
//
// _unSharpMaskFilter = UnSharpMaskFilter::create(context);
//
// _lutFilter = LUTFilter::create(context);
// _unSharpMaskFilter->addTarget(_lutFilter, 0);
//
// _lookUpGroupFilter = FilterGroup::create(context);
// _lookUpGroupFilter->addFilter(_unSharpMaskFilter);
//
// _alphaBlendFilter = AlphaBlendFilter::create(context);
// _faceDistortFilter = FaceDistortionFilter::create(context);
//
//
// _bilateralFilter->addTarget(_bilateralAdjustFilter, 1)->
// addTarget(_alphaBlendFilter, 0);
//
// _bilateralAdjustFilter->addTarget(_lookUpGroupFilter)->
// addTarget(_alphaBlendFilter, 1)->addTarget(_faceDistortFilter);
//
// _alphaBlendFilter->setMix(0.8);
//
// _unSharpMaskFilter->setBlurRadiusInPixel(4.0f, true);
// _unSharpMaskFilter->setBlurRadiusInPixel(2.0f, false);
// _unSharpMaskFilter->setIntensity(1.365);
//
// _bilateralAdjustFilter->setOpacityLimit(0.6);
//
// _bilateralFilter->setDistanceNormalizationFactor(2.746);
// _bilateralFilter->setTexelSpacingMultiplier(2.7);
//
// setTerminalFilter(_faceDistortFilter);
std::vector<Vec2> defaultFace;
return true;
}
@ -120,11 +152,10 @@ namespace Opipe {
void OlaBeautyFilter::setLUTImage(SourceImage *lutImage) {
_lutImage = lutImage;
_lutImage->retain();
if (_lutFilter) {
auto *framebuffer = _lutFilter->getFramebuffer();
framebuffer->resetRetainCount();
_lutImage->retain();
_lutImage->addTarget(_lutFilter, 1, true);
auto *framebuffer = lutImage->getFramebuffer();
_lutFilter->setInputFramebuffer(framebuffer, NoRotation, 1, true);
}
}
@ -139,21 +170,38 @@ namespace Opipe {
}
void OlaBeautyFilter::setSmoothing(float smoothing) {
smoothing = smoothing < -1 ? -1 : smoothing;
smoothing = smoothing > 1 ? 1 : smoothing;
_bilateralAdjustFilter->setOpacityLimit(smoothing);
if (_bilateralAdjustFilter == nullptr) {
return;
}
if (smoothing == 0.0) {
_bilateralAdjustFilter->setEnable(false);
} else {
_bilateralAdjustFilter->setEnable(true);
_bilateralAdjustFilter->setOpacityLimit(smoothing);
}
}
float OlaBeautyFilter::getSmoothing() {
return _bilateralAdjustFilter->getOpacityLimit();
if (_bilateralAdjustFilter) {
return _bilateralAdjustFilter->getOpacityLimit();
}
return 0.0;
}
void OlaBeautyFilter::setWhitening(float whitening) {
_alphaBlendFilter->setMix(whitening);
if (_alphaBlendFilter) {
_alphaBlendFilter->setMix(whitening);
}
_lutFilter->setStep(whitening);
}
float OlaBeautyFilter::getWhitening() {
return _alphaBlendFilter->getMix();
if (_alphaBlendFilter) {
return _alphaBlendFilter->getMix();
}
return 0.0;
}
}

View File

@ -108,7 +108,7 @@ namespace Opipe {
}
void UnSharpMaskFilter::setIntensity(float intensity) {
((UnSharpMaskFilter *)_unsharpMaskFilter)->setIntensity(intensity);
((UnSharpFilter *)_unsharpMaskFilter)->setIntensity(intensity);
}
void UnSharpMaskFilter::setBlurRadiusInPixel(float blurRadius,

View File

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1340"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "36B23935288934B100A41D9E"
BuildableName = "OpipeBeautyModuleExample.app"
BlueprintName = "OpipeBeautyModuleExample"
ReferencedContainer = "container:OpipeBeautyModuleExample.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
enableGPUFrameCaptureMode = "1"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "36B23935288934B100A41D9E"
BuildableName = "OpipeBeautyModuleExample.app"
BlueprintName = "OpipeBeautyModuleExample"
ReferencedContainer = "container:OpipeBeautyModuleExample.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "36B23935288934B100A41D9E"
BuildableName = "OpipeBeautyModuleExample.app"
BlueprintName = "OpipeBeautyModuleExample"
ReferencedContainer = "container:OpipeBeautyModuleExample.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -10,5 +10,13 @@
<integer>7</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>36B23935288934B100A41D9E</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View File

@ -16,14 +16,29 @@
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<slider opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.5" minValue="0.0" maxValue="1" translatesAutoresizingMaskIntoConstraints="NO" id="vhS-oS-Fej">
<rect key="frame" x="55" y="632" width="304" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="300" id="YLm-AJ-oyY"/>
</constraints>
<connections>
<action selector="beautyChanged:" destination="BYZ-38-t0r" eventType="valueChanged" id="j3u-PR-SZh"/>
</connections>
</slider>
</subviews>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="vhS-oS-Fej" firstAttribute="centerX" secondItem="8bC-Xf-vdC" secondAttribute="centerX" id="JJ0-gj-buS"/>
<constraint firstItem="6Tk-OE-BBY" firstAttribute="bottom" secondItem="vhS-oS-Fej" secondAttribute="bottom" constant="200" id="cTV-Ue-aqY"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="95p-Qv-uS6"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="30" y="84"/>
<point key="canvasLocation" x="28.985507246376812" y="83.705357142857139"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="PGT-KT-KdN">

View File

@ -50,6 +50,10 @@ AVCaptureAudioDataOutputSampleBufferDelegate> {
@implementation ViewController
- (void)dealloc {
[[OlaFaceUnity sharedInstance] dispose];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.pixelFormatType = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange;
@ -74,10 +78,15 @@ AVCaptureAudioDataOutputSampleBufferDelegate> {
}
- (void)viewWillDisappear:(BOOL)animated {
[[OlaFaceUnity sharedInstance] suspend];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self startCapture];
[[OlaFaceUnity sharedInstance] resume];
}
- (void)setupSession {
@ -132,8 +141,8 @@ AVCaptureAudioDataOutputSampleBufferDelegate> {
dimensions.height ==[[outputSettings objectForKey:@"Height"] intValue]) {
if (YES == [self.captureDevice lockForConfiguration:NULL] ) {
self.captureDevice.activeFormat = vFormat;
[self.captureDevice setActiveVideoMinFrameDuration:CMTimeMake(1,24)];
[self.captureDevice setActiveVideoMaxFrameDuration:CMTimeMake(1,24)];
[self.captureDevice setActiveVideoMinFrameDuration:CMTimeMake(1,30)];
[self.captureDevice setActiveVideoMaxFrameDuration:CMTimeMake(1,30)];
[self.captureDevice unlockForConfiguration];
}
}
@ -142,10 +151,12 @@ AVCaptureAudioDataOutputSampleBufferDelegate> {
- (void)setupRenderView {
if(!self.renderView){
_renderView = [[OlaMTLCameraRenderView alloc] initWithFrame:self.view.bounds];
_renderView = [[OlaMTLCameraRenderView alloc] initWithFrame:self.view.bounds shareContext:[[OlaFaceUnity sharedInstance] currentContext]];
_renderView.cameraDelegate = self;
_renderView.preferredFramesPerSecond = 30;
[self.renderView setBackgroundColor:[UIColor colorWithRed:0.9f green:0.9f blue:0.9f alpha:1.0f]];
[self.view addSubview:self.renderView];
[self.view sendSubviewToBack:self.renderView];
}
}
@ -249,8 +260,15 @@ AVCaptureAudioDataOutputSampleBufferDelegate> {
{
[[OlaFaceUnity sharedInstance] processVideoFrame:onScreenTexture.renderTarget timeStamp:frameTime];
return onScreenTexture.surfaceID;
FaceTextureInfo inputTexture;
inputTexture.width = onScreenTexture.size.width;
inputTexture.height = onScreenTexture.size.height;
inputTexture.textureId = onScreenTexture.openGLTexture;
inputTexture.ioSurfaceId = onScreenTexture.surfaceID;
inputTexture.frameTime = frameTime;
FaceTextureInfo result = [[OlaFaceUnity sharedInstance] render:inputTexture];
NSLog(@"result ioSurfaceId:%d", result.ioSurfaceId);
return result.ioSurfaceId;
}
@ -271,4 +289,10 @@ AVCaptureAudioDataOutputSampleBufferDelegate> {
}
- (IBAction)beautyChanged:(UISlider *)sender
{
[OlaFaceUnity sharedInstance].whiten = sender.value;
[OlaFaceUnity sharedInstance].smooth = sender.value;
}
@end

View File

@ -1,29 +1,29 @@
<Scheme LastUpgradeVersion="1000" version="1.3">
<BuildAction parallelizeBuildables="YES" buildImplicitDependencies="YES">
<Scheme version="1.3" LastUpgradeVersion="1000">
<BuildAction buildImplicitDependencies="YES" parallelizeBuildables="YES">
<BuildActionEntries>
<BuildActionEntry buildForArchiving="YES" buildForAnalyzing="YES" buildForRunning="YES" buildForProfiling="YES" buildForTesting="YES">
<BuildableReference BuildableIdentifier="primary" BlueprintIdentifier="F2FE34CE0C5C7AFE00000000" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BuildableName="OlaFaceUnityFramework.framework" BlueprintName="OlaFaceUnityFramework"></BuildableReference>
<BuildActionEntry buildForTesting="YES" buildForRunning="YES" buildForProfiling="YES" buildForAnalyzing="YES" buildForArchiving="YES">
<BuildableReference BlueprintIdentifier="F2FE34CE0C5C7AFE00000000" BuildableIdentifier="primary" BlueprintName="OlaFaceUnityFramework" BuildableName="OlaFaceUnityFramework.framework" ReferencedContainer="container:FaceUnityFramework.xcodeproj"></BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction shouldUseLaunchSchemeArgsEnv="YES" customLLDBInitFile="$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit" buildConfiguration="__TulsiTestRunner_Debug" selectedDebuggerIdentifier="Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier="Xcode.DebuggerFoundation.Launcher.LLDB">
<TestAction buildConfiguration="__TulsiTestRunner_Debug" shouldUseLaunchSchemeArgsEnv="YES" customLLDBInitFile="$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit" selectedDebuggerIdentifier="Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier="Xcode.DebuggerFoundation.Launcher.LLDB">
<Testables></Testables>
<BuildableProductRunnable runnableDebuggingMode="0">
<BuildableReference BlueprintName="OlaFaceUnityFramework" BuildableName="OlaFaceUnityFramework.framework" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BuildableIdentifier="primary" BlueprintIdentifier="F2FE34CE0C5C7AFE00000000"></BuildableReference>
<BuildableReference BuildableIdentifier="primary" BlueprintIdentifier="F2FE34CE0C5C7AFE00000000" BuildableName="OlaFaceUnityFramework.framework" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BlueprintName="OlaFaceUnityFramework"></BuildableReference>
</BuildableProductRunnable>
</TestAction>
<LaunchAction debugDocumentVersioning="YES" launchStyle="0" ignoresPersistentStateOnLaunch="NO" allowLocationSimulation="YES" debugServiceExtension="internal" useCustomWorkingDirectory="NO" customLLDBInitFile="$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit" selectedLauncherIdentifier="Xcode.DebuggerFoundation.Launcher.LLDB" buildConfiguration="Debug" selectedDebuggerIdentifier="Xcode.DebuggerFoundation.Debugger.LLDB">
<LaunchAction customLLDBInitFile="$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit" debugServiceExtension="internal" allowLocationSimulation="YES" useCustomWorkingDirectory="NO" debugDocumentVersioning="YES" buildConfiguration="Debug" selectedLauncherIdentifier="Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle="0" selectedDebuggerIdentifier="Xcode.DebuggerFoundation.Debugger.LLDB" ignoresPersistentStateOnLaunch="NO">
<EnvironmentVariables></EnvironmentVariables>
<BuildableProductRunnable runnableDebuggingMode="0">
<BuildableReference BuildableName="OlaFaceUnityFramework.framework" BlueprintName="OlaFaceUnityFramework" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BlueprintIdentifier="F2FE34CE0C5C7AFE00000000" BuildableIdentifier="primary"></BuildableReference>
<BuildableReference BuildableName="OlaFaceUnityFramework.framework" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BuildableIdentifier="primary" BlueprintName="OlaFaceUnityFramework" BlueprintIdentifier="F2FE34CE0C5C7AFE00000000"></BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction useCustomWorkingDirectory="NO" debugDocumentVersioning="YES" shouldUseLaunchSchemeArgsEnv="YES" buildConfiguration="__TulsiTestRunner_Release">
<ProfileAction debugDocumentVersioning="YES" buildConfiguration="__TulsiTestRunner_Release" shouldUseLaunchSchemeArgsEnv="YES" useCustomWorkingDirectory="NO">
<BuildableProductRunnable runnableDebuggingMode="0">
<BuildableReference BuildableName="OlaFaceUnityFramework.framework" BuildableIdentifier="primary" BlueprintName="OlaFaceUnityFramework" BlueprintIdentifier="F2FE34CE0C5C7AFE00000000" ReferencedContainer="container:FaceUnityFramework.xcodeproj"></BuildableReference>
<BuildableReference BlueprintIdentifier="F2FE34CE0C5C7AFE00000000" BuildableName="OlaFaceUnityFramework.framework" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BlueprintName="OlaFaceUnityFramework" BuildableIdentifier="primary"></BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction buildConfiguration="Debug"></AnalyzeAction>
<ArchiveAction revealArchiveInOrganizer="YES" buildConfiguration="Release"></ArchiveAction>
<ArchiveAction buildConfiguration="Release" revealArchiveInOrganizer="YES"></ArchiveAction>
</Scheme>

View File

@ -2,26 +2,26 @@
<Scheme version="1.3" LastUpgradeVersion="1000">
<BuildAction parallelizeBuildables="YES" buildImplicitDependencies="YES">
<BuildActionEntries>
<BuildActionEntry buildForProfiling="YES" buildForTesting="YES" buildForRunning="YES" buildForAnalyzing="YES" buildForArchiving="YES">
<BuildableReference BuildableIdentifier="primary" BlueprintName="mediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BlueprintIdentifier="F2FE34CED4660C9200000000" BuildableName="libmediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary.a"></BuildableReference>
<BuildActionEntry buildForAnalyzing="YES" buildForTesting="YES" buildForProfiling="YES" buildForRunning="YES" buildForArchiving="YES">
<BuildableReference BlueprintName="mediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary" BlueprintIdentifier="F2FE34CED4660C9200000000" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BuildableIdentifier="primary" BuildableName="libmediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary.a"></BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction selectedLauncherIdentifier="Xcode.DebuggerFoundation.Launcher.LLDB" customLLDBInitFile="$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit" buildConfiguration="__TulsiTestRunner_Debug" selectedDebuggerIdentifier="Xcode.DebuggerFoundation.Debugger.LLDB" shouldUseLaunchSchemeArgsEnv="YES">
<Testables></Testables>
<BuildableProductRunnable runnableDebuggingMode="0">
<BuildableReference BuildableName="libmediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary.a" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BuildableIdentifier="primary" BlueprintIdentifier="F2FE34CED4660C9200000000" BlueprintName="mediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary"></BuildableReference>
<BuildableReference BlueprintIdentifier="F2FE34CED4660C9200000000" BuildableName="libmediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary.a" BuildableIdentifier="primary" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BlueprintName="mediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary"></BuildableReference>
</BuildableProductRunnable>
</TestAction>
<LaunchAction debugDocumentVersioning="YES" allowLocationSimulation="YES" debugServiceExtension="internal" useCustomWorkingDirectory="NO" launchStyle="0" buildConfiguration="Debug" customLLDBInitFile="$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit" selectedDebuggerIdentifier="Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier="Xcode.DebuggerFoundation.Launcher.LLDB" ignoresPersistentStateOnLaunch="NO">
<LaunchAction launchStyle="0" selectedLauncherIdentifier="Xcode.DebuggerFoundation.Launcher.LLDB" ignoresPersistentStateOnLaunch="NO" debugDocumentVersioning="YES" useCustomWorkingDirectory="NO" debugServiceExtension="internal" customLLDBInitFile="$(PROJECT_FILE_PATH)/.tulsi/Utils/lldbinit" allowLocationSimulation="YES" buildConfiguration="Debug" selectedDebuggerIdentifier="Xcode.DebuggerFoundation.Debugger.LLDB">
<EnvironmentVariables></EnvironmentVariables>
<MacroExpansion>
<BuildableReference BlueprintIdentifier="F2FE34CED4660C9200000000" BuildableName="libmediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary.a" BlueprintName="mediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary" BuildableIdentifier="primary" ReferencedContainer="container:FaceUnityFramework.xcodeproj"></BuildableReference>
<BuildableReference BuildableName="libmediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary.a" BlueprintName="mediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary" ReferencedContainer="container:FaceUnityFramework.xcodeproj" BuildableIdentifier="primary" BlueprintIdentifier="F2FE34CED4660C9200000000"></BuildableReference>
</MacroExpansion>
</LaunchAction>
<ProfileAction shouldUseLaunchSchemeArgsEnv="YES" buildConfiguration="__TulsiTestRunner_Release" useCustomWorkingDirectory="NO" debugDocumentVersioning="YES">
<ProfileAction shouldUseLaunchSchemeArgsEnv="YES" useCustomWorkingDirectory="NO" debugDocumentVersioning="YES" buildConfiguration="__TulsiTestRunner_Release">
<MacroExpansion>
<BuildableReference BuildableName="libmediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary.a" BlueprintName="mediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary" BuildableIdentifier="primary" BlueprintIdentifier="F2FE34CED4660C9200000000" ReferencedContainer="container:FaceUnityFramework.xcodeproj"></BuildableReference>
<BuildableReference ReferencedContainer="container:FaceUnityFramework.xcodeproj" BlueprintName="mediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary" BlueprintIdentifier="F2FE34CED4660C9200000000" BuildableName="libmediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary.a" BuildableIdentifier="primary"></BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction buildConfiguration="Debug"></AnalyzeAction>

View File

@ -1,37 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>OlaFaceUnityFramework.xcscheme_^#shared#^_</key>
<dict>
<key>isShown</key>
<true/>
<key>orderHint</key>
<integer>5</integer>
</dict>
<key>_bazel_clean_.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>6</integer>
</dict>
<key>_idx_Scheme.xcscheme_^#shared#^_</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>mediapipe-render-module-beauty-ios-framework-OlaFaceUnityLibrary.xcscheme_^#shared#^_</key>
<dict>
<key>isShown</key>
<true/>
<key>orderHint</key>
<integer>4</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict/>
</dict>
</plist>

View File

@ -14,10 +14,17 @@ typedef struct {
@interface OlaFaceUnity : NSObject
@property (nonatomic) CGFloat whiten;
@property (nonatomic) CGFloat smooth;
+ (instancetype)sharedInstance;
- (void)currentContext;
- (EAGLContext *)currentContext;
- (void)resume;
- (void)suspend;
// 算法输入
- (void)processVideoFrame:(CVPixelBufferRef)pixelbuffer

View File

@ -38,7 +38,8 @@
}
}
+ (instancetype)sharedInstance {
+ (instancetype)sharedInstance
{
static OlaFaceUnity *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
@ -49,41 +50,39 @@
- (FaceTextureInfo)render:(FaceTextureInfo)inputTexture
{
TextureInfo rs;
rs.ioSurfaceId = inputTexture.ioSurfaceId;
if (_face_module) {
TextureInfo input;
input.width = inputTexture.width;
input.height = inputTexture.height;
input.ioSurfaceId = inputTexture.ioSurfaceId;
input.textureId = inputTexture.textureId;
input.frameTime = inputTexture.frameTime;
@autoreleasepool {
TextureInfo rs;
rs.ioSurfaceId = inputTexture.ioSurfaceId;
if (_face_module) {
TextureInfo input;
input.width = inputTexture.width;
input.height = inputTexture.height;
input.ioSurfaceId = inputTexture.ioSurfaceId;
input.textureId = inputTexture.textureId;
input.frameTime = inputTexture.frameTime;
rs = _face_module->renderTexture(input);
}
FaceTextureInfo result;
result.width = rs.width;
result.height = rs.height;
result.ioSurfaceId = rs.ioSurfaceId;
result.textureId = rs.textureId;
result.frameTime = rs.frameTime;
return result;
}
// - (EAGLContext *)currentContext
// {
// if (_face_module) {
// return _face_module->currentContext()->currentContext();
// }
// }
- (void)currentContext {
if (_face_module) {
_face_module->currentContext()->currentContext();
rs = _face_module->renderTexture(input);
}
FaceTextureInfo result;
result.width = rs.width;
result.height = rs.height;
result.ioSurfaceId = rs.ioSurfaceId;
result.textureId = rs.textureId;
result.frameTime = rs.frameTime;
return result;
}
}
- (EAGLContext *)currentContext
{
if (_face_module) {
return _face_module->currentContext()->currentContext();
}
}
- (void)processVideoFrame:(CVPixelBufferRef)pixelbuffer
timeStamp:(int64_t)timeStamp;
{
@ -94,4 +93,48 @@
_face_module->processVideoFrame(pixelbuffer, timeStamp);
}
- (CGFloat)whiten
{
return _face_module->getWhitening();
}
- (CGFloat)smooth
{
return _face_module->getSmoothing();
}
- (void)setWhiten:(CGFloat)whiten
{
_face_module->setWhitening(whiten);
}
- (void)setSmooth:(CGFloat)smooth
{
_face_module->setSmoothing(smooth);
}
- (void)resume
{
if (!_face_module) {
[self initModule];
}
_face_module->resume();
}
- (void)suspend
{
if (!_face_module) {
[self initModule];
}
_face_module->suspend();
}
- (void)dispose
{
_face_module->stopModule();
_face_module->suspend();
delete _face_module;
_face_module = nullptr;
}
@end