mediapipe+opencv实现保存图像中的人脸,抹去其他信息

mediapipe+opencv

MediaPipe本身不提供图像处理功能,它主要用于检测和跟踪人脸、手势、姿势等。如果您想要从图像中仅提取人脸主要信息并去除其他信息.

# coding=utf-8
"""@project: teat@Author:念卿 刘@file: test.py@date:2023/12/2 11:32"""
import cv2
import mediapipe as mp
import numpy as np# 初始化 MediaPipe 的面部特征检测器
mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh(min_detection_confidence=0.5, min_tracking_confidence=0.5)# 读取图像
image = cv2.imread("hc.png")# 将图像转换为 RGB 格式
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 进行人脸检测
results = face_mesh.process(image_rgb)
# 创建一个与图像相同大小的蒙版
mask = np.zeros_like(image)
le, r, u, lo = 0, 0, 0, 0
# 获取检测到的人脸关键点信息
if results.multi_face_landmarks:for landmarks in results.multi_face_landmarks:X, Y = [], []for landmark in landmarks.landmark:# 将标记点的归一化坐标转换为图像坐标ih, iw, _ = image.shapex, y = int(landmark.x * iw), int(landmark.y * ih)X.append(x)Y.append(y)# 提取人脸轮廓部分points = cv2.convexHull(np.array([(X[i], Y[i]) for i in range(len(landmarks.landmark))]))cv2.fillConvexPoly(mask, points, (255, 255, 255))le, r, u, lo = min(Y), max(Y), min(X), max(X)# # 仅保留人脸主要信息
result = cv2.bitwise_and(image, mask)result = result[le - 10: r + 10, u - 10: lo + 10]
# 将图像转换为灰度
gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)# 创建一个掩码,将黑色区域变成白色
mask = gray < 5  # 假设阈值为5,可以根据实际情况调整# 使用掩码将黑色区域变成白色
result[mask] = [255, 255, 255]
# # 保存结果图像
cv2.imwrite("face_only.jpg", result)
#
# # 显示结果图像(可选)
cv2.imshow("Face Only", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键代码

 X, Y = [], []for landmark in landmarks.landmark:# 将标记点的归一化坐标转换为图像坐标ih, iw, _ = image.shapex, y = int(landmark.x * iw), int(landmark.y * ih)X.append(x)Y.append(y)
""" 在循环中遍历人脸关键点,将每个关键点的归一化坐标转换为图像坐标,
并将 x 和 y 坐标分别添加到 X 和 Y 列表中。这个循环通过遍历所有的关键点,
将它们的坐标提取出来,最终得到 X 和 Y 列表,其中包含了所有关键点的 x 和 y 坐标。 """
cv2.fillConvexPoly(mask, points, (255, 255, 255))"""创建了一个与原始图像大小相同的空白掩码(mask),用于标记要保留的区域。
使用 cv2.fillConvexPoly 函数,将上一步计算得到的凸包(轮廓)填充到掩码上,
并将填充的区域标记为白色(255, 255, 255)。
这一步的结果是在掩码上生成了一个白色区域,该区域对应于人脸的轮廓。"""
result = cv2.bitwise_and(image, mask)"""使用 cv2.bitwise_and 函数,将原始图像 (image) 与掩码 (mask) 进行按位与运算,
以仅保留掩码中白色区域对应的原始图像区域。
这样,result 变量将包含原始图像中仅保留了人脸轮廓部分的图像,
其他区域将被去除,从而仅保留人脸的主要信息。"""le, r, u, lo = min(Y), max(Y), min(X), max(X)
""" 获取人脸范围 """
result = result[le - 10: r + 10, u - 10: lo + 10]
"""这一行代码从 result 图像中提取一个子图像,通过使用切片操作来定义提取的区域"""
# 将图像转换为灰度
gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)
"""这一行代码将提取的子图像 result 转换为灰度图像,以便进行下一步的阈值处理"""
# 创建一个掩码,将黑色区域变成白色
mask = gray < 5  # 假设阈值为5,可以根据实际情况调整
"""这一行代码创建一个掩码,根据灰度值小于5的像素来标记图像中的区域。
也就是说,任何灰度值小于5的像素都将在掩码中标记为 True,而大于等于5的像素将标记为 False"""
# 使用掩码将黑色区域变成白色
result[mask] = [255, 255, 255]
"""这一行代码使用掩码,将在掩码中为 True 的像素,也就是灰度值小于5的像素,
设置为白色(255, 255, 255)"""

实验

在这里插入图片描述

结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/192417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes学习笔记-Part.09 K8s集群构建

目录 Part.01 Kubernets与docker Part.02 Docker版本 Part.03 Kubernetes原理 Part.04 资源规划 Part.05 基础环境准备 Part.06 Docker安装 Part.07 Harbor搭建 Part.08 K8s环境安装 Part.09 K8s集群构建 Part.10 容器回退 第九章 K8s集群构建 9.1.集群初始化 集群初始化是首…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《余电上网/制氢方式下微电网系统全生命周期经济性评估》

该标题涉及到对微电网系统的全生命周期经济性进行评估&#xff0c;其重点关注两种运营方式&#xff1a;余电上网和制氢。以下是对标题的解读&#xff1a; 微电网系统&#xff1a; 微电网是指一种小规模的电力系统&#xff0c;通常包括分布式能源资源&#xff08;如太阳能、风能…

TS数据类型(全)

TS支持和JS几乎相同的数据类型&#xff0c;此外还提供了实用的枚举类型 总结&#xff1a;ts中变量一开始是什么类型&#xff0c;那么后期赋值的时候&#xff0c;只能用这个类型的数据&#xff0c;是不允许用其他类型的数据赋值给当前的这个变 量中。 数字类型&#xff08;numbe…

