关键思想是《Image Deformation Using Moving Least Squares》这篇论文中提到的方法。

实现:

1>实现人脸关键点定位

2>实现论文中像素点的坐标变换

坐标变换源码:

void face_lift(Mat &src,const vector<Point2f>& landmarks,int change,const Rect &face)
{vector<Point2f> control_p = {landmarks[0],landmarks[5],                                         Point2f(face.x,face.y+face.height),Point2f(face.x+face.width,face.y+face.height),landmarks[11],landmarks[16],landmarks[33],landmarks[62]};vector<Point2f> control_q = { landmarks[0], landmarks[5],                                             Point2f(landmarks[5].x + change,landmarks[5].y),                       Point2f(face.x,face.y + face.height),Point2f(face.x + face.width,face.y + face.height),Point2f(landmarks[11].x-change,landmarks[11].y ),landmarks[16],landmarks[33],landmarks[62],};Mat pic=src.clone();for (int i =face.x; i <=face.x+face.width; ++i){for (int j = landmarks[0].y;j< landmarks[8].y; ++j){{vector<float> weight_p;                                      vector<Point2f>::iterator itcp = control_p.begin();while (itcp != control_p.end()){double tmp;if (itcp->x != i || itcp->y != j)tmp = 1 / ((itcp->x - i)*(itcp->x - i) + (itcp->y - j)*(itcp->y - j));elsetmp = MAXNUM;weight_p.push_back(tmp);++itcp;}double px = 0, py = 0, qx = 0, qy = 0, tw = 0;itcp = control_p.begin();vector<float>::iterator itwp = weight_p.begin();vector<Point2f>::iterator itcq = control_q.begin();while (itcp != control_p.end()){px += (*itwp)*(itcp->x);py += (*itwp)*(itcp->y);qx += (*itwp)*(itcq->x);qy += (*itwp)*(itcq->y);tw += *itwp;++itcp;++itcq;++itwp;}px = px / tw;py = py / tw;qx = qx / tw;qy = qy / tw;Mat A = Mat::zeros(2, 1, CV_32FC1);Mat B = Mat::zeros(1, 2, CV_32FC1);Mat C = Mat::zeros(1, 2, CV_32FC1);Mat sumL = Mat::zeros(2, 2, CV_32FC1);Mat sumR = Mat::zeros(2, 2, CV_32FC1);Mat M, pos;for (int i = 0; i < weight_p.size(); ++i){A.at<float>(0, 0) = (control_p[i].x - px);A.at<float>(1, 0) = (control_p[i].y - py);B.at<float>(0, 0) = weight_p[i] * ((control_p[i].x - px));B.at<float>(0, 1) = weight_p[i] * ((control_p[i].y - py));sumL += A * B;C.at<float>(0, 0) = weight_p[i] * (control_q[i].x - qx);C.at<float>(0, 1) = weight_p[i] * (control_q[i].y - qy);sumR += A * C;}M = sumL.inv()*sumR;B.at<float>(0, 0) = i - px;B.at<float>(0, 1) = j - py;C.at<float>(0, 0) = qx;C.at<float>(0, 1) = qy;pos = B * M + C;int row = pos.at<float>(0, 0);int col = pos.at<float>(0, 1);pic.at<Vec3b>(col, row)[0] = src.at<Vec3b>(j, i)[0];pic.at<Vec3b>(col, row)[1] = src.at<Vec3b>(j, i)[1];pic.at<Vec3b>(col, row)[2] = src.at<Vec3b>(j, i)[2];}}}
}

效果图:

