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;
}
相关推荐
stay_alive.8 分钟前
C++ 四种类型转换
开发语言·c++
卡提西亚13 分钟前
C++笔记-9-三目运算符和switch语句
c++·笔记
门框研究员14 分钟前
AI基础设施的临界点:算力、资本与政策的三重博弈
人工智能
罗西的思考33 分钟前
【Agent】 ACE(Agentic Context Engineering)源码阅读笔记 ---(2)--- 训练
人工智能
CodeWizard~34 分钟前
AtCoder Beginner Contest 430赛后补题
c++·算法·图论
AKAMAI41 分钟前
AI推理硬件选型指南:CPU 与 GPU 的抉择
人工智能·云原生·云计算
wechat_Neal41 分钟前
智能网联汽车 HD map架构解析
人工智能·程序人生·敏捷开发
大大dxy大大44 分钟前
机器学习-KNN算法示例
人工智能·算法·机器学习
浮生了大白1 小时前
AI 赋能科研实践:从选题到发表的技术重构之路
人工智能·重构
喜欢吃燃面1 小时前
C++:哈希表
开发语言·c++·学习