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

滤波函数

中值滤波

cpp 复制代码
medianBlur(frame, detectmat, 5);

平均滤波

cpp 复制代码
blur(frame, detectmat, Size(5, 5));

高斯滤波(最后一个是方差 越大越模糊)

cpp 复制代码
GaussianBlur(frame, detectmat, Size(5, 5),0);

sobel的边缘检测函数

cpp 复制代码
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的应用

人脸阈值

cpp 复制代码
//肤色h					
		double i_minH = 0;
		double i_maxH = 20;

		//肤色颜色饱和度s
		double i_minS = 43;
		double i_maxS = 255;

		//肤色颜色亮度v
		double i_minV = 55;
		double i_maxV = 255;

将原图转化为HSV类型,找出人脸并并给maskmat(这里是一个区域,人脸所包含是roi)

cpp 复制代码
		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);

对原图进行高斯滤波

cpp 复制代码
GaussianBlur(frame, guss_Mat, Size(5, 5), 3, 0);

将高斯滤波后的人脸区域替换到原图上

cpp 复制代码
		frame.copyTo(objectMat);
		guss_Mat.copyTo(objectMat, maskMat);

		imshow("磨皮后", objectMat);




完整代码:

cpp 复制代码
#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;

		//肤色颜色饱和度s
		double i_minS = 43;
		double i_maxS = 255;

		//肤色颜色亮度v
		double 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;
}
相关推荐
Shockang28 分钟前
AI 编码智能体生产化工程
人工智能
jay神2 小时前
深度学习确定baseline之后怎么做改进?
人工智能·深度学习·yolo·计算机视觉·分类
acrel72 小时前
安科瑞Acrel-1000变电站综合自动化系统在合肥某新材料公司35kV综合自动化项目中的应用分析
大数据·人工智能
UWA2 小时前
隐藏视频变“常驻刺客”,VideoPlayer与“N/A”纹理该怎么查
人工智能·性能优化·音视频·memory·cpu·游戏开发
V哥AI增长2 小时前
小红书笔记在生成式AI引擎中的可见性机制解析:从抓取原理到GEO工程化实践
大数据·人工智能·笔记
ajassi20003 小时前
AI语音智能体开发日记(十二)GX8006 固件定制指南——从双唤醒词到 UART 音频传输
人工智能·ai·ai编程
大模型momo3 小时前
告别单体 Agent:多智能体设计模式(Multi-Agent Patterns)深度实战手册
人工智能·agent·multi-agent·多agent
DisonTangor3 小时前
【SeeDream开源平替】MiniMax H3 重磅开源:全模态视频生成新标杆,2K 画质 + 原生立体声,15 秒大片一键生成!
人工智能·ai作画·开源·aigc·音视频
很楠爱上3 小时前
(附上相关学习资源)适合新手做的第一个agent项目*ovo*Dify Agent 全栈实战:从智能选车顾问到新能源汽车之家的端到端开发
人工智能·汽车·agent·项目·开发笔记
IT智慧客07313 小时前
2026年7月前端面试高频考点与趋势分析(面20个前端后的总结)
人工智能