OPENCV C++(五)滤波函数+sobel边缘检测+人脸磨皮mask
滤波函数
中值滤波
medianBlur(frame, detectmat, 5);
平均滤波
blur(frame, detectmat, Size(5, 5));
高斯滤波(最后一个是方差 越大越模糊)
GaussianBlur(frame, detectmat, Size(5, 5),0);
sobel的边缘检测函数
Sobel(gray, dx, CV_16S, 1, 0, 3);//x方向的 因为是1,0
convertScaleAbs(dx, dx);//转换绝对值
Sobel(gray, dy, CV_16SC1, 0, 1, 3);//y方向的 因为0,1
convertScaleAbs(dy, dy);
Sobel(gray, dx_add_dy1, CV_16SC1, 1, 1, 3);//尝试一下1,1 发现并不是简单的都叠加
convertScaleAbs(dx_add_dy1, dx_add_dy1);//效果不好 为啥?addWeighted(dx, 0.5, dy, 0.5, 0, dx_add_dy2);只能互相单独做 然后再叠加的方式 效果很好
利用高斯滤波对人脸进行平滑处理,学习mask的应用
人脸阈值
//肤色h double i_minH = 0;double i_maxH = 20;//肤色颜色饱和度sdouble i_minS = 43;double i_maxS = 255;//肤色颜色亮度vdouble i_minV = 55;double i_maxV = 255;
将原图转化为HSV类型,找出人脸并并给maskmat(这里是一个区域,人脸所包含是roi)
cvtColor(frame, hsvMat, COLOR_BGR2HSV);frame.copyTo(maskMat);cv::inRange(hsvMat, Scalar(i_minH, i_minS, i_minV), Scalar(i_maxH, i_maxS, i_maxV), maskMat);
对原图进行高斯滤波
GaussianBlur(frame, guss_Mat, Size(5, 5), 3, 0);
将高斯滤波后的人脸区域替换到原图上
frame.copyTo(objectMat);guss_Mat.copyTo(objectMat, maskMat);imshow("磨皮后", objectMat);
完整代码:
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;int main() {VideoCapture cap(0);while (1) {Mat frame;Mat detectmat;Mat dx;Mat dy;Mat dx_add_dy1;Mat dx_add_dy2;Mat gray;cap >> frame;cvtColor(frame, gray, COLOR_BGR2GRAY);frame.copyTo(detectmat);//medianBlur(frame, detectmat, 5);//blur(frame, detectmat, Size(5, 5));//GaussianBlur(frame, detectmat, Size(5, 5),0); //最后一个是方差 越大越模糊Sobel(gray, dx, CV_16S, 1, 0, 3);convertScaleAbs(dx, dx);Sobel(gray, dy, CV_16SC1, 0, 1, 3);convertScaleAbs(dy, dy);Sobel(gray, dx_add_dy1, CV_16SC1, 1, 1, 3);convertScaleAbs(dx_add_dy1, dx_add_dy1);//效果不好 为啥?addWeighted(dx, 0.5, dy, 0.5, 0, dx_add_dy2);//imshow("frame", frame);//imshow("detect", detectmat);imshow("dx", dx);imshow("dy", dy);imshow("dx_add_dy1", dx_add_dy1);//效果不好imshow("dx_add_dy2", dx_add_dy2);/Mat hsvMat;Mat maskMat;Mat objectMat;Mat guss_Mat;//肤色h double i_minH = 0;double i_maxH = 20;//肤色颜色饱和度sdouble i_minS = 43;double i_maxS = 255;//肤色颜色亮度vdouble i_minV = 55;double i_maxV = 255;cvtColor(frame, hsvMat, COLOR_BGR2HSV);frame.copyTo(maskMat);cv::inRange(hsvMat, Scalar(i_minH, i_minS, i_minV), Scalar(i_maxH, i_maxS, i_maxV), maskMat);GaussianBlur(frame, guss_Mat, Size(5, 5), 3, 0);frame.copyTo(objectMat);guss_Mat.copyTo(objectMat, maskMat);imshow("磨皮后", objectMat);waitKey(30);}return 0;
}
相关文章:
OPENCV C++(五)滤波函数+sobel边缘检测+人脸磨皮mask
滤波函数 中值滤波 medianBlur(frame, detectmat, 5); 平均滤波 blur(frame, detectmat, Size(5, 5)); 高斯滤波(最后一个是方差 越大越模糊) GaussianBlur(frame, detectmat, Size(5, 5),0); sobel的边缘检测函数 Sobel(gray, dx, CV_16S, 1, 0, 3…...

20天突破英语四级高频词汇——第②天
20天突破英语四级高频词汇~第2天加油(ง •_•)ง💪 🐳博主:命运之光 🌈专栏:英语四级高频词汇速记 🌌博主的其他文章:点击进入博主的主页 目录 20天突破英语四级高…...
【Python 学习】第一个python案例
Python的ATM机Demo 一、需要安装python环境(略) 二、ATM源码 # 初始化全局余额 money 5000# 定义初始化界面菜单函数def menu(name):"""主页面-主菜单 返回用户选择的菜单:param name: 用户名称:return: 返回菜单类型"""print(f"{name}…...

【C#学习笔记】值类型(2)
文章目录 Struct结构体类型为什么不推荐struct 元组类型可为空的值类型从可为空的值类型转换为基础类型提升的运算符如何确定可为空的值类型为什么建议少用T?装箱和取消装箱 Struct结构体类型 结构类型(“structure type”或“struct type”)是一种可封…...

【设计模式】-建造者模式
Java建造者模式:创建复杂对象的灵活构建者 在软件开发中,我们经常遇到需要创建一个复杂对象的情况。如果使用传统的构造函数进行对象创建,可能会导致构造函数参数过多,难以管理和维护。建造者模式(Builder Pattern&am…...

【N32L40X】学习笔记14-在RT-thread系统中读取eeprom数据
eeprom 说明 eeprom介绍 AT24C01A,1K串行EEPROM:内部组织16页8字节,1K需要一个7位数据字地址进行随机字寻址。AT24C02,2K串行EEPROM:内部组织32页8字节,2K需要一个8位数据字地址进行随机字寻址。AT24C04,4K串行EEPRO…...
Python OpenCV读取并显示USB UVC摄像头
1. 安装Python, 略。 2. 安装 OpenCV: pip install opencv-python 3. 预览摄像头画面脚本: import cv2cap cv2.VideoCapture(0, cv2.CAP_DSHOW)if not (cap.isOpened()):print("Could not open video device")cap.set(cv2.CAP_PR…...

针对高可靠性和高性能优化的1200V碳化硅沟道MOSFET
目录 标题:1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance摘要信息解释研究了什么文章创新点文章的研究方法文章的结论 标题:1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance 摘要 本文详…...

在服务器上搭建gitlab
最终效果展示: 官方文档: 安装部署GitLab服务 1.在服务器上下载gitlab wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.9.0-ce.0.el7.x86_64.rpm rpm -ivh gitlab-ce-12.9.0-ce.0.el7.x86_64.rpm 2.编辑站点位置 vim …...

Amazon Aurora Serverless v2 正式发布:针对要求苛刻的工作负载的即时扩展
我们非常兴奋地宣布,Amazon Aurora Serverless v2 现已面向 Aurora PostgreSQL 和 MySQL 正式发布。Aurora Serverless 是一种面向 Amazon Aurora 的按需自动扩展配置,可让您的数据库根据应用程序的需求扩展或缩减容量。 亚马逊云科技开发者社区为开发者…...

nginx的优化和防盗链 重要!!!
实验一、隐藏版本号 要把nginx的版本号隐藏起来,防止恶意攻击 方法一:修改配置文件 在http模块中加入一个命令 server_token off; 过程: 备份,改配置文件一定要备份 修改配置文件 在http模块中添加 server_tokens …...

十五.redis缓存穿透,击穿,雪崩
redis哨兵模式 一.缓存穿透1.概念2.解决方案1)接口校验2)缓存空值3)布隆过滤器4)实时监控 二.缓存击穿1.概念2.解决方案1)设置热点数据永不过期2)加互斥锁3)”提前“使用互斥锁 / 逻辑过期4&…...