ES通过抽样agg聚合性能提升3-5倍

一直以来&#xff0c;es的agg聚合分析性能都比较差&#xff08;对应sql的 group by&#xff09;。特别是在超多数据中做聚合&#xff0c;在搜索的条件命中特别多结果的情况下&#xff0c;聚合分析会非常非常的慢。 一个聚合条件&#xff1a;聚合分析请求的时间 search time a…

DIV从不能移动变成随便定位(静态+编程)的方法

编了一个游戏测试小网页&#xff0c;竟然发现DIV不能随便移动&#xff0c;查了半天终于解决了静态和编程定位的问题。特别记录一下。 <div οnmοusedοwn"mDown(this)" οnmοuseup"mUp(this)" style"background-color: #D94A38; position: abso…

部署springboot项目到GKE(Google Kubernetes Engine)

GKE是 Google Cloud Platform 提供的托管 Kubernetes 服务&#xff0c;允许用户在 Google 的基础设施上部署、管理和扩展容器。本文介绍如何部署一个简单的springboot项目到GKE. 本文使用podman. 如果你用的是docker, 只需要把本文中所有命令中的podman替换成docker即可 非H…

LeetCode [中等]二叉树的右视图(层序

199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 从二叉树的层序遍历改进&#xff0c;根右左 /*** Definition for a binary tree node.* public class TreeNode {* public int val;* public TreeNode left;* public TreeNode right;* public T…

MiniDumpWriteDump函数生成dmp文件

MiniDumpWriteDump函数生成dmp文件 一&#xff1a;概述二&#xff1a; CreateDump.h三&#xff1a;CreateDump.cpp四&#xff1a;main测试五&#xff1a;winDbg分析 一&#xff1a;概述 v2008及以上版本都可以用。 包含CreateDump.h&#xff0c;CreateDump.cpp文件&#xff0c…

Linux: FS: inotify

这个和网卡的event-notify是一样的逻辑,内核看到有什么事情发生,可以通知到用户,然后用户可以根据自己的需求做一些处理。第一次看到,记录一下算是可以日后可以用到的功能。 man inotify。 inotify - monitoring filesystem events 描述: The inotify API provides a mec…

java+springboot物资连锁仓库经营商业管理系统+jsp

主要任务&#xff1a;通过网络搜集与本课题相关的素材资料&#xff0c;认真分析连锁经营商业管理系统的可行性和要实现的功能&#xff0c;做好需求分析&#xff0c;确定该系统的主要功能模块&#xff0c;依据数据库设计的原则对数据库进行设计。最后通过编码实现本系统功能并测…

Python核心编程之此时起步,为时不晚

目录 一、前言 二、程序输出,print语句及“HelloWorld!” 三、程序输入和 raw_input()内建函数

【KPDK】Log Library

DPDK日志库为其他DPDK库和驱动程序提供日志记录功能。默认情况下&#xff0c;在Linux应用程序中&#xff0c;日志既发送到syslog&#xff0c;也发送到控制台。在FreeBSD和Windows应用程序上&#xff0c;日志只发送到控制台。但是&#xff0c;用户可以覆盖日志功能以使用不同的日…

Linux周期任务

我自己博客网站里的文章 Linux周期任务&#xff1a;at和crontab 每个人或多或少都有一些约会或者是工作&#xff0c;有的工作是长期周期性的&#xff0c; 例如&#xff1a; 每个月一次的工作报告每周一次的午餐会报每天需要的打卡…… 有的工作则是一次性临时的&#xff0…

Prometheus+Grafana搭建日志采集

介绍 一、什么是日志数据采集 日志数据采集是指通过各种手段获取应用程序运行时产生的各类日志信息&#xff0c;并将这些信息存储到特定的地方&#xff0c;以便后续分析和使用。通常情况下&#xff0c;这些日志信息包括系统运行状态、错误信息、用户操作记录等等。通过对这些…

牛客算法题 【HJ97 记负均正】 golang实现

题目 HJ97 记负均正 描述 首先输入要输入的整数个数n&#xff0c;然后输入n个整数。输出为n个整数中负数的个数&#xff0c;和所有正整数的平均值&#xff0c;结果保留一位小数。 0即不是正整数&#xff0c;也不是负数&#xff0c;不计入计算。如果没有正数&#xff0c;则平均…

大文件分片上传、分片进度以及整体进度、断点续传(一)

大文件分片上传 效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页面上写几个组件用来获取文件。 <body><input type"file" id"file" /><button id"uploadButton…

代码随想录-刷题第十五天

二叉树层序遍历 题目链接&#xff1a;102. 二叉树的层序遍历 思路&#xff1a;利用队列来存储遍历的节点&#xff0c;同时要定义size来保存当前层的节点个数。 时间复杂度O(n) 层序遍历的一般写法&#xff0c;通过一个 while 循环控制从上向下一层层遍历&#xff0c;for 循…

动态规划学习——回文串

目录 一&#xff0c;回文子串 1.题目 2.题目接口 3&#xff0c;解题代码及其思路 解题代码&#xff1a; 二&#xff0c; 分割回文串II 1&#xff0c;题目 2&#xff0c;题目接口 3&#xff0c;解题思路及其代码 一&#xff0c;回文子串 1.题目 给你一个字符串 s &…

模板初阶(2):函数模板的匹配原则,类模板的实例化

一、函数模板的匹配原则 int Add(const int& x, const int& y) {return x y; }template <class T> T Add(const T& x, const T& y) {return x y; }int main() {int a1 1, a2 2;Add(a1, a2);double d1 1.1, d2 2.2;Add(d1, d2);return 0; }一个非模…