当前位置: 首页 > news >正文

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

滤波函数

 中值滤波

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.lryc.cn/news/112175.html

相关文章:

  • 20天突破英语四级高频词汇——第②天
  • 【Python 学习】第一个python案例
  • 【C#学习笔记】值类型(2)
  • 【设计模式】-建造者模式
  • 【N32L40X】学习笔记14-在RT-thread系统中读取eeprom数据
  • Python OpenCV读取并显示USB UVC摄像头
  • 针对高可靠性和高性能优化的1200V碳化硅沟道MOSFET
  • 在服务器上搭建gitlab
  • Amazon Aurora Serverless v2 正式发布:针对要求苛刻的工作负载的即时扩展
  • nginx的优化和防盗链 重要!!!
  • 十五.redis缓存穿透,击穿,雪崩
  • Spring源码——初识Spring容器
  • arcgis--数据库构建网络数据集
  • 华为OD机试真题【西天取经】
  • 心电信号时域特征分析与Python实现
  • 认识MyBatis 之 MyBatis的动态SQL
  • 【项目 计网2】4.4网络模型 4.5协议 4.6网络通信的过程
  • redis入门3-在java中操作redis
  • 网络安全预警分类流程
  • SpringBoot复习:(20)如何把bean手动注册到容器?
  • VLT:Vision-Language Transformer用于引用的视觉语言转换和查询生成分割
  • 【开源项目--稻草】Day04
  • 【数模】奇异值分解SVD和图形处理
  • mongodb-win32-x86_64-2008plus-ssl-3.6.23-signed.msi
  • 华为Euler系统忘记密码之密码重置
  • Java-多线程-深入理解ConcurrentHashMap
  • 没有配置redis但是报错连接redis失败
  • 剑指 Offer 04. 二维数组中的查找
  • 【工作中问题解决实践 九】Spring中事务传播的问题排查
  • 【导出Word】如何使用Java+Freemarker模板引擎,根据XML模板文件生成Word文档(只含文本内容的模板)