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

news2025/1/24 22:39:16

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.shape
            x, 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.shape
            x, 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.coloradmin.cn/o/1279265.html

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

相关文章

【KPDK】概述

DPDK的主要目标是为数据平面应用程序中的快速数据包处理提供一个简单、完整的框架。用户可以使用代码来理解所采用的一些技术&#xff0c;构建原型或添加自己的协议栈。可提供使用DPDK的替代生态系统选项。 DPDK框架通过创建环境抽象层&#xff08;EAL&#xff09;为特定环境创…

LeetCode Hot100 169.多数元素

题目&#xff1a; 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 方法一&#xff1a;哈希表 ​ class Solution {public int…

记录一次vscode markdown的图片路径相关插件学习配置过程

插件及说明查找过程 csdn搜索markdown图片路径&#xff0c;找到关于这一款插件的回答。打开vscode拓展搜索Paste Image这款插件&#xff0c;看到下载量挺高的&#xff0c;应该不赖。 点击仓库,进入该插件开源的github仓库,查看README文件阅读说明. 淡然在Vscode 插件项目下的细…

C语言之结构体

一.前言引入. 我们知道在C语言中有内置类型&#xff0c;如&#xff1a;整型&#xff0c;浮点型等。但是只有这些内置类 型还是不够的&#xff0c;假设我想描述学⽣&#xff0c;描述⼀本书&#xff0c;这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体…

vue $nextTick 样式私有化

$nextTick 先updated中更新&#xff0c;再nextTick 状态更改做什么事情&#xff1a; updated $nextTick 同步执行完之后&#xff0c;把当前放到队列中 $forceUpdate->sub.update() // 把更新操作放在队列里面 队列机制 基于发布订阅模式&#xff0c;callbacks队列 更新完毕…

Java类的初始化顺序

类初始化顺序遵循以下三个原则&#xff08;优先级依次递减&#xff09; 1、静态对象&#xff08;变量&#xff09;优先于非静态对象&#xff08;变量&#xff09;初始化&#xff0c;其中静态对象&#xff08;变量&#xff09;只初始化一次&#xff0c;而非静态对象&…

揭秘原型链:探索 JavaScript 面向对象编程的核心(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

[UnityWebGL]修改webgl启动模板

首先了解什么是WEBGGL启动模板&#xff0c;如下图&#xff1a; 其次&#xff0c;启动模板在哪里设置&#xff0c;如下图&#xff1a; 最后&#xff0c;怎么改启动模板里面的内容&#xff08;提供最简单的方式&#xff0c;直接改官方的&#xff09;&#xff1a; 1、首先在Asset…

Spring Cloud Gateway与spring-cloud-circuitbreaker集成与理解

官方文档 spring-cloud-gateway文档地址&#xff1a; https://spring.io/projects/spring-cloud-gateway#overview spring-cloud-circuitbreaker文档地址&#xff1a; https://spring.io/projects/spring-cloud-circuitbreaker 两者关系 首先spring-cloud-gateway集成了断路…

[c++]——string类____详细初步了解string类的运用

在成为大人的路上喘口气. 目录 &#x1f393;标准库类型string &#x1f393;定义和初始化string对象 &#x1f4bb;string类对象的常见构造 &#x1f4bb;string类对象的不常见构造 &#x1f4bb;读写string对象 &#x1f393; string类对象的修改操作 &#x1f4…

Opencv制作电子签名(涉及知识点:像素过滤,图片通用resize函数,像素大于某个阈值则赋值为其它的像素值)

import cv2def resize_by_ratio(image, widthNone, heightNone, intercv2.INTER_AREA):img_new_size None(h, w) image.shape[:2] # 获得高度和宽度if width is None and height is None: # 如果输入的宽度和高度都为空return image # 直接返回原图if width is None:h_ratio …

git-6

1.如何用project管理issue&#xff1f; 用project看板管理issue 有五种类型&#xff1a;None、Basic kanban、Automated kanban、Automated kanban with reviews、Bug triage 首先选用Bug triage 利用看板就会很直观&#xff0c;很便捷&#xff0c;Issues也支持&#xff0c;有…

OpenTelemetry系列 - 第4篇 OpenTelemetry K8S生态

目录 一、【Helm】添加OTel Helm repo二、【Helm Chart】OTel Collector2.1 daemonset2.2 deloyment 三、【K8S Operator】OTel Operator3.1 安装OTel Operator3.2 部署OpenTelemetryCollector3.2.1 Deloyment Mode3.2.2 DeamonSet Mode3.2.3 StatefulSetMode3.2.4 Sidecar Mod…

思维模型 莫扎特效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。音乐激发无限潜能。 1 莫扎特效应的应用 1.1 莫扎特效应在教育领域的应用-Baby Einstein”公司 在美国&#xff0c;有一家名为“Baby Einstein”的公司&#xff0c;该公司生产和销售专门为…

SQL自学通之简介

目录 一、SQL 简史 二、数据库简史 1、Dr. Codds 对关系型数据库系统的十二条规则 2、设计数据库的结构 3、数据库的前景 4、对于什么是客户机/服务器型电脑系统 BernardH.Boar的定义如下&#xff1a; 5、交互式语言 6、易于实现 7、SQL 总览 三、流行的 SQL 开发工具…

前端小记--2.element-ui中级联选择器cascader如何默认展开下拉框

最近做项目时&#xff0c;遇到一个需求&#xff1a;在一个排班表中&#xff0c;展示人员的值班情况&#xff0c;点击单元格&#xff0c;弹出下拉框&#xff0c;修改人员排班信息。 由于下拉框选择内容是树状结构&#xff0c;这里使用了element-ui中级联组件cascader&#xff0c…

一起学docker系列之十七Docker Compose 与手动操作的比较与优势分析

目录 1 前言2 不使用 Docker Compose2.1 启动 MySQL 容器2.2 启动 Redis 容器2.3 启动微服务容器 3 使用 Docker Compose4 使用 Docker Compose 的优势5 结语参考地址 1 前言 在当今容器化应用的开发与部署中&#xff0c;容器编排工具的选择对于简化流程、提高效率至关重要。本…

6-69.鸭子也是鸟

按要求完成下面的程序&#xff1a; 1、定义一个Bird类&#xff0c;包含一个void类型的无参的speak方法&#xff0c;输出“Jiu-Jiu-Jiu”。 2、定义一个Duck类&#xff0c;公有继承自Bird类&#xff0c;其成员包括&#xff1a; &#xff08;1&#xff09;私有string类型的成员na…

WPF实现文字纵向排布的TabItem

文章目录 基本用法文字竖排显示 WPF布局 基本用法 WPF中的TabControl是一个容器控件&#xff0c;用于在单个窗体或页面中承载多个选项卡。每个选项卡可以包含不同的控件&#xff0c;用于显示不同的内容&#xff0c;其最简单的调用方法如下&#xff0c;只需在TabControl中无脑…

德迅云安全的日常网站安全性措施、以及更多网站安全工具的推荐与使用。

要确保网站的安全性&#xff0c;可以采取以下措施&#xff1a; 更新和维护&#xff1a;定期更新网站的操作系统、应用程序和插件&#xff0c;确保使用的是最新版本&#xff0c;以修复已知的安全漏洞。 强密码策略&#xff1a;使用强密码&#xff0c;包含字母、数字和特殊字符的…