当前位置: 首页 > news >正文

基于人脸68特征点识别的美颜算法(一) 大眼算法 C++

1、加载一张原图,并识别人脸的68个特征点

	cv::Mat img = cv::imread("5.jpg");// 人脸68特征点的识别函数vector<Point2f> points_vec = dectectFace68(img);// 大眼效果函数Mat dst0 = on_BigEye(800, img, points_vec);

请添加图片描述
2、函数

vector<Point2f> dectectFace68(Mat src)
{vector<Point2f> points_vec;int* pResults = NULL;//在检测函数中使用了pBuffer。  //如果你调用多个线程中的函数,请为每个线程创建一个缓冲区!  unsigned char* pBuffer = (unsigned char*)malloc(DETECT_BUFFER_SIZE);if (!pBuffer){fprintf(stderr, "Can not alloc buffer.\n");//return 100;}Mat gray;cvtColor(src, gray, CV_BGR2GRAY);int doLandmark = 1;// do landmark detection  pResults = facedetect_multiview_reinforce(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,1.2f, 2, 48, 0, doLandmark);int cxa = *pResults;ofstream file("facedata.txt", ios::out);//打印检测结果 if (0 == cxa){}else{for (int i = 0; i < (pResults ? *pResults : 0); i++){short* p = ((short*)(pResults + 1)) + 142 * i;//rectangle(src, Rect(p[0], p[1], p[2], p[3]), Scalar(0, 255, 0), 2);if (doLandmark){for (int j = 0; j < 68; j++){char c[8];_itoa(j, c, 10);Point2f ff(p[6 + 2 * j], p[6 + 2 * j + 1]);points_vec.push_back(ff);file << ff.x << "\t" << ff.y << endl;/*	circle(src, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 3, Scalar(0, 0, 255), 3);CvPoint font;putText(src, c, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 23, 0), 1);*/}}}}return points_vec;
}// 双线性插值算法
void BilinearInsert(Mat& src, Mat& dst, float ux, float uy, int i, int j)
{auto Abs = [&](float f) {return f > 0 ? f : -f;};int c = src.channels();if (c == 3){//存储图像得浮点坐标CvPoint2D32f uv;CvPoint3D32f f1;CvPoint3D32f f2;//取整数int iu = (int)ux;int iv = (int)uy;uv.x = iu + 1;uv.y = iv + 1;//step图象像素行的实际宽度  三个通道进行计算(0 , 1 2  三通道)f1.x = ((uchar*)(src.data + src.step * iv))[iu * 3] * (1 - Abs(uv.x - iu)) + \((uchar*)(src.data + src.step * iv))[(iu + 1) * 3] * (uv.x - iu);f1.y = ((uchar*)(src.data + src.step * iv))[iu * 3 + 1] * (1 - Abs(uv.x - iu)) + \((uchar*)(src.data + src.step * iv))[(iu + 1) * 3 + 1] * (uv.x - iu);f1.z = ((uchar*)(src.data + src.step * iv))[iu * 3 + 2] * (1 - Abs(uv.x - iu)) + \((uchar*)(src.data + src.step * iv))[(iu + 1) * 3 + 2] * (uv.x - iu);f2.x = ((uchar*)(src.data + src.step * (iv + 1)))[iu * 3] * (1 - Abs(uv.x - iu)) + \((uchar*)(src.data + src.step * (iv + 1)))[(iu + 1) * 3] * (uv.x - iu);f2.y = ((uchar*)(src.data + src.step * (iv + 1)))[iu * 3 + 1] * (1 - Abs(uv.x - iu)) + \((uchar*)(src.data + src.step * (iv + 1)))[(iu + 1) * 3 + 1] * (uv.x - iu);f2.z = ((uchar*)(src.data + src.step * (iv + 1)))[iu * 3 + 2] * (1 - Abs(uv.x - iu)) + \((uchar*)(src.data + src.step * (iv + 1)))[(iu + 1) * 3 + 2] * (uv.x - iu);((uchar*)(dst.data + dst.step * j))[i * 3] = f1.x * (1 - Abs(uv.y - iv)) + f2.x * (Abs(uv.y - iv));  //三个通道进行赋值((uchar*)(dst.data + dst.step * j))[i * 3 + 1] = f1.y * (1 - Abs(uv.y - iv)) + f2.y * (Abs(uv.y - iv));((uchar*)(dst.data + dst.step * j))[i * 3 + 2] = f1.z * (1 - Abs(uv.y - iv)) + f2.z * (Abs(uv.y - iv));}
}//图像局部缩放算法
void LocalTranslationWarp_Eye(Mat& img, Mat& dst, int warpX, int warpY, int endX, int endY, float radius)
{//平移距离 float ddradius = radius * radius;//计算|m-c|^2//size_t mc = (endX - warpX) * (endX - warpX) + (endY - warpY) * (endY - warpY);//计算 图像的高  宽 通道数量int height = img.rows;int width = img.cols;int chan = img.channels();auto Abs = [&](float f) {return f > 0 ? f : -f;};for (int i = 0; i < width; i++){for (int j = 0; j < height; j++){// # 计算该点是否在形变圆的范围之内//# 优化,第一步,直接判断是会在(startX, startY)的矩阵框中if ((Abs(i - warpX) > radius) && (Abs(j - warpY) > radius))continue;float distance = (i - warpX) * (i - warpX) + (j - warpY) * (j - warpY);if (distance < ddradius){float rnorm = sqrt(distance) / radius;float ratio = 1 - (rnorm - 1) * (rnorm - 1) * 0.5;//映射原位置float UX = warpX + ratio * (i - warpX);float UY = warpY + ratio * (j - warpY);//根据双线性插值得到UX UY的值BilinearInsert(img, dst, UX, UY, i, j);}}}
}//大眼效果
Mat on_BigEye(int b, Mat src, vector<Point2f> points_vec)
{Mat dst = src.clone();Point2f left_landmark = points_vec[38];Point2f	left_landmark_down = points_vec[27];Point2f	right_landmark = points_vec[44];Point2f	right_landmark_down = points_vec[27];Point2f	endPt = points_vec[30];//# 计算第4个点到第6个点的距离作为距离/*float r_left = sqrt((left_landmark.x - left_landmark_down.x) * (left_landmark.x - left_landmark_down.x) +(left_landmark.y - left_landmark_down.y) * (left_landmark.y - left_landmark_down.y));cout << "左眼距离:" << r_left;*/float r_left = b;//	# 计算第14个点到第16个点的距离作为距离//float	r_right = sqrt(//	(right_landmark.x - right_landmark_down.x) * (right_landmark.x - right_landmark_down.x) +//	(right_landmark.y - right_landmark_down.y) * (right_landmark.y - right_landmark_down.y));//cout << "右眼距离:" << r_right;float r_right = b;//	# 瘦左                     //LocalTranslationWarp_Eye(src, dst, left_landmark.x, left_landmark.y, endPt.x, endPt.y, r_left);//	# 瘦右LocalTranslationWarp_Eye(src, dst, right_landmark.x, right_landmark.y, endPt.x, endPt.y, r_right);return dst;
}

3、图像结果
请添加图片描述
大眼睛结果
请添加图片描述

相关文章:

基于人脸68特征点识别的美颜算法(一) 大眼算法 C++

1、加载一张原图&#xff0c;并识别人脸的68个特征点 cv::Mat img cv::imread("5.jpg");// 人脸68特征点的识别函数vector<Point2f> points_vec dectectFace68(img);// 大眼效果函数Mat dst0 on_BigEye(800, img, points_vec);2、函数 vector<Point2f&g…...

算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 抱个拳&#xff0c;送个礼 在算法模型构建中&#xff0c;我们经常需要计算样本之间的相似度&#xff0c;通常的做法是计算样本之间的距…...

项目实战--Spring Boot大数据量报表Excel优化

一、项目场景 项目中要实现交易报表&#xff0c;处理大规模数据导出时&#xff0c;出现单个Excel文件过大导致性能下降的问题&#xff0c;需求是导出大概四千万条数据到Excel文件&#xff0c;不影响正式环境的其他查询。 二、方案 1.使用读写分离&#xff0c;查询操作由从库…...

C#编程技术指南:从入门到精通的全面教程

无论你是编程新手&#xff0c;还是想要深化.NET技能的开发者&#xff0c;本文都将为你提供一条清晰的学习路径&#xff0c;从C#基础到高级特性&#xff0c;每一站都配有详尽解析和实用示例&#xff0c;旨在帮助你建立坚实的知识体系&#xff0c;并激发你对C#及.NET生态的热情。…...

Redis+定式任务实现简易版消息队列

Redis是一个开源的内存中数据结构存储系统&#xff0c;通常被用作数据库、缓存和消息中间件。 Redis主要将数据存储在内存中&#xff0c;因此读写速度非常快。 支持不同的持久化方式&#xff0c;可以将内存中的数据定期写入磁盘&#xff0c;保证数据持久性。 redis本身就有自己…...

学习在 C# 中使用 Lambda 运算符

在 C# 中&#xff0c;lambda 运算符 > 同时用于 lambda 表达式和表达式体成员。 1. Lambda 表达式 Lambda 表达式是一种简洁的表示匿名方法&#xff08;没有名称的方法&#xff09;的方法。它使用 lambda 运算符 >&#xff0c;可以读作“转到”。运算符的左侧指定输入参…...

数据结构和算法,单链表的实现(kotlin版)

文章目录 数据结构和算法&#xff0c;单链表的实现(kotlin版)b站视频链接1.定义接口&#xff0c;我们需要实现的方法2.定义节点&#xff0c;表示每个链表节点。3.push(e: E)&#xff0c;链表尾部新增一个节点4.size(): Int&#xff0c;返回链表的长度5.getValue(index: Int): E…...

Jdk17是否有可能代替 Jdk8

JDK发展历史和开源 2006年SUN公司开源JDK&#xff0c;成立OpenJDK组织。2009年Oracle收购SUN&#xff0c;加快JDK发布周期。Oracle JDK与OpenJDK功能基本一致&#xff0c;但Oracle JDK提供更长时间的更新支持。 JDK版本特性 JDK11是长期支持版本&#xff08;LTS&#xff09;…...

oca和 ocp有什么区别

OCA&#xff08;Oracle Certified Associate&#xff09;和OCP&#xff08;Oracle Certified Professional&#xff09;在Oracle的认证体系中是两种不同级别的认证&#xff0c;它们之间存在明显的区别。以下是对两者区别的详细解释&#xff1a; 认证级别&#xff1a; OCA&…...

煤矿安全大模型:微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答

煤矿安全大模型————矿途智护者 使用煤矿历史事故案例,事故处理报告、安全规程规章制度、技术文档、煤矿从业人员入职考试题库等数据,微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答。 本项目简介: 近年来,国家对煤矿安全生产的重视程度不断提升。为了确…...

C++中的C++中的虚析构函数的作用和重要性

在C中&#xff0c;虚析构函数&#xff08;virtual destructor&#xff09;的作用和重要性主要体现在多态和继承的上下文中。了解这一点之前&#xff0c;我们先简要回顾一下多态和继承的基本概念。 继承与多态 继承&#xff1a;允许我们定义一个基类&#xff08;也称为父类或超…...

机器学习 - 文本特征处理之 TF 和 IDF

TF&#xff08;Term Frequency&#xff0c;词频&#xff09;和IDF&#xff08;Inverse Document Frequency&#xff0c;逆文档频率&#xff09;是文本处理和信息检索中的两个重要概念&#xff0c;常用于计算一个词在文档中的重要性。下面是详细解释&#xff1a; TF&#xff08…...

因为自己淋过雨所以想给嵌入式撑把伞

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;新手学嵌入式&#xff0c;…...

《C++20设计模式》中单例模式

文章目录 一、前言二、饿汉式1、实现 三、懒汉式1、实现 四、最后 一、前言 单例模式定义&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供全局访问点来访问这个实例。…...

前端技术(说明篇)

Introduction ##编写内容&#xff1a;1.前端概念梳理 2.前端技术种类 3.前端学习方式 ##编写人&#xff1a;贾雯爽 ##最后更新时间&#xff1a;2024/07/01 Overview 最近在广州粤嵌进行实习&#xff0c;项目名称是”基于Node实现多人聊天室“&#xff0c;主要内容是对前端界…...

带电池监控功能的恒流直流负载组

EAK的交流和直流工业电池负载组测试仪对于测试和验证关键电力系统的能力至关重要&#xff0c;旨在实现最佳精度。作为一家客户至上的公司&#xff0c;我们继续尽我们所能应对供应链挑战&#xff0c;以提供出色的交货时间&#xff0c;大约是行业其他公司的一半。 交流负载组 我…...

关于Disruptor监听策略

Disruptor框架提供了多种等待策略&#xff0c;每种策略都有其适用的场景和特点。以下是这些策略的详细介绍及其适用场景&#xff1a; 1. BlockingWaitStrategy 特点&#xff1a; 使用锁和条件变量进行线程间通信&#xff0c;线程在等待时会进入阻塞状态&#xff0c;释放CPU资…...

大数据面试题之HBase(3)

HBase的预分区 HBase的热点问题 HBase的memstore冲刷条件 HBase的MVCC HBase的大合并与小合并&#xff0c;大合并是如何做的?为什么要大合并 既然HBase底层数据是存储在HDFS上&#xff0c;为什么不直接使用HDFS&#xff0c;而还要用HBase HBase和Phoenix的区别 HBase支…...

c#中赋值、浅拷贝和深拷贝

在 C# 编程中&#xff0c;深拷贝&#xff08;Deep Copy&#xff09;和浅拷贝&#xff08;Shallow Copy&#xff09;是用于复制对象的两种不同方式&#xff0c;它们在处理对象时有着重要的区别和适用场景。 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝是指创建一个新对…...

旧版st7789屏幕模块 没有CS引脚的天坑 已解决!!!

今天解决了天坑一个&#xff0c;大家可能有的人买的是st7789屏幕模块&#xff0c;240x240&#xff0c;1.3寸的 他标注的是老版&#xff0c;没有CS引脚&#xff0c;小崽子长这样&#xff1a; 这熊孩子用很多通用的驱动不吃&#xff0c;死活不显示&#xff0c;网上猛搜&#xff…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...