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;
}
相关推荐
算法狗217 小时前
大模型面试题:Transformer架构如何克服Seq2Seq模型的挑战
人工智能·深度学习·语言模型
Web3VentureView17 小时前
Web4的入口,即将打开 | SYNBO CLUB移动端亟待上线
大数据·人工智能·区块链·媒体·加密货币
aiAIman17 小时前
OpenClaw 用户必修课:(三)Claude Code 单一聊天原则、Hooks 与 LSP
数据库·人工智能·开源·aigc
ai产品老杨17 小时前
源码交付与异构算力破局:基于GB28181/RTSP的Docker化AI视频平台架构实战
人工智能·docker·音视频
老鱼说AI17 小时前
大模型面试第二期:层归一化篇
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·chatgpt
Once_day17 小时前
AI实践(3)Token与上下文窗口
人工智能·ai实践
cui_ruicheng17 小时前
C++ 数据结构:AVL树原理与实现
数据结构·c++
prog_610317 小时前
【笔记】用cursor手搓cursor(一)
人工智能·笔记·agent
我材不敲代码17 小时前
OpenCV的核心图像处理方法——图像边界处理、图像算术运算、阈值分割、噪声与滤波
图像处理·人工智能·opencv
数据中穿行17 小时前
CAM多轴数控控制算法详解
人工智能