Opencv实战【1】人脸检测并对ROI区域进行部分处理(变身乔碧萝!!!)

步骤:

1、利用Opencv自带的分类器检测人脸

预备知识:Haar特征分类器

Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。
Haar特征分类器存放地址:
(找自己的安装目录)
1、D:\opencv\opencv4.0\opencv4.0.0\sources\data\haarcascades
2、D:\opencv\opencv4.0\opencv4.0.0\build\etc\haarcascades
总览一下:

haarcascade_eye.xml	;仅可以检测睁开的眼睛
haarcascade_eye_tree_eyeglasses.xml;仅在带被检测者戴眼镜时方可检测
haarcascade_frontalcatface.xml
haarcascade_frontalcatface_extended.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_alt_tree.xml
haarcascade_frontalface_alt2.xml;个人感觉这个好用点
haarcascade_frontalface_default.xml
haarcascade_fullbody.xml
haarcascade_lefteye_2splits.xml
haarcascade_licence_plate_rus_16stages.xml
haarcascade_lowerbody.xml
haarcascade_profileface.xml
haarcascade_righteye_2splits.xml
haarcascade_russian_plate_number.xml
haarcascade_smile.xml
haarcascade_upperbody.xml

detectMultiScale函数详解

void detectMultiScale(const Mat& image,CV_OUT vector<Rect>& objects,double scaleFactor = 1.1,int minNeighbors = 3, int flags = 0,Size minSize = Size(),Size maxSize = Size()
);

函数介绍:
参数1:image–待检测图片,一般为灰度图像加快检测速度;
参数2:objects–被检测物体的矩形框向量组;
参数3:scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
参数4:minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。
如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
这种设定值一般用在用户自定义对检测结果的组合程序上;
参数5:flags–要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为
CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,
因此这些区域通常不会是人脸所在区域;
参数6、7:minSize和maxSize用来限制得到的目标区域的范围。
代码实现:

#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include "My_ImageProssing_base.h"using namespace cv;
using namespace std;//训练文件路径
string xmlPath = "D:\\opencv\\opencv4.0\\opencv4.0.0\\build\\etc\\haarcascades\\haarcascade_frontalface_alt2.xml";int main(int argc, char** atgv) {Mat img = imread("D:\\opencv_picture_test\\beauty\\裴佳欣.png",0);//Mat img = imread("D:\\opencv_picture_test\\新垣结衣\\test2.jpg");imshow("input image", img);//【1】加载分类器CascadeClassifier detector;detector.load(xmlPath);if (!detector.load(xmlPath))   //加载训练文件  {cout << "不能加载指定的xml文件" << endl;return -1;}//【2】检测人脸,将信息存储到矩形类faces中vector<Rect> faces;//OpenCV的Rect矩形类用法//如果创建一个Rect对象rect那么rect会有以下几个功能://rect.area();     //返回rect的面积 //rect.size();     //返回rect的尺寸//rect.tl();       //返回rect的左上顶点的坐标 //rect.br();       //返回rect的右下顶点的坐标//rect.width();    //返回rect的宽度 //rect.height();   //返回rect的高度 //rect.contains(Point(x, y));  //返回布尔变量,判断rect是否包含Point(x, y)点detector.detectMultiScale(img,faces, 1.1, 3, 0);//分类器对象调用//【3】框出人脸for (size_t t = 0; t < faces.size(); t++) {rectangle(img, faces[t], Scalar(0, 0, 255), 2, 8);//faces[t]表示第t个的face的矩形类//2代表线条宽度8是线型,默认取8}namedWindow("Result", WINDOW_NORMAL);     //定义窗口显示属性imshow("Result", img);waitKey(0);return 0;
}

2、对人脸矩形框内进行一些处理(这里只对灰度图进行处理)

1、打马赛克(这里我们使用均值滤波)

//打马赛克函数
void mosaic(Mat& srcImage, Mat& dstImage, int times)
{blur(srcImage,dstImage, Size(times*2+1, times * 2 + 1));
}

2、换成其他图片(使用resize,根据人脸区域进行大小改变)//变身乔碧萝