opencv+c++实现的瘦脸算法相关推荐

  1. 数字图像处理-美图秀秀:瘦脸算法

    简介 本项目是以matlab为主语言并设计GUI界面的一款简易美图秀秀,包含基础的图像处理和一些常见美颜算法 对于一些matlab较难实现的算法采用C++或python来实现 ⭐️ github地址: ...

  2. 使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象

    使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象 1. 效果图 2. 源码 2.1 MeanShift 2.2 Camshift(Continuo ...

  3. OpenCV中直方图反向投影算法详解与实现

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自:opencv学堂 一:直方图交叉 OpenCV中直方图反向 ...

  4. OpenCV均值漂移meanshift algorithm算法的实例(附完整代码)

    OpenCV均值漂移meanshift algorithm算法的实例 OpenCV均值漂移meanshift algorithm算法的实例 OpenCV均值漂移meanshift algorithm算 ...

  5. OpenCV支持向量机SVM和SDG算法的实例(附完整代码)

    OpenCV支持向量机SVM和SDG算法的实例 OpenCV支持向量机SVM和SDG算法的实例 OpenCV支持向量机SVM和SDG算法的实例 #include "opencv2/core. ...

  6. OpenCV实现图像对齐ECC算法(附完整代码)

    OpenCV实现图像对齐ECC算法 OpenCV实现图像对齐ECC算法 OpenCV实现图像对齐ECC算法 #include <opencv2/imgcodecs.hpp> #includ ...

  7. OpenCV实现最大最小距离聚类算法

    OpenCV实现最大最小距离聚类算法 [尊重原创,转载请注明出处]https://blog.csdn.net/guyuealian/article/details/80255524 本博客提供多版本的 ...

  8. Python基于OpenCV的图像去雾算法[完整源码&部署教程]

    1.图片识别 2.视频展示 [项目分享]Python基于OpenCV的图像去雾算法[完整源码&部署教程]_哔哩哔哩_bilibili 3.算法原理 图像增强算法常见于对图像的亮度.对比度.饱和 ...

  9. OpenCV每日函数 白平衡相关算法

    一.概述 OpenCV中其他照片处理算法模块提供了三种白平衡算法,基于WhiteBalancer类, 原图 1.灰度世界算法 该算法基于灰色世界假设来缩放像素值,该假设指出所有通道的平均值应产生灰色图 ...

最新文章

  1. 关于tomcat8在windows2008下高并发下问题的解决方案
  2. 3DSlicer10:体系结构1
  3. SAP ABAP规划 使用LOOP READ TABLE该方法取代双LOOP内部表的方法
  4. 10分钟让你快速掌握Excel的16项重要技巧
  5. 在WildFly上将JPA和CDI Bean与骆驼一起使用
  6. 从源码角度分析下 micrometer 自定义 metrics endpoint 和 springboot actuator
  7. 意尔康体育:帆软助力其提速增效,让数据帮助业务效率提升400%
  8. 知识技能归档-SSL协议20210325
  9. 大型互联网架构演变历程-《淘宝技术这10年》
  10. mysql 介于两个日期函数_帮忙看一上这个mysql函数,用来返回两个日期之间的年数...
  11. office 在线编辑 java_JAVA调用PageOffice在线打开、编辑Word文档
  12. PHP 导出excel
  13. Android下磁盘分区表损坏,修复分区表,教您硬盘分区表损坏怎么修复
  14. 必须使用javadoc形式的注释
  15. 视频教程-Java高级技术-Java
  16. java 指纹比对 算法_Java通过sourceafis比对指纹图片的相似度判断指纹
  17. Android 详解第三方介质交互之NFC,并且实现读你的交通卡,酒店房卡,学生证!
  18. 什么是函数式编程?总结
  19. php输入框里的提示文字,input 标签实现输入框带提示文字效果(两种方法)
  20. C#笔记进阶篇03 抽象函数与抽象类

热门文章

  1. 【深度学习】深度残差网络ResNet
  2. 解决matlab svmtrain 不能用问题
  3. 自定义tag打包Bootstrap模态对话框并动态加载传值
  4. 基于web的房屋房源中介管理系统
  5. 深度学习 十四讲 循环神经网络例子--名字分类
  6. jQuery动画的几种方法
  7. jquery 自定义函数方法
  8. 任意进制转换java_Java 任意进制转换(两种方式)
  9. Vim工具打开、编辑、保存文件
  10. mysql数据库索引的创建语句