|
|
@ -215,24 +215,29 @@ class BeautyDemoPlan : public Plan { |
|
|
|
bool faceFound_ = false; |
|
|
|
bool faceFound_ = false; |
|
|
|
FaceFeatures features_; |
|
|
|
FaceFeatures features_; |
|
|
|
public: |
|
|
|
public: |
|
|
|
|
|
|
|
void setup(cv::Ptr<V4D> window) override { |
|
|
|
|
|
|
|
window->parallel([](cv::Ptr<cv::face::Facemark>& facemark){ |
|
|
|
|
|
|
|
#ifndef __EMSCRIPTEN__ |
|
|
|
|
|
|
|
facemark->loadModel("modules/v4d/assets/models/lbfmodel.yaml"); |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
facemark->loadModel("assets/models/lbfmodel.yaml"); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
cerr << "Loading finished" << endl; |
|
|
|
|
|
|
|
}, facemark_); |
|
|
|
|
|
|
|
} |
|
|
|
void infer(cv::Ptr<V4D> window) override { |
|
|
|
void infer(cv::Ptr<V4D> window) override { |
|
|
|
auto always = [](){ return true; }; |
|
|
|
auto always = [](){ return true; }; |
|
|
|
auto isTrue = [](bool& ff){ return ff; }; |
|
|
|
auto isTrue = [](bool& ff){ return ff; }; |
|
|
|
auto isFalse = [](bool& ff){ return !ff; }; |
|
|
|
auto isFalse = [](bool& ff){ return !ff; }; |
|
|
|
|
|
|
|
|
|
|
|
//Face landmark detector
|
|
|
|
|
|
|
|
try { |
|
|
|
try { |
|
|
|
#ifndef __EMSCRIPTEN__ |
|
|
|
|
|
|
|
facemark_->loadModel("modules/v4d/assets/models/lbfmodel.yaml"); |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
facemark_->loadModel("assets/models/lbfmodel.yaml"); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
window->graph(always); |
|
|
|
window->graph(always); |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
window->capture(); |
|
|
|
|
|
|
|
|
|
|
|
//Save the video frame as BGR
|
|
|
|
//Save the video frame as BGR
|
|
|
|
window->capture([](const cv::UMat &videoFrame, cv::UMat& in, cv::UMat& d) { |
|
|
|
window->fb([](const cv::UMat &framebuffer, cv::UMat& in, cv::UMat& d) { |
|
|
|
cvtColor(videoFrame, in, cv::COLOR_BGRA2BGR); |
|
|
|
cvtColor(framebuffer, in, cv::COLOR_BGRA2BGR); |
|
|
|
//Downscale the video frame for face detection
|
|
|
|
//Downscale the video frame for face detection
|
|
|
|
cv::resize(in, d, cv::Size(DOWNSIZE_WIDTH, DOWNSIZE_HEIGHT)); |
|
|
|
cv::resize(in, d, cv::Size(DOWNSIZE_WIDTH, DOWNSIZE_HEIGHT)); |
|
|
|
}, input_, down_); |
|
|
|
}, input_, down_); |
|
|
@ -376,51 +381,51 @@ int main() { |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
using namespace cv::v4d; |
|
|
|
using namespace cv::v4d; |
|
|
|
cv::Ptr<V4D> window = V4D::make(WIDTH, HEIGHT, "Beautification Demo", ALL, OFFSCREEN); |
|
|
|
cv::Ptr<V4D> window = V4D::make(WIDTH, HEIGHT, "Beautification Demo", ALL, OFFSCREEN); |
|
|
|
window->printSystemInfo(); |
|
|
|
// window->printSystemInfo();
|
|
|
|
window->setStretching(stretch); |
|
|
|
window->setStretching(stretch); |
|
|
|
|
|
|
|
|
|
|
|
if (!OFFSCREEN) { |
|
|
|
// if (!OFFSCREEN) {
|
|
|
|
window->imgui([window](ImGuiContext* ctx){ |
|
|
|
// window->imgui([window](ImGuiContext* ctx){
|
|
|
|
using namespace ImGui; |
|
|
|
// using namespace ImGui;
|
|
|
|
SetCurrentContext(ctx); |
|
|
|
// SetCurrentContext(ctx);
|
|
|
|
Begin("Effect"); |
|
|
|
// Begin("Effect");
|
|
|
|
Text("Display"); |
|
|
|
// Text("Display");
|
|
|
|
Checkbox("Side by side", &side_by_side); |
|
|
|
// Checkbox("Side by side", &side_by_side);
|
|
|
|
if(Checkbox("Stetch", &stretch)) { |
|
|
|
// if(Checkbox("Stetch", &stretch)) {
|
|
|
|
window->setStretching(true); |
|
|
|
// window->setStretching(true);
|
|
|
|
} else |
|
|
|
// } else
|
|
|
|
window->setStretching(false); |
|
|
|
// window->setStretching(false);
|
|
|
|
|
|
|
|
//
|
|
|
|
#ifndef __EMSCRIPTEN__ |
|
|
|
// #ifndef __EMSCRIPTEN__
|
|
|
|
if(Button("Fullscreen")) { |
|
|
|
// if(Button("Fullscreen")) {
|
|
|
|
window->setFullscreen(!window->isFullscreen()); |
|
|
|
// window->setFullscreen(!window->isFullscreen());
|
|
|
|
}; |
|
|
|
// };
|
|
|
|
#endif |
|
|
|
// #endif
|
|
|
|
|
|
|
|
//
|
|
|
|
if(Button("Offscreen")) { |
|
|
|
// if(Button("Offscreen")) {
|
|
|
|
window->setVisible(!window->isVisible()); |
|
|
|
// window->setVisible(!window->isVisible());
|
|
|
|
}; |
|
|
|
// };
|
|
|
|
|
|
|
|
//
|
|
|
|
Text("Face Skin"); |
|
|
|
// Text("Face Skin");
|
|
|
|
SliderInt("Blur", &blur_skin_kernel_size, 0, 128); |
|
|
|
// SliderInt("Blur", &blur_skin_kernel_size, 0, 128);
|
|
|
|
SliderFloat("Saturation", &skin_saturation, 0.0f, 100.0f); |
|
|
|
// SliderFloat("Saturation", &skin_saturation, 0.0f, 100.0f);
|
|
|
|
SliderFloat("Contrast", &skin_contrast, 0.0f, 1.0f); |
|
|
|
// SliderFloat("Contrast", &skin_contrast, 0.0f, 1.0f);
|
|
|
|
Text("Eyes and Lips"); |
|
|
|
// Text("Eyes and Lips");
|
|
|
|
SliderFloat("Saturation ", &eyes_and_lips_saturation, 0.0f, 100.0f); |
|
|
|
// SliderFloat("Saturation ", &eyes_and_lips_saturation, 0.0f, 100.0f);
|
|
|
|
End(); |
|
|
|
// End();
|
|
|
|
}); |
|
|
|
// });
|
|
|
|
} |
|
|
|
// }
|
|
|
|
#ifndef __EMSCRIPTEN__ |
|
|
|
#ifndef __EMSCRIPTEN__ |
|
|
|
auto src = makeCaptureSource(window, argv[1]); |
|
|
|
auto src = makeCaptureSource(window, argv[1]); |
|
|
|
window->setSource(src); |
|
|
|
window->setSource(src); |
|
|
|
// Sink sink = makeWriterSink(window, OUTPUT_FILENAME, src.fps(), cv::Size(WIDTH, HEIGHT));
|
|
|
|
// Sink sink = makeWriterSink(window, OUTPUT_FILENAME, src.fps(), cv::Size(WIDTH, HEIGHT));
|
|
|
|
// window->setSink(sink);
|
|
|
|
// window->setSink(sink);
|
|
|
|
#else |
|
|
|
#else |
|
|
|
Source src = makeCaptureSource(WIDTH, HEIGHT, window); |
|
|
|
auto src = makeCaptureSource(window); |
|
|
|
window->setSource(src); |
|
|
|
window->setSource(src); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
window->run<BeautyDemoPlan>(2); |
|
|
|
window->run<BeautyDemoPlan>(0); |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|