Spring源码——初识Spring容器
Spring源码之工厂(容器) 为什么把Spring的工厂又叫做容器呢? 工厂的责任是创建对象,但是创建完对象后还要进行存储(针对于单例的对象来讲),以供其他地方使用,这就是容器。为了能存…...

arcgis--数据库构建网络数据集
1、打开arcmap软件,导入数据,如下: 该数据已经过处理,各交点处均被打断,并进行了拓扑检查。 2、在文件夹下新建文件数据库,名称为路网,在数据库下新建要素类,并导入道路shp文件&…...
华为OD机试真题【西天取经】
1、题目描述 【西天取经】 唐僧师徒四人去西天取经,一路翻山越岭。一日,师徒四人途径一个 mxn 长方形区域,已知 1.将取经队伍作为一个整体,4 人行走相同路线。 2.取经队伍的起点为该长方形区域的左上角,目的地为该长方…...
心电信号时域特征分析与Python实现
目录 1 引言 2 心电信号时域特征的含义 3 Python实现心电信号时域特征提取 4 结论 1 引言 心电信号是由心脏电活动引起的电信号...
认识MyBatis 之 MyBatis的动态SQL
前言 本篇介绍MyBatis里如何使用动态SQL,了解如何去简单使用动态标签;如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言MyBatis - 动态 SQLif标签trim标签where标签update set 标签delet…...

【项目 计网2】4.4网络模型 4.5协议 4.6网络通信的过程
文章目录 4.4网络模型OSI七层参考模型TCP/IP四层模型(常用)简介四层介绍 4.5协议简介常见协议UDP协议TCP协议IP协议以太网帧协议(MAC地址封装)ARP协议(IP->MAC) 4.6网络通信的过程封装分用 4.4网络模型 …...

redis入门3-在java中操作redis
Redis的java客户端 Jedis、Lettuce、Redisson、以及spring提供的spring data redis Jedis操作redis //添加依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version> </dep…...

网络安全预警分类流程
网络安全预警指南 随着信息技术的广泛应用与快速发展,传统业务与信息系统的融合程度不断加深,网络安全对国家政治、经济、文化、公共服务活动的影响进一步增大。网络安全形势日趋复杂,安全威胁不断变化,利用网络漏洞、恶意程序从…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

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

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...