OPENCV C++(五)滤波函数+sobel边缘检测+人脸磨皮mask

news/2025/1/15 8:29:48/

滤波函数

 中值滤波

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;
}

 


http://www.ppmy.cn/news/1006524.html

相关文章

JAVA语言:如何自定义类加载器?

本文重点 前面的课程中&#xff0c;我们已经学习了双亲委派机制&#xff0c;如果想要自定义一个类加载器&#xff0c;那么我们只需要继承ClassLoader&#xff0c;并且定义好自己的findClass就可以了&#xff0c;也就是自己的类加载器是如何进行工作的&#xff0c;而loadClass就…

redis原理 4:雷厉风行 —— 管道

大多数同学一直以来对 Redis 管道有一个误解&#xff0c;他们以为这是 Redis 服务器提供的一种特别的技术&#xff0c;有了这种技术就可以加速 Redis 的存取效率。但是实际上 Redis 管道 (Pipeline) 本身并不是 Redis 服务器直接提供的技术&#xff0c;这个技术本质上是由客户端…

电动汽车设计、制造、研发的学科、技术和前沿科技综述

引言&#xff1a;电动汽车作为替代传统燃油汽车的一种先进交通工具&#xff0c;不仅具有环保、低噪音等优势&#xff0c;而且对于能源消耗和气候变化等全球性问题也具有重要意义。本文将综述与电动汽车设计、制造、研发相关的学科、技术和前沿科技&#xff0c;以期对电动汽车领…

ACY100油烟浓度在线监控

ACY100油烟浓度在线监控仪-安科瑞 崔丽洁 ACY100型饮食业油烟浓度在线监控仪&#xff08;以下简称监控仪&#xff09;是针对饮食业厨房油烟排放场合设计的&#xff0c;由油烟探头、传感器、控制板和显示屏等部分组成&#xff0c;用于监控油烟、颗粒物和非甲烷总烃等污染物的排放…

无人驾驶实战-第七课(高精地图和V2X )

高精地图是无人驾驶中的重要一环&#xff0c;对环境感知、规划与定位等都有重要的作用。 高精地图的特点&#xff1a; 可视化、静态目标、地图信息、点云数据 高精地图与导航地图的区别 High Definition Map Navigation Map Precision cm m Information 3D lane info Mo…

笔记:Android 9系统启动流程

启动流程 1.按下电源&#xff0c;系统启动 当电源键按下时&#xff0c;引导芯片代码&#xff08;汇编指令&#xff09;会从预定的地方&#xff08;固化在ROM&#xff09;开始执行&#xff0c;将引导程序 BootLoader 加载到 RAM中&#xff0c;然后执行 2.引导程序 BootLoader …

Android 版本 对应的 API版本

Android 14&#xff08;开发者预览版&#xff09; 如需详细了解平台变更&#xff0c;请参阅 Android 14 文档。 Android 13&#xff08;API 级别 33&#xff09; 如需详细了解平台变更&#xff0c;请参阅 Android 13 文档。 Android 12&#xff08;API 级别 31、32&#xf…

VBA技术资料1-146

VBA技术资料本周更新较多&#xff1a;单值查找并提示结果&#xff1b;多值查找并提示结果&#xff1b;复制整个数据范围到PowerPoint&#xff1b;更改PowerPoint文本框字体大小&#xff1b;调整PowerPoint图像为整幻灯片&#xff1b;在PowerPoint中添加末尾幻灯片&#xff1b;在…