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;
}
相关推荐
EasyCVR1 小时前
视频融合平台EasyCVR在智慧水利中的实战应用:构建全域感知与智能预警平台
人工智能·音视频
DisonTangor1 小时前
阿里开源Qwen3-Omni-30B-A3B三剑客——Instruct、Thinking 和 Captioner
人工智能·语言模型·开源·aigc
独孤--蝴蝶1 小时前
AI人工智能-机器学习-第一周(小白)
人工智能·机器学习
西柚小萌新2 小时前
【深入浅出PyTorch】--上采样+下采样
人工智能·pytorch·python
丁学文武2 小时前
大语言模型(LLM)是“预制菜”? 从应用到底层原理,在到中央厨房的深度解析
人工智能·语言模型·自然语言处理·大语言模型·大模型应用·预制菜
fie88892 小时前
基于MATLAB的声呐图像特征提取与显示
开发语言·人工智能
文火冰糖的硅基工坊3 小时前
[嵌入式系统-100]:常见的IoT(物联网)开发板
人工智能·物联网·架构
刘晓倩3 小时前
实战任务二:用扣子空间通过任务提示词制作精美PPT
人工智能
却道天凉_好个秋3 小时前
OpenCV(七):BGR
opencv·计算机视觉
shut up4 小时前
LangChain - 如何使用阿里云百炼平台的Qwen-plus模型构建一个桌面文件查询AI助手 - 超详细
人工智能·python·langchain·智能体