void paste(Mat& srcImage, Mat& dstImage)
{resize(srcImage,dstImage, dstImage.size());
}

3、美颜磨皮(双边滤波)

void clearFreckle(Mat& srcImage, Mat& dstImage, int times)
{bilateralFilter(srcImage, dstImage,times, times*2, times/2);
}

4、视频处理
(模板)

VideoCapture capture(0);
//VideoCapture capture("D:\\opencv_picture_test\\videos\\脸.avi");		
while (1){Mat img;capture >> img;	//读取当前帧//imshow("原视频", img);	//显示当前帧cvtColor(img,img, COLOR_BGR2GRAY);		//转化为灰度图Mat dstImage = img.clone();//【2】检测人脸,将信息存储到矩形类faces中vector<Rect> faces;detector.detectMultiScale(img, faces, 1.1, 3, 0);//分类器对象调用//【3】修改区域信息.......//修改完毕imshow("处理后的视频", dstImage);	//显示当前帧if(waitKey(10) >=0 ) break;	//延时10ms}

完整的代码(视频+贴图):

#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include "My_ImageProssing_base.h"using namespace cv;
using namespace std;//训练文件路径
string xmlPath = "D:\\opencv\\opencv4.0\\opencv4.0.0\\build\\etc\\haarcascades\\haarcascade_frontalface_alt2.xml";
//打马赛克函数
void mosaic(Mat& srcImage, Mat& dstImage, int times)
{blur(srcImage,dstImage, Size(times*2+1, times * 2 + 1));
}
void clearFreckle(Mat& srcImage, Mat& dstImage, int times)
{bilateralFilter(srcImage, dstImage,times, times*2, times/2);
}
void paste(Mat& srcImage, Mat& dstImage)
{resize(srcImage,dstImage, dstImage.size());
}
int main() 
{//Mat img = imread("D:\\opencv_picture_test\\beauty\\裴佳欣.png",0);Mat img2 = imread("D:\\opencv_picture_test\\趣图景图\\小猪.jpg",0);//imshow("input image", img);//【1】加载分类器CascadeClassifier detector;detector.load(xmlPath);if (!detector.load(xmlPath))   //加载训练文件  {cout << "不能加载指定的xml文件" << endl;return -1;}//调用摄像头VideoCapture capture(0);		//类似于 int a=1;//VideoCapture capture("D:\\opencv_picture_test\\videos\\脸.avi");		//类似于 int a=1;while (1){Mat img;capture >> img;	//读取当前帧//imshow("原视频", img);	//显示当前帧cvtColor(img,img, COLOR_BGR2GRAY);		//转化为灰度图Mat dstImage = img.clone();//【2】检测人脸,将信息存储到矩形类faces中vector<Rect> faces;detector.detectMultiScale(img, faces, 1.1, 3, 0);//分类器对象调用//【3】修改区域信息for (size_t t = 0; t < faces.size(); t++){int rows = faces[t].height;int cols = faces[t].width;int start_y = faces[t].y;int start_x = faces[t].x;Mat ROI(rows, cols, CV_8UC1, Scalar(0));Mat dstROI(rows, cols, CV_8UC1, Scalar(0));for (int j = 0;j < rows;j++)	//行循环{for (int i = 0;i < cols;i++)	//列循环{//-------【开始处理每个像素】---------------ROI.at<uchar>(j, i) = img.at<uchar>(j + start_y, i + start_x);//-------【处理结束】---------------}}//马赛克化//mosaic(ROI,dstROI,10);//贴图paste(img2,dstROI);//去雀斑(磨皮)//clearFreckle(ROI, dstROI, 10);for (int j = 0;j < rows;j++)	//行循环{for (int i = 0;i < cols;i++)	//列循环{//-------【开始处理每个像素】---------------dstImage.at<uchar>(j + start_y, i + start_x) = dstROI.at<uchar>(j, i);//-------【处理结束】---------------}}}imshow("处理后的视频", dstImage);	//显示当前帧if(waitKey(10) >=0 ) break;	//延时10ms}return 0;
}

效果展示

1、马赛克效果
裴佳欣
2、磨皮效果(脸蛋更加白净!!!)
双边滤波
3、变身乔碧萝
视频放不上来,就放gif动态图了。
在这里插入图片描述

参考链接

haarcascade_eye.xml、eye_tree_eyeglasses.xml、haarcascade_lefteye_2splits.xml区别使用
OpenCV人脸识别–detectMultiScale函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【黑马甄选离线数仓day10_会员主题域开发_DWS和ADS层】

day10_会员主题域开发 会员主题_DWS和ADS层 DWS层开发 门店会员分类天表: 维度指标: 指标&#xff1a;新增注册会员数、累计注册会员数、新增消费会员数、累计消费会员数、新增复购会员数、累计复购会员数、活跃会员数、沉睡会员数、会员消费金额 维度: 时间维度&#xff08…

iPad和iPhone的app图标尺寸、用途、设置方法

下面是在iPhone专用程序、iPad专用程序和通用程序中使用图标文件的指导&#xff0c;由译言网翻译自苹果官方文档。原文 http://article.yeeyan.org/view/395/100567 注意&#xff1a;图标是你的程序包所必需的组成部分。如果你没有提供程 序所需的各种尺寸的图标&#xff0c;系…

18-傅里叶变化

以时间为参照就是时域分析&#xff0c;当然时间是动态变化的 而傅里叶变换是以频域为基准的&#xff0c;不用关心动态变化&#xff0c;只关心做了多少次而已&#xff0c;次数&#xff0c;频率 傅里叶说过&#xff0c;任何一个周期函数都可以用正弦函数堆叠起来形成。强吧&#…

java中访问修饰符_Java中的非访问修饰符是什么?

java中访问修饰符Java非访问修饰符 (Java non access modifiers) We have 7 non-access modifiers in Java. The name of these non-access modifiers are given below, Java中有7个非访问修饰符 。 这些非访问修饰符的名称如下所示&#xff1a; native 本机 synchronized 已同…

mui实现分享功能_MUI 分享功能(微信、QQ 、朋友圈)

配置文件&#xff1a;manifest.jsonplus ->plugins 下边"share": {/*配置应用使用分享功能&#xff0c;参考http://ask.dcloud.net.cn/article/27*/"qq": {"appid": "",/*腾讯QQ开放平台申请应用的AppID值*/"description"…

Java 注解学习笔记

转自&#xff1a;http://wanqiufeng.blog.51cto.com/409430/458883 一、什么是java注解 注解&#xff0c;顾名思义&#xff0c;注解,就是对某一事物进行添加注释说明&#xff0c;会存放一些信息&#xff0c;这些信息可能对以后某个时段来说是很有用处的。 Java注解又叫java标注…

Prime Palindromes

博客园速度非常不稳定&#xff0c;可能要考虑换地方了。虽然我非常喜欢博客园的模板和气氛。 这个题早就知道是怎么做的了。先求出回文数在再判断是不是素数。关键是不知道区间&#xff0c;那就把所有的全部求出来。虽然可能会超时&#xff0c;但是如果使用点技巧的话还是没问题…

Opencv——DFT变换(实现两个Mat的卷积以及显示Mat的频域图像)

DFT原理&#xff1a;&#xff08;单变量离散傅里叶变换&#xff09; 数学基础&#xff1a; 任何一个函数都可以转换成无数个正弦和余弦函数的和的形式。 通常观察傅里叶变换后的频域函数可以获得两个重要的信息&#xff1a;幅频曲线和相频曲线。 在数字图像处理中的作用&#…

python方法items_Python字典items()方法与示例

python方法items字典items()方法 (Dictionary items() Method) items() method is used to get the all items as a view object, the view object represents the key-value pair of the dictionary. items()方法用于获取所有项目作为视图对象&#xff0c;该视图对象表示字典的…

基于(Python下的OpenCV)图像处理的喷墨墨滴形状规范检测

通过图像处理&#xff0c;分析数码印花的喷头所喷出来的墨滴形状&#xff0c;与标准墨滴形状对比分析&#xff0c;来判断墨水及其喷头设备的状态&#xff0c;由两部分构成 PS&#xff1a;获取墨滴形状照片和标准墨滴形状照片都是手绘的&#xff0c;将就的看吧&#xff0c;主要…

const_iterator,const 迭代器

const 迭代器:是迭代器产量&#xff0c;该迭代器的值不能被修改&#xff0c;且需要初始化&#xff0c;初始化之后不能指向其他元素。const_iterator:当我们对const_iterator类型解引用时&#xff0c;返回一个const值&#xff0c;所以只能读&#xff0c;不能写。它是一种迭代器…

临时禁止令:诺西购摩托罗拉面临流产窘境?

近日&#xff0c;美国伊利诺伊州北区法院就中国华为起诉摩托罗拉公司和诺西一案作出初步裁决&#xff0c;禁止摩托罗拉解决方案公司(Motorola Solutions)向诺西披露华为的机密资料。此判决一出&#xff0c;各方评论纷沓而来。笔者认为&#xff0c;从诺西12以美元并购摩托罗拉部…

mysql replace into 语法_mysql Replace into与Insert update

Replace intoreplace into 跟 insert 功能类似&#xff0c;不同点在于&#xff1a;replace into 首先尝试插入数据到表中&#xff0c;1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据&#xff0c;然后插入新的数据。2. 否则&#xff0c;直接插入新数…

微机原理——指令系统——传送类指令(MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF、POPF)

博主联系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里会有往届的smarters和电赛选手&#xff0c;群里也会不时分享一些有用的资料&#xff0c;有问题可以在群里多问问。 【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176 传送类指令1&…

lastindexof方法_Java Vector lastIndexOf()方法与示例

lastindexof方法向量类别的lastIndexOf()方法 (Vector Class lastIndexOf() method) Syntax: 句法&#xff1a; public int lastIndexOf (Object ob);public int lastIndexOf (Object ob, int indices);lastIndexOf() method is available in java.util package. lastIndexOf(…

李开复:微博的价值在哪里

导读&#xff1a;微博可以改变社会现象&#xff0c;可以传播信息&#xff0c;可以帮助你成长&#xff0c;可以发出你的声音。它让我们能够人人成为记者&#xff0c;让每一个转发的人都变成了一个编辑 很多人问微博是抢了谁的生意&#xff0c;开心网还是人人网&#xff1f;其实它…

mysql 任务计划 /etc/cron.d_Linux /etc/cron.d增加定时任务

一般情况下我们添加计划任务时&#xff0c;都是直接修改/etc/crontab。但是&#xff0c;不建议这样做&#xff0c;/etc/cron.d目录就是为了分项目设置计划任务而创建的。例如&#xff0c;增加一项定时的备份任务&#xff0c;我们可以这样处理&#xff1a;在/etc/cron.d目录下新…

19-Harris角点检测

角点检测顾名思义&#xff0c;就是对类似顶点的检测&#xff0c;与边缘有所区别 边缘可能在某一方向上变化不是特别明显&#xff0c;但角点在任何方向上变换都很明显 cv2.cornerHarris(img,blockSize,ksize,k) cv2.cornerHarris(gray,2,3,0.04) 参数一&#xff1a;img&#xff…

微机原理——指令系统——算数运算指令(ADD、ADC、SUB、SBB、INC、DEC、NEG、CMP、MUL、IMUL、DIV、IDIV、CBW、CWD、BCD调整)

博主联系方式&#xff1a; QQ:1540984562 QQ交流群&#xff1a;892023501 群里会有往届的smarters和电赛选手&#xff0c;群里也会不时分享一些有用的资料&#xff0c;有问题可以在群里多问问。 算数运算指令1、加减法指令ADD、ADC 、SUB 、SBB 和增量减量指令INC、DEC、NEGADD…

linux系统出现Too many open files 错误、linux too many open files

故障一、linux too many open files linux系统出现Too many open files 错误&#xff0c;这是因为文件描述符大小不够&#xff0c;或者有不正常的网络连接(Socket也是一种特殊的文件)、文件IO没有关闭并释放出文件描述符&#xff08;文件句柄&#xff0c;File Operator&#xf…