use KCF tracking instead of continuous detection when compiling for emscripten. also replace lighten_shadow with a simple contrast/brightness adjustment

pull/3471/head
kallaballa 2 years ago
parent 96739bf977
commit 0abc85ee83
  1. 4
      src/beauty/Makefile
  2. 60
      src/beauty/beauty-demo.cpp

@ -15,11 +15,11 @@ CXXFLAGS += -fpic
ifdef EMSDK ifdef EMSDK
LDFLAGS += --preload-file assets/ LDFLAGS += --preload-file assets/
endif endif
LIBS += -lm -lopencv_dnn -lopencv_face -lopencv_objdetect -lopencv_stitching -lopencv_tracking -lviz2d LIBS += -lm -lopencv_dnn -lopencv_face -lopencv_objdetect -lopencv_stitching -lviz2d
ifndef EMSDK ifndef EMSDK
LIBS += -lOpenCL LIBS += -lOpenCL
else else
LIBS += -llibprotobuf LIBS += -lopencv_video -lopencv_tracking -llibprotobuf
endif endif
.PHONY: all release debug clean distclean .PHONY: all release debug clean distclean

@ -14,8 +14,11 @@
#include <opencv2/tracking.hpp> #include <opencv2/tracking.hpp>
/** Application parameters **/ /** Application parameters **/
//uncomment to enable KCF tracking instead of continuous detection. #ifdef __EMSCRIPTEN__
//#define USE_TRACKER 1; //enables KCF tracking instead of continuous detection.
#define USE_TRACKER 1;
#endif
constexpr unsigned int WIDTH = 1920; constexpr unsigned int WIDTH = 1920;
constexpr unsigned int HEIGHT = 1080; constexpr unsigned int HEIGHT = 1080;
constexpr double SCALE = 0.125; constexpr double SCALE = 0.125;
@ -207,28 +210,28 @@ void boost_saturation(const cv::UMat &srcBGR, cv::UMat &dstBGR, uchar by) {
cvtColor(hls, dstBGR, cv::COLOR_HLS2BGR); cvtColor(hls, dstBGR, cv::COLOR_HLS2BGR);
} }
void lighten_shadows(const cv::UMat &srcBGR, cv::UMat &dstBGR, double percent) { //void lighten_shadows(const cv::UMat &srcBGR, cv::UMat &dstBGR, double percent) {
assert(srcBGR.type() == CV_8UC3); // assert(srcBGR.type() == CV_8UC3);
static cv::UMat hsv; // static cv::UMat hsv;
static vector<cv::UMat> hsvChannels; // static vector<cv::UMat> hsvChannels;
static cv::UMat valueFloat; // static cv::UMat valueFloat;
//
cvtColor(srcBGR, hsv, cv::COLOR_BGR2HSV); // cvtColor(srcBGR, hsv, cv::COLOR_BGR2HSV);
cv::split(hsv, hsvChannels); // cv::split(hsv, hsvChannels);
hsvChannels[2].convertTo(valueFloat, CV_32F, 1.0 / 255.0); // hsvChannels[2].convertTo(valueFloat, CV_32F, 1.0 / 255.0);
//
double minIn, maxIn; // double minIn, maxIn;
cv::minMaxLoc(valueFloat, &minIn, &maxIn); // cv::minMaxLoc(valueFloat, &minIn, &maxIn);
cv::subtract(valueFloat, minIn, valueFloat); // cv::subtract(valueFloat, minIn, valueFloat);
cv::divide(valueFloat, cv::Scalar::all(maxIn - minIn), valueFloat); // cv::divide(valueFloat, cv::Scalar::all(maxIn - minIn), valueFloat);
double minOut = (minIn + (1.0 * (percent / 100.0))); // double minOut = (minIn + (1.0 * (percent / 100.0)));
cv::multiply(valueFloat, cv::Scalar::all(1.0 - minOut), valueFloat); // cv::multiply(valueFloat, cv::Scalar::all(1.0 - minOut), valueFloat);
cv::add(valueFloat, cv::Scalar::all(minOut), valueFloat); // cv::add(valueFloat, cv::Scalar::all(minOut), valueFloat);
//
valueFloat.convertTo(hsvChannels[2], CV_8U, 255.0); // valueFloat.convertTo(hsvChannels[2], CV_8U, 255.0);
cv::merge(hsvChannels, hsv); // cv::merge(hsvChannels, hsv);
cvtColor(hsv, dstBGR, cv::COLOR_HSV2BGR); // cvtColor(hsv, dstBGR, cv::COLOR_HSV2BGR);
} //}
void iteration() { void iteration() {
try { try {
@ -239,7 +242,7 @@ void iteration() {
//TODO try FeatherBlender //TODO try FeatherBlender
static cv::detail::MultiBandBlender blender(true); static cv::detail::MultiBandBlender blender(true);
//BGR //BGR
static cv::UMat bgr, down, faceBgMask, blurred, lightened, saturated; static cv::UMat bgr, down, faceBgMask, blurred, reduced_contrast, saturated;
static cv::UMat frameOut(HEIGHT, WIDTH, CV_8UC3); static cv::UMat frameOut(HEIGHT, WIDTH, CV_8UC3);
static cv::UMat lhalf(HEIGHT * SCALE, WIDTH * SCALE, CV_8UC3); static cv::UMat lhalf(HEIGHT * SCALE, WIDTH * SCALE, CV_8UC3);
static cv::UMat rhalf(lhalf.size(), lhalf.type()); static cv::UMat rhalf(lhalf.size(), lhalf.type());
@ -325,9 +328,12 @@ void iteration() {
cv::bitwise_not(faceFgMaskGrey,faceFgMaskInvGrey); cv::bitwise_not(faceFgMaskGrey,faceFgMaskInvGrey);
boost_saturation(bgr,saturated,BOOST_LIP_AND_EYE_SATURATION); boost_saturation(bgr,saturated,BOOST_LIP_AND_EYE_SATURATION);
lighten_shadows(bgr, lightened, REDUCE_SHADOW); //reduce contrast
multiply(bgr, cv::Scalar(0.8, 0.8, 0.8), reduced_contrast);
//fix brightness
add(bgr, cv::Scalar(0.1, 0.1, 0.1), reduced_contrast);
cv::boxFilter(lightened, blurred, -1, cv::Size(BLUR_KERNEL_SIZE, BLUR_KERNEL_SIZE), cv::Point(-1, -1), true, cv::BORDER_REPLICATE); cv::boxFilter(reduced_contrast, blurred, -1, cv::Size(BLUR_KERNEL_SIZE, BLUR_KERNEL_SIZE), cv::Point(-1, -1), true, cv::BORDER_REPLICATE);
blender.prepare(cv::Rect(0, 0, WIDTH, HEIGHT)); blender.prepare(cv::Rect(0, 0, WIDTH, HEIGHT));
blender.feed(blurred, faceBgMaskGrey, cv::Point(0, 0)); blender.feed(blurred, faceBgMaskGrey, cv::Point(0, 0));
blender.feed(bgr, faceFgMaskInvGrey, cv::Point(0, 0)); blender.feed(bgr, faceFgMaskInvGrey, cv::Point(0, 0));

Loading…
Cancel
Save