Commit 2a0f9fcd authored by 宋柯's avatar 宋柯

眉毛

parent 8c372a36
......@@ -4,25 +4,6 @@
#include<string.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int f_EyeBrow(unsigned char* srcData, int width, int height, int stride, int srcFacePoints[2*3], unsigned char* mskData, int mWidth, int mHeight, int mStride, int maskKeyPoints[2 * 3], bool isLeft, int ratio)
{
if(isLeft)
{
int srcKeyPoints[2 * 3] = {srcFacePoints[2 * 0], srcFacePoints[2 * 0 + 1], srcFacePoints[2 * 1], srcFacePoints[2 * 1 + 1], srcFacePoints[2 * 2], srcFacePoints[2 * 2 + 1]};
return f_MakeupBase(srcData, width, height, stride,srcKeyPoints, mskData, mWidth, mHeight, mStride, maskKeyPoints, ratio);
}
else
{
int srcKeyPoints[2 * 3] = {srcFacePoints[2 * 0], srcFacePoints[2 * 0 + 1], srcFacePoints[2 * 1], srcFacePoints[2 * 1 + 1], srcFacePoints[2 * 2], srcFacePoints[2 * 2 + 1]};
return f_MakeupBase(srcData, width, height, stride,srcKeyPoints, mskData, mWidth, mHeight, mStride, maskKeyPoints, ratio);
}
};
#include <Poco/Stopwatch.h>
#include "Poco/Net/HTTPSClientSession.h"
#include <Poco/URI.h>
......@@ -40,6 +21,22 @@ int f_EyeBrow(unsigned char* srcData, int width, int height, int stride, int src
using namespace cv;
using namespace Poco;
using namespace Poco::Net;
using namespace std;
int f_EyeBrow(unsigned char* srcData, int width, int height, int stride, int srcFacePoints[2*3], unsigned char* mskData, int mWidth, int mHeight, int mStride, int maskKeyPoints[2 * 3], bool isLeft, int ratio)
{
return f_MakeupBase(srcData, width, height, stride,srcFacePoints, mskData, mWidth, mHeight, mStride, maskKeyPoints, ratio);
};
int f_EyeBrowTest(Mat& srcData, int width, int height, int stride, int srcFacePoints[2*3],Mat& mskData, int mWidth, int mHeight, int mStride, int maskKeyPoints[2 * 3], bool isLeft, int ratio,Mat& maskMat)
{
int srcKeyPoints[2 * 3] = {srcFacePoints[2 * 0], srcFacePoints[2 * 0 + 1], srcFacePoints[2 * 1], srcFacePoints[2 * 1 + 1], srcFacePoints[2 * 2], srcFacePoints[2 * 2 + 1]};
return f_MakeupBaseTest(srcData, width, height, stride,srcKeyPoints, mskData, mWidth, mHeight, mStride, maskKeyPoints, ratio,maskMat);
};
double getDistance (Point pointO,Point pointA)
{
......@@ -88,6 +85,85 @@ void hMirrorTrans(const Mat &src, Mat &dst)
int main(int argc, char* argv[]){
int ratio=100;
string modelName = string(argv[2]);
char modelNameChar = modelName[0];
cout << modelName << endl;
cout << modelNameChar << endl;
string motePath = string(argv[1]);
string maskPath = "./"+modelName+".png";
int* rightMaskKeyPoints;
int* leftMaskKeyPoints;
int rightTemp1[] = {136,527, 821,186, 1438,178};
int leftTemp1[] = {41,174, 648,181, 1343,525};
int rightTemp2[] = {95,346,780,154,1471,243};
int leftTemp2[] = {2,245,665,139,1383,332};
int rightTemp3[] = {28,214,631,110,1239,254};
int leftTemp3[] = {5,253,626,106,1220,220};
int rightTemp4[] = {82,317,717,100,1318,349};
int leftTemp4[] = {4,349,572,95,1247,313};
int rightTemp5[] = {130,283,821,134,1474,197};
int leftTemp5[] = {2,196,619,113,1357,272};
switch (modelNameChar) {
case '1': {
rightMaskKeyPoints = rightTemp1;//1
leftMaskKeyPoints = leftTemp1;//1
break;
}
case '2': {
rightMaskKeyPoints = rightTemp2;//2
leftMaskKeyPoints = leftTemp2;//2
break;
}
case '3': {
rightMaskKeyPoints = rightTemp3;//3
leftMaskKeyPoints = leftTemp3;//3
break;
}
case '4': {
rightMaskKeyPoints = rightTemp4;//4
leftMaskKeyPoints = leftTemp4;//4
break;
}
case '5': {
rightMaskKeyPoints = rightTemp5;//4
leftMaskKeyPoints = leftTemp5;//4
break;
}
}
// int rightMaskKeyPoints[2 * 3]={1,48,125,17,262,45};//test
// int leftMaskKeyPoints[2 * 3]={1,48,125,17,262,45};//test
// int rightMaskKeyPoints[2 * 3]={136,526,725,221,1439,178};//1
// int leftMaskKeyPoints[2 * 3]={40,170,701,198,1341,527};//1
// int rightMaskKeyPoints[2 * 3]={43,459,733,256,1456,358};//2
// int leftMaskKeyPoints[2 * 3]={8,366,729,246,1441,444};//2
// int rightMaskKeyPoints[2 * 3]={137,332,729,238,1357,379};//3
// int leftMaskKeyPoints[2 * 3]={118,382,744,234,1340,339};//3
// int rightMaskKeyPoints[2 * 3]={99,472,766,216,1420,469};//4
// int leftMaskKeyPoints[2 * 3]={59,472,679,216,1378,469};//4
// int rightMaskKeyPoints[2 * 3]={52,116,238,62,445,128};//运营眉毛1
// int rightMaskKeyPoints[2 * 3]={31,132,109,102,196,117};//UI1
// int rightMaskKeyPoints[2 * 3]={48,141,242,87,469,97};//UI2
// int rightMaskKeyPoints[2 * 3]={99,469,744,220,1420,470};//UI3
// int rightMaskKeyPoints[2 * 3]={13,162,251,86,504,106};//UI4
// int rightMaskKeyPoints[2 * 3]={65,144,286,85,537,104};//一字眉
// int rightMaskKeyPoints[2 * 3]={69,183,253,108,482,142};//新月眉
// int rightMaskKeyPoints[2 * 3]={58,157,281,73,530,140};//柳叶眉
// int rightMaskKeyPoints[2 * 3]={38,103,181,63,349,117};//野生眉
// int leftMaskKeyPoints[2 * 3]={54,131,237,62,447,121};//运营眉毛1
// int leftMaskKeyPoints[2 * 3]={21,118,109,103,187,131};//UI1
// int leftMaskKeyPoints[2 * 3]={53,96,245,84,476,138};//UI2
// int leftMaskKeyPoints[2 * 3]={59,474,670,214,1382,470};//UI3
// int leftMaskKeyPoints[2 * 3]={18,107,257,81,508,161};//UI4
// int leftMaskKeyPoints[2 * 3]={47,106,288,80,523,138};//一字眉
// int leftMaskKeyPoints[2 * 3]={91,142,308,101,504,185};//新月眉
// int leftMaskKeyPoints[2 * 3]={26,140,269,70,497,156};//柳叶眉
// int leftMaskKeyPoints[2 * 3]={34,118,195,62,344,104};//野生眉
//计时
Poco::Stopwatch stopwatch;
stopwatch.start();
......@@ -107,8 +183,7 @@ int main(int argc, char* argv[]){
//图片base64编码
//读取图片,获得字节数组和Mat
vector<unsigned char> data;
string imgPath = "/Users/edz/Downloads/合集/模特/1.JPG";
ifstream ifs(imgPath,ios::binary);
ifstream ifs(motePath,ios::binary);
if(ifs.is_open()){
char buf[1024];
while(ifs.read(buf, sizeof(buf))){
......@@ -132,17 +207,17 @@ int main(int argc, char* argv[]){
string base64Str;
zBase64.Encode(tmp,data.size(),base64Str);
form.add("image_base64",base64Str);
// form.prepareSubmit(es_request);
// form.write(session.sendRequest(es_request));
// HTTPResponse es_response;
// std::istream &istream = session.receiveResponse(es_response);
// const HTTPResponse::HTTPStatus &status = es_response.getStatus();
// if(HTTPResponse::HTTPStatus::HTTP_OK == status) {
if(true) {
// std::string stRes;
// StreamCopier::copyToString(istream, stRes);
// std::cout << stRes << std::endl;
string stRes = "{\"time_used\": 155, \"request_id\": \"1618825817,bbcc62bb-db7b-4f65-ac74-8c3c408f27c6\", \"face\": {\"landmark\": {\"right_eyebrow\": {\"right_eyebrow_56\": {\"y\": 363, \"x\": 529}, \"right_eyebrow_57\": {\"y\": 363, \"x\": 532}, \"right_eyebrow_54\": {\"y\": 362, \"x\": 523}, \"right_eyebrow_55\": {\"y\": 362, \"x\": 526}, \"right_eyebrow_38\": {\"y\": 366, \"x\": 477}, \"right_eyebrow_39\": {\"y\": 365, \"x\": 480}, \"right_eyebrow_50\": {\"y\": 362, \"x\": 512}, \"right_eyebrow_51\": {\"y\": 362, \"x\": 514}, \"right_eyebrow_34\": {\"y\": 365, \"x\": 465}, \"right_eyebrow_35\": {\"y\": 366, \"x\": 468}, \"right_eyebrow_36\": {\"y\": 366, \"x\": 471}, \"right_eyebrow_37\": {\"y\": 366, \"x\": 474}, \"right_eyebrow_30\": {\"y\": 355, \"x\": 465}, \"right_eyebrow_31\": {\"y\": 358, \"x\": 464}, \"right_eyebrow_32\": {\"y\": 361, \"x\": 463}, \"right_eyebrow_33\": {\"y\": 364, \"x\": 464}, \"right_eyebrow_12\": {\"y\": 349, \"x\": 520}, \"right_eyebrow_13\": {\"y\": 349, \"x\": 517}, \"right_eyebrow_10\": {\"y\": 350, \"x\": 527}, \"right_eyebrow_11\": {\"y\": 349, \"x\": 524}, \"right_eyebrow_16\": {\"y\": 349, \"x\": 508}, \"right_eyebrow_17\": {\"y\": 349, \"x\": 505}, \"right_eyebrow_14\": {\"y\": 349, \"x\": 514}, \"right_eyebrow_15\": {\"y\": 349, \"x\": 511}, \"right_eyebrow_52\": {\"y\": 362, \"x\": 517}, \"right_eyebrow_18\": {\"y\": 349, \"x\": 502}, \"right_eyebrow_19\": {\"y\": 349, \"x\": 499}, \"right_eyebrow_53\": {\"y\": 362, \"x\": 520}, \"right_eyebrow_44\": {\"y\": 363, \"x\": 494}, \"right_eyebrow_41\": {\"y\": 364, \"x\": 485}, \"right_eyebrow_58\": {\"y\": 363, \"x\": 535}, \"right_eyebrow_40\": {\"y\": 365, \"x\": 482}, \"right_eyebrow_43\": {\"y\": 364, \"x\": 491}, \"right_eyebrow_49\": {\"y\": 362, \"x\": 509}, \"right_eyebrow_48\": {\"y\": 362, \"x\": 506}, \"right_eyebrow_61\": {\"y\": 365, \"x\": 543}, \"right_eyebrow_42\": {\"y\": 364, \"x\": 488}, \"right_eyebrow_29\": {\"y\": 354, \"x\": 468}, \"right_eyebrow_28\": {\"y\": 352, \"x\": 471}, \"right_eyebrow_27\": {\"y\": 352, \"x\": 474}, \"right_eyebrow_26\": {\"y\": 351, \"x\": 477}, \"right_eyebrow_25\": {\"y\": 351, \"x\": 480}, \"right_eyebrow_24\": {\"y\": 350, \"x\": 483}, \"right_eyebrow_23\": {\"y\": 350, \"x\": 486}, \"right_eyebrow_22\": {\"y\": 350, \"x\": 489}, \"right_eyebrow_21\": {\"y\": 350, \"x\": 492}, \"right_eyebrow_20\": {\"y\": 349, \"x\": 495}, \"right_eyebrow_59\": {\"y\": 364, \"x\": 538}, \"right_eyebrow_47\": {\"y\": 363, \"x\": 503}, \"right_eyebrow_60\": {\"y\": 365, \"x\": 541}, \"right_eyebrow_46\": {\"y\": 363, \"x\": 500}, \"right_eyebrow_45\": {\"y\": 363, \"x\": 497}, \"right_eyebrow_8\": {\"y\": 352, \"x\": 533}, \"right_eyebrow_9\": {\"y\": 351, \"x\": 530}, \"right_eyebrow_0\": {\"y\": 366, \"x\": 552}, \"right_eyebrow_1\": {\"y\": 363, \"x\": 551}, \"right_eyebrow_2\": {\"y\": 361, \"x\": 549}, \"right_eyebrow_3\": {\"y\": 359, \"x\": 546}, \"right_eyebrow_4\": {\"y\": 357, \"x\": 544}, \"right_eyebrow_5\": {\"y\": 355, \"x\": 541}, \"right_eyebrow_6\": {\"y\": 354, \"x\": 538}, \"right_eyebrow_7\": {\"y\": 353, \"x\": 536}, \"right_eyebrow_62\": {\"y\": 366, \"x\": 546}, \"right_eyebrow_63\": {\"y\": 367, \"x\": 549}}, \"left_eyebrow\": {\"left_eyebrow_54\": {\"y\": 361, \"x\": 331}, \"left_eyebrow_55\": {\"y\": 361, \"x\": 329}, \"left_eyebrow_52\": {\"y\": 361, \"x\": 337}, \"left_eyebrow_53\": {\"y\": 361, \"x\": 334}, \"left_eyebrow_50\": {\"y\": 361, \"x\": 343}, \"left_eyebrow_51\": {\"y\": 361, \"x\": 340}, \"left_eyebrow_56\": {\"y\": 362, \"x\": 326}, \"left_eyebrow_57\": {\"y\": 362, \"x\": 323}, \"left_eyebrow_18\": {\"y\": 349, \"x\": 352}, \"left_eyebrow_19\": {\"y\": 349, \"x\": 356}, \"left_eyebrow_16\": {\"y\": 349, \"x\": 346}, \"left_eyebrow_17\": {\"y\": 349, \"x\": 349}, \"left_eyebrow_14\": {\"y\": 348, \"x\": 340}, \"left_eyebrow_15\": {\"y\": 348, \"x\": 343}, \"left_eyebrow_12\": {\"y\": 349, \"x\": 334}, \"left_eyebrow_13\": {\"y\": 349, \"x\": 337}, \"left_eyebrow_10\": {\"y\": 349, \"x\": 328}, \"left_eyebrow_11\": {\"y\": 349, \"x\": 331}, \"left_eyebrow_34\": {\"y\": 364, \"x\": 389}, \"left_eyebrow_35\": {\"y\": 365, \"x\": 386}, \"left_eyebrow_36\": {\"y\": 365, \"x\": 383}, \"left_eyebrow_37\": {\"y\": 365, \"x\": 380}, \"left_eyebrow_30\": {\"y\": 354, \"x\": 388}, \"left_eyebrow_31\": {\"y\": 357, \"x\": 390}, \"left_eyebrow_32\": {\"y\": 360, \"x\": 391}, \"left_eyebrow_33\": {\"y\": 363, \"x\": 390}, \"left_eyebrow_38\": {\"y\": 365, \"x\": 378}, \"left_eyebrow_39\": {\"y\": 364, \"x\": 375}, \"left_eyebrow_4\": {\"y\": 355, \"x\": 311}, \"left_eyebrow_5\": {\"y\": 354, \"x\": 313}, \"left_eyebrow_6\": {\"y\": 352, \"x\": 316}, \"left_eyebrow_7\": {\"y\": 351, \"x\": 319}, \"left_eyebrow_0\": {\"y\": 364, \"x\": 303}, \"left_eyebrow_1\": {\"y\": 361, \"x\": 304}, \"left_eyebrow_2\": {\"y\": 359, \"x\": 306}, \"left_eyebrow_3\": {\"y\": 357, \"x\": 308}, \"left_eyebrow_8\": {\"y\": 350, \"x\": 322}, \"left_eyebrow_9\": {\"y\": 350, \"x\": 325}, \"left_eyebrow_45\": {\"y\": 362, \"x\": 358}, \"left_eyebrow_44\": {\"y\": 363, \"x\": 360}, \"left_eyebrow_47\": {\"y\": 362, \"x\": 352}, \"left_eyebrow_46\": {\"y\": 362, \"x\": 355}, \"left_eyebrow_41\": {\"y\": 364, \"x\": 369}, \"left_eyebrow_40\": {\"y\": 364, \"x\": 372}, \"left_eyebrow_43\": {\"y\": 363, \"x\": 363}, \"left_eyebrow_42\": {\"y\": 363, \"x\": 366}, \"left_eyebrow_63\": {\"y\": 364, \"x\": 305}, \"left_eyebrow_62\": {\"y\": 364, \"x\": 308}, \"left_eyebrow_61\": {\"y\": 363, \"x\": 311}, \"left_eyebrow_60\": {\"y\": 363, \"x\": 314}, \"left_eyebrow_49\": {\"y\": 362, \"x\": 346}, \"left_eyebrow_48\": {\"y\": 362, \"x\": 349}, \"left_eyebrow_27\": {\"y\": 351, \"x\": 380}, \"left_eyebrow_26\": {\"y\": 350, \"x\": 377}, \"left_eyebrow_25\": {\"y\": 350, \"x\": 374}, \"left_eyebrow_24\": {\"y\": 350, \"x\": 371}, \"left_eyebrow_23\": {\"y\": 349, \"x\": 368}, \"left_eyebrow_22\": {\"y\": 349, \"x\": 365}, \"left_eyebrow_21\": {\"y\": 349, \"x\": 362}, \"left_eyebrow_20\": {\"y\": 349, \"x\": 359}, \"left_eyebrow_58\": {\"y\": 362, \"x\": 320}, \"left_eyebrow_29\": {\"y\": 353, \"x\": 386}, \"left_eyebrow_28\": {\"y\": 352, \"x\": 383}, \"left_eyebrow_59\": {\"y\": 363, \"x\": 317}}}, \"face_rectangle\": {\"width\": 301, \"top\": 342, \"height\": 300, \"left\": 280}}}";
form.prepareSubmit(es_request);
form.write(session.sendRequest(es_request));
HTTPResponse es_response;
std::istream &istream = session.receiveResponse(es_response);
const HTTPResponse::HTTPStatus &status = es_response.getStatus();
if(HTTPResponse::HTTPStatus::HTTP_OK == status) {
// if(true) {
std::string stRes;
StreamCopier::copyToString(istream, stRes);
std::cout << stRes << std::endl;
// string stRes = "{\"time_used\": 155, \"request_id\": \"1618825817,bbcc62bb-db7b-4f65-ac74-8c3c408f27c6\", \"face\": {\"landmark\": {\"right_eyebrow\": {\"right_eyebrow_56\": {\"y\": 363, \"x\": 529}, \"right_eyebrow_57\": {\"y\": 363, \"x\": 532}, \"right_eyebrow_54\": {\"y\": 362, \"x\": 523}, \"right_eyebrow_55\": {\"y\": 362, \"x\": 526}, \"right_eyebrow_38\": {\"y\": 366, \"x\": 477}, \"right_eyebrow_39\": {\"y\": 365, \"x\": 480}, \"right_eyebrow_50\": {\"y\": 362, \"x\": 512}, \"right_eyebrow_51\": {\"y\": 362, \"x\": 514}, \"right_eyebrow_34\": {\"y\": 365, \"x\": 465}, \"right_eyebrow_35\": {\"y\": 366, \"x\": 468}, \"right_eyebrow_36\": {\"y\": 366, \"x\": 471}, \"right_eyebrow_37\": {\"y\": 366, \"x\": 474}, \"right_eyebrow_30\": {\"y\": 355, \"x\": 465}, \"right_eyebrow_31\": {\"y\": 358, \"x\": 464}, \"right_eyebrow_32\": {\"y\": 361, \"x\": 463}, \"right_eyebrow_33\": {\"y\": 364, \"x\": 464}, \"right_eyebrow_12\": {\"y\": 349, \"x\": 520}, \"right_eyebrow_13\": {\"y\": 349, \"x\": 517}, \"right_eyebrow_10\": {\"y\": 350, \"x\": 527}, \"right_eyebrow_11\": {\"y\": 349, \"x\": 524}, \"right_eyebrow_16\": {\"y\": 349, \"x\": 508}, \"right_eyebrow_17\": {\"y\": 349, \"x\": 505}, \"right_eyebrow_14\": {\"y\": 349, \"x\": 514}, \"right_eyebrow_15\": {\"y\": 349, \"x\": 511}, \"right_eyebrow_52\": {\"y\": 362, \"x\": 517}, \"right_eyebrow_18\": {\"y\": 349, \"x\": 502}, \"right_eyebrow_19\": {\"y\": 349, \"x\": 499}, \"right_eyebrow_53\": {\"y\": 362, \"x\": 520}, \"right_eyebrow_44\": {\"y\": 363, \"x\": 494}, \"right_eyebrow_41\": {\"y\": 364, \"x\": 485}, \"right_eyebrow_58\": {\"y\": 363, \"x\": 535}, \"right_eyebrow_40\": {\"y\": 365, \"x\": 482}, \"right_eyebrow_43\": {\"y\": 364, \"x\": 491}, \"right_eyebrow_49\": {\"y\": 362, \"x\": 509}, \"right_eyebrow_48\": {\"y\": 362, \"x\": 506}, \"right_eyebrow_61\": {\"y\": 365, \"x\": 543}, \"right_eyebrow_42\": {\"y\": 364, \"x\": 488}, \"right_eyebrow_29\": {\"y\": 354, \"x\": 468}, \"right_eyebrow_28\": {\"y\": 352, \"x\": 471}, \"right_eyebrow_27\": {\"y\": 352, \"x\": 474}, \"right_eyebrow_26\": {\"y\": 351, \"x\": 477}, \"right_eyebrow_25\": {\"y\": 351, \"x\": 480}, \"right_eyebrow_24\": {\"y\": 350, \"x\": 483}, \"right_eyebrow_23\": {\"y\": 350, \"x\": 486}, \"right_eyebrow_22\": {\"y\": 350, \"x\": 489}, \"right_eyebrow_21\": {\"y\": 350, \"x\": 492}, \"right_eyebrow_20\": {\"y\": 349, \"x\": 495}, \"right_eyebrow_59\": {\"y\": 364, \"x\": 538}, \"right_eyebrow_47\": {\"y\": 363, \"x\": 503}, \"right_eyebrow_60\": {\"y\": 365, \"x\": 541}, \"right_eyebrow_46\": {\"y\": 363, \"x\": 500}, \"right_eyebrow_45\": {\"y\": 363, \"x\": 497}, \"right_eyebrow_8\": {\"y\": 352, \"x\": 533}, \"right_eyebrow_9\": {\"y\": 351, \"x\": 530}, \"right_eyebrow_0\": {\"y\": 366, \"x\": 552}, \"right_eyebrow_1\": {\"y\": 363, \"x\": 551}, \"right_eyebrow_2\": {\"y\": 361, \"x\": 549}, \"right_eyebrow_3\": {\"y\": 359, \"x\": 546}, \"right_eyebrow_4\": {\"y\": 357, \"x\": 544}, \"right_eyebrow_5\": {\"y\": 355, \"x\": 541}, \"right_eyebrow_6\": {\"y\": 354, \"x\": 538}, \"right_eyebrow_7\": {\"y\": 353, \"x\": 536}, \"right_eyebrow_62\": {\"y\": 366, \"x\": 546}, \"right_eyebrow_63\": {\"y\": 367, \"x\": 549}}, \"left_eyebrow\": {\"left_eyebrow_54\": {\"y\": 361, \"x\": 331}, \"left_eyebrow_55\": {\"y\": 361, \"x\": 329}, \"left_eyebrow_52\": {\"y\": 361, \"x\": 337}, \"left_eyebrow_53\": {\"y\": 361, \"x\": 334}, \"left_eyebrow_50\": {\"y\": 361, \"x\": 343}, \"left_eyebrow_51\": {\"y\": 361, \"x\": 340}, \"left_eyebrow_56\": {\"y\": 362, \"x\": 326}, \"left_eyebrow_57\": {\"y\": 362, \"x\": 323}, \"left_eyebrow_18\": {\"y\": 349, \"x\": 352}, \"left_eyebrow_19\": {\"y\": 349, \"x\": 356}, \"left_eyebrow_16\": {\"y\": 349, \"x\": 346}, \"left_eyebrow_17\": {\"y\": 349, \"x\": 349}, \"left_eyebrow_14\": {\"y\": 348, \"x\": 340}, \"left_eyebrow_15\": {\"y\": 348, \"x\": 343}, \"left_eyebrow_12\": {\"y\": 349, \"x\": 334}, \"left_eyebrow_13\": {\"y\": 349, \"x\": 337}, \"left_eyebrow_10\": {\"y\": 349, \"x\": 328}, \"left_eyebrow_11\": {\"y\": 349, \"x\": 331}, \"left_eyebrow_34\": {\"y\": 364, \"x\": 389}, \"left_eyebrow_35\": {\"y\": 365, \"x\": 386}, \"left_eyebrow_36\": {\"y\": 365, \"x\": 383}, \"left_eyebrow_37\": {\"y\": 365, \"x\": 380}, \"left_eyebrow_30\": {\"y\": 354, \"x\": 388}, \"left_eyebrow_31\": {\"y\": 357, \"x\": 390}, \"left_eyebrow_32\": {\"y\": 360, \"x\": 391}, \"left_eyebrow_33\": {\"y\": 363, \"x\": 390}, \"left_eyebrow_38\": {\"y\": 365, \"x\": 378}, \"left_eyebrow_39\": {\"y\": 364, \"x\": 375}, \"left_eyebrow_4\": {\"y\": 355, \"x\": 311}, \"left_eyebrow_5\": {\"y\": 354, \"x\": 313}, \"left_eyebrow_6\": {\"y\": 352, \"x\": 316}, \"left_eyebrow_7\": {\"y\": 351, \"x\": 319}, \"left_eyebrow_0\": {\"y\": 364, \"x\": 303}, \"left_eyebrow_1\": {\"y\": 361, \"x\": 304}, \"left_eyebrow_2\": {\"y\": 359, \"x\": 306}, \"left_eyebrow_3\": {\"y\": 357, \"x\": 308}, \"left_eyebrow_8\": {\"y\": 350, \"x\": 322}, \"left_eyebrow_9\": {\"y\": 350, \"x\": 325}, \"left_eyebrow_45\": {\"y\": 362, \"x\": 358}, \"left_eyebrow_44\": {\"y\": 363, \"x\": 360}, \"left_eyebrow_47\": {\"y\": 362, \"x\": 352}, \"left_eyebrow_46\": {\"y\": 362, \"x\": 355}, \"left_eyebrow_41\": {\"y\": 364, \"x\": 369}, \"left_eyebrow_40\": {\"y\": 364, \"x\": 372}, \"left_eyebrow_43\": {\"y\": 363, \"x\": 363}, \"left_eyebrow_42\": {\"y\": 363, \"x\": 366}, \"left_eyebrow_63\": {\"y\": 364, \"x\": 305}, \"left_eyebrow_62\": {\"y\": 364, \"x\": 308}, \"left_eyebrow_61\": {\"y\": 363, \"x\": 311}, \"left_eyebrow_60\": {\"y\": 363, \"x\": 314}, \"left_eyebrow_49\": {\"y\": 362, \"x\": 346}, \"left_eyebrow_48\": {\"y\": 362, \"x\": 349}, \"left_eyebrow_27\": {\"y\": 351, \"x\": 380}, \"left_eyebrow_26\": {\"y\": 350, \"x\": 377}, \"left_eyebrow_25\": {\"y\": 350, \"x\": 374}, \"left_eyebrow_24\": {\"y\": 350, \"x\": 371}, \"left_eyebrow_23\": {\"y\": 349, \"x\": 368}, \"left_eyebrow_22\": {\"y\": 349, \"x\": 365}, \"left_eyebrow_21\": {\"y\": 349, \"x\": 362}, \"left_eyebrow_20\": {\"y\": 349, \"x\": 359}, \"left_eyebrow_58\": {\"y\": 362, \"x\": 320}, \"left_eyebrow_29\": {\"y\": 353, \"x\": 386}, \"left_eyebrow_28\": {\"y\": 352, \"x\": 383}, \"left_eyebrow_59\": {\"y\": 363, \"x\": 317}}}, \"face_rectangle\": {\"width\": 301, \"top\": 342, \"height\": 300, \"left\": 280}}}";
Poco::JSON::Parser parser;
const Dynamic::Var &var = parser.parse(stRes);
if(!var.isEmpty()){
......@@ -153,10 +228,26 @@ int main(int argc, char* argv[]){
//画出眉毛轮廓
std::vector<cv::Point> rightContours;
std::vector<cv::Point> leftContours;
//找出眼周leftContours中x坐标最大,最小值;y最大最小值
int l_x_min = 0x7FFFFFFF,l_x_max=0,l_y_min = 0x7FFFFFFF,l_y_max=0;
//找出眼周rightContours中x坐标最大,最小值;y最大最小值
int r_x_min = 0x7FFFFFFF,r_x_max=0,r_y_min = 0x7FFFFFFF,r_y_max=0;
for(int i=0;i<64;++i){
const JSON::Object::Ptr &pPtr = right_eyebrow->getObject("right_eyebrow_" + to_string(i));
int x = pPtr->get("x");
int y = pPtr->get("y");
if(x>r_x_max){
r_x_max = x;
}
if(x<r_x_min){
r_x_min = x;
}
if(y>r_y_max){
r_y_max = y;
}
if(y<r_y_min){
r_y_min = y;
}
// circle(mat,cv::Point(x,y),1,cv::Scalar(0,0,255));
rightContours.push_back(cv::Point(x,y));
}
......@@ -164,6 +255,18 @@ int main(int argc, char* argv[]){
const JSON::Object::Ptr &pPtr = left_eyebrow->getObject("left_eyebrow_" + to_string(i));
int x = pPtr->get("x");
int y = pPtr->get("y");
if(x>l_x_max){
l_x_max = x;
}
if(x<l_x_min){
l_x_min = x;
}
if(y>l_y_max){
l_y_max = y;
}
if(y<l_y_min){
l_y_min = y;
}
// circle(mat,cv::Point(x,y),1,cv::Scalar(0,0,255));
leftContours.push_back(cv::Point(x,y));
}
......@@ -179,18 +282,22 @@ int main(int argc, char* argv[]){
}
}
}
imshow("repairMask",repairMask);
// imshow("repairMask",repairMask);
//将轮廓附近的点也做肤色填充
for(int y=0;y<height;++y){
for(int x=0;x<width;++x){
for(auto& point:leftContours){
if(getDistance(point,cv::Point(x,y))<=6){
repairMask.at<uchar>(y,x)=255;
if(x>l_x_min-6&&x<l_x_max+6&&y>l_y_min-6&&y<l_y_max+6) {
for (auto &point:leftContours) {
if (getDistance(point, cv::Point(x, y)) <= 4) {
repairMask.at<uchar>(y, x) = 255;
}
}
for(auto& point:rightContours){
if(getDistance(point,cv::Point(x,y))<=6){
repairMask.at<uchar>(y,x)=255;
}
if(x>r_x_min-6&&x<r_x_max+6&&y>r_y_min-6&&y<r_y_max+6) {
for (auto &point:rightContours) {
if (getDistance(point, cv::Point(x, y)) <= 6) {
repairMask.at<uchar>(y, x) = 255;
}
}
}
}
......@@ -211,9 +318,9 @@ int main(int argc, char* argv[]){
pointPtr = eyebrow->getObject("right_eyebrow_32");
int x_32 = pointPtr->get("x");
int y_32 = pointPtr->get("y");
srcFacePoints[2*0] = x_32;
srcFacePoints[2*0+1] = y_32;
// circle(mat,cv::Point(pointPtr->get("x"),pointPtr->get("y")),1,cv::Scalar(0,0,255));
srcFacePoints[2*0] = x_32-4;
srcFacePoints[2*0+1] = y_32+4;
// circle(mat,Point(srcFacePoints[2*0],srcFacePoints[2*0+1]),1,cv::Scalar(0,0,255));
pointPtr = eyebrow->getObject("right_eyebrow_15");
int x_15 = pointPtr->get("x");
int y_15 = pointPtr->get("y");
......@@ -224,27 +331,31 @@ int main(int argc, char* argv[]){
// circle(mat,cv::Point(pointPtr->get("x"),pointPtr->get("y")),1,cv::Scalar(0,0,255));
srcFacePoints[2*1] = (x_15+x_47)/2;
srcFacePoints[2*1+1] = (y_15+y_47)/2;
// circle(mat,cv::Point(srcFacePoints[2*1],srcFacePoints[2*1+1]),1,cv::Scalar(0,0,255));
//右眉毛融合
string imgPath = "/Users/edz/Downloads/meimao2.png";
cv::Mat mask = cv::imread(imgPath, CV_LOAD_IMAGE_UNCHANGED);
int rightMaskKeyPoints[2 * 3]={1,48,125,17,262,45};
cv::cvtColor(mat,mat,cv::COLOR_RGB2BGRA);
cv::Mat mask = cv::imread(maskPath, CV_LOAD_IMAGE_UNCHANGED);
cout << "mask.type():" << mask.type() << endl;
cout << "A:" << int(mask.at<Vec4b>(Point(241,76))[3]) << endl;
// imshow("mask",mask);
cv::cvtColor(mat,mat,cv::COLOR_BGR2BGRA);
unsigned char* srcData = mat.data;
int stride=width*mat.channels();
unsigned char* mskData = mask.data;
cout << mask.channels() << endl;
int mWidth=mask.cols, mHeight=mask.rows, mStride=mWidth*mask.channels();
int ratio=100;
//右眉毛模板融合
// f_EyeBrowTest(mat, width, height, stride, srcFacePoints, mask, mWidth, mHeight, mStride, rightMaskKeyPoints, false, ratio,mask);
f_EyeBrow(srcData, width, height, stride, srcFacePoints, mskData, mWidth, mHeight, mStride, rightMaskKeyPoints, false, ratio);
//左眉毛融合
srcData = mat.data;
//模板翻转
cv::Mat mirrorMask;
cv::flip(mask,mirrorMask,1);
imshow("mirrorMask",mirrorMask);
// imshow("mirrorMask",mirrorMask);
// imwrite("./mirrorMask.png",mirrorMask);
mskData = mirrorMask.data;
mWidth=mirrorMask.cols, mHeight=mirrorMask.rows, mStride=mWidth*mirrorMask.channels();
int leftMaskKeyPoints[2 * 3]={1,48,125,17,262,45};
//获取左眉毛3个关键点坐标
eyebrow = left_eyebrow;
pointPtr = eyebrow->getObject("left_eyebrow_0");
......@@ -256,9 +367,9 @@ int main(int argc, char* argv[]){
pointPtr = eyebrow->getObject("left_eyebrow_32");
x_32 = pointPtr->get("x");
y_32 = pointPtr->get("y");
srcFacePoints[2*2] = x_32;
srcFacePoints[2*2+1] = y_32;
// circle(mat,cv::Point(pointPtr->get("x"),pointPtr->get("y")),1,cv::Scalar(0,0,255));
srcFacePoints[2*2] = x_32+4;
srcFacePoints[2*2+1] = y_32+4;
// circle(mat,cv::Point(srcFacePoints[2*2],srcFacePoints[2*2+1]),1,cv::Scalar(0,0,255));
pointPtr = eyebrow->getObject("left_eyebrow_15");
x_15 = pointPtr->get("x");
y_15 = pointPtr->get("y");
......@@ -270,10 +381,10 @@ int main(int argc, char* argv[]){
srcFacePoints[2*1] = (x_15+x_47)/2;
srcFacePoints[2*1+1] = (y_15+y_47)/2;
f_EyeBrow(srcData, width, height, stride, srcFacePoints, mskData, mWidth, mHeight, mStride, leftMaskKeyPoints, true, ratio);
cv::cvtColor(mat,mat,cv::COLOR_BGRA2RGB);
imshow("a",mat);
imwrite("美眉.jpg",mat);
// circle(mat,cv::Point(srcFacePoints[2*1],srcFacePoints[2*1+1]),1,cv::Scalar(255,0,0));
imwrite("美眉"+modelName+".jpg",mat);
cv::cvtColor(mat,mat,cv::COLOR_BGRA2BGR);
imshow("美眉"+modelName,mat);
waitKey(0);
}
}
......
......@@ -67,6 +67,9 @@ int f_MakeupBaseN(unsigned char* srcData, int width, int height, int stride, int
*ratio: intensity of effect, [0, 100]
*Return: 0-OK,other failed
**************************************************************************/
#include "iostream"
using namespace std;
using namespace cv;
int f_MakeupBase(unsigned char* srcData, int width, int height, int stride, int srcKeyPoints[2 * 3], unsigned char* mskData, int mWidth, int mHeight, int mStride, int maskKeyPoints[2 * 3], int ratio)
{
int ret = 0;
......@@ -108,8 +111,27 @@ int f_MakeupBase(unsigned char* srcData, int width, int height, int stride, int
tmp2 = mskData[index_x0y1 + 3] + ((disX *(mskData[index_x1y1 + 3] - mskData[index_x0y1 + 3])) >> 14);
AA = tmp1 + ((disY * (tmp2 - tmp1)) >> 14);
int pos = (x0 << 2) + y0 * mStride;
// int pos = (x0<<2) + y0 * mStride;
// int k = mskData[pos+3];
// int b = (k * mskData[pos] + (255 - k) * pSrc[0]) / 255;
// int g = (k * mskData[pos+1] + (255 - k) * pSrc[1]) / 255;
// int r = (k * mskData[pos+2] + (255 - k) * pSrc[2]) / 255;
int k = AA;
// int b;
// int g;
// int r;
// if(k){
// b = AB;
// g = AG;
// r = AR;
// }else{
// b = pSrc[0];
// g = pSrc[1];
// r = pSrc[2];
// }
int b = (k * AB + (255 - k) * pSrc[0]) / 255;
int g = (k * AG + (255 - k) * pSrc[1]) / 255;
int r = (k * AR + (255 - k) * pSrc[2]) / 255;
......@@ -122,6 +144,57 @@ int f_MakeupBase(unsigned char* srcData, int width, int height, int stride, int
}
return ret;
};
int f_MakeupBaseTest(cv::Mat& srcData, int width, int height, int stride, int srcKeyPoints[2 * 3], Mat& mskData, int mWidth, int mHeight, int mStride, int maskKeyPoints[2 * 3], int ratio,cv::Mat& maskMat)
{
// cv::Mat maskTemp;
// maskTemp.create(maskMat.rows,maskMat.cols,CV_8UC3);
int ret = 0;
float H[6] = {0};
f_AffinetransformMetrixCompute((float)maskKeyPoints[0],(float)maskKeyPoints[1],(float)maskKeyPoints[2],(float)maskKeyPoints[3],(float)maskKeyPoints[4],(float)maskKeyPoints[5], (float)srcKeyPoints[0], (float)srcKeyPoints[1], (float)srcKeyPoints[2], (float)srcKeyPoints[3], (float)srcKeyPoints[4], (float)srcKeyPoints[5], H);
int alpha = 128 * ratio / 100;
int nalpha = 128 - alpha;
// int AR, AG, AB, AA;
int x0, y0, index_x0y0, index_x0y1, index_x1y0, index_x1y1;
// int disX, disY, tmp1, tmp2;
int c1=0,c2=0,c3=0;
set<string> s1;
set<string> s2;
for(int j = 0; j < height; j++)
{
for(int i = 0; i < width; i++)
{
c3++;
float cx = (H[0] * i + H[1] * j + H[2]);
float cy = (H[3] * i + H[4] * j + H[5]);
if(cx > 0 && cx < mWidth - 1 && cy > 0 && cy < mHeight - 1)
{
// circle(srcData,Point(i,j),1,Scalar(0,0,255));
x0 = (int)CLIP3(floor(cx), 0, mWidth - 2);
y0 = (int)CLIP3(floor(cy), 0, mHeight - 2);
// circle(mskData,Point(x0,y0),1,Scalar(0,0,255));
s1.insert(to_string(x0)+"_"+to_string(y0));
Vec4b &vec = mskData.at<Vec4b>(Point(x0, y0));
srcData.at<Vec4b>(Point(i, j)) = vec;
}
}
}
// cv::imshow("maskMat",maskMat);
cout << c1 << endl;
cout << c2 << endl;
cout << c3 << endl;
cout << s1.size() << endl;
cout << s2.size() << endl;
// cv::imshow("maskTemp",maskTemp);
cv::imshow("mskData",mskData);
cv::imshow("srcData",srcData);
cv::waitKey(0);
return ret;
};
inline int ModeSmoothLight(int basePixel,int mixPixel)
{
int res = 0;
......
#ifndef __T_MAKEUP_BASE__
#define __T_MAKEUP_BASE__
#include <opencv2/opencv.hpp>
/*************************************************************************
*Function: Makeup base
*Params:
......@@ -13,11 +13,12 @@
*mWidth: width of mask image
*mHeight: height of mask image
*mStride: Stride of mask image
*maskKeyPoints 3 key points of blush mask.
*maskKeyPoints�� 3 key points of blush mask.
*ratio: intensity of effect, [0, 100]
*Return: 0-OK,other failed
**************************************************************************/
int f_MakeupBase(unsigned char* srcData, int width, int height, int stride, int srcKeyPoints[2 * 3], unsigned char* mskData, int mWidth, int mHeight, int mStride, int maskKeyPoints[2 * 3], int ratio);
int f_MakeupBaseTest(cv::Mat& srcData, int width, int height, int stride, int srcKeyPoints[2 * 3], cv::Mat& mskData, int mWidth, int mHeight, int mStride, int maskKeyPoints[2 * 3], int ratio,cv::Mat& maskMat);
/*************************************************************************
*Function: f_MakeupBaseShadow
*Params:
......@@ -30,7 +31,7 @@ int f_MakeupBase(unsigned char* srcData, int width, int height, int stride, int
*mWidth: width of mask image
*mHeight: height of mask image
*mStride: Stride of mask image
*maskKeyPoints 4 key points of eyeshadow mask.
*maskKeyPoints�� 4 key points of eyeshadow mask.
*mode: overlay mode.
*ratio: intensity of effect, [0, 100]
*Return: 0-OK,other failed
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment