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;任何一个周期函数都可以用正弦函数堆叠起来形成。强吧&#…

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

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

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

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

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…

20-SIFT算法

import cv2 import numpy as np from matplotlib import pyplot as pltdef show_photo(name,picture):#图像显示函数cv2.imshow(name,picture)cv2.waitKey(0)cv2.destroyAllWindows()img cv2.imread(E:\Jupyter_workspace\study\data/cfx.png) gray cv2.cvtColor(img,cv2.COL…

mysql 迁移 nosql_从关系型Mysql到Nosql HBase的迁移实践

2013年11月22-23日&#xff0c;作为国内唯一专注于hadoop技术与应用分享的大规模行业盛会&#xff0c;2013 Hadoop中国技术峰会(China Hadoop Summit 2013)于北京福朋喜来登集团酒店隆重举行。来自国内外各行业领域的近千名CIO、CTO、架构师、IT经理、咨询顾问、工程师、Hadoop…

21-特征匹配方法(Brute-Force蛮力匹配)

Brute-Force蛮力匹配 cv2.BFMatcher(crossCheck True) crossCheck表示两个特征点相互匹配 例如A中的第i个特征点与B中的第j个特征点最近&#xff0c;并且B中的第j个特征点到A中的第i个特征点也是 NORM_L2&#xff1a;归一化数组的(欧几里得距离)&#xff0c;如果其他特征计算…

Opencv——几何空间变换(仿射变换和投影变换)

几何空间变换【1】几何变换&#xff08;空间变换&#xff09;简述【2】变换矩阵知识简述齐次坐标的概念几何运算矩阵【3】图像的仿射变换1、平移变换2、比例缩放3、旋转4、对称变换&#xff08;不做展示&#xff09;1、关于X轴变换2、关于Y轴变换3、关于直线YX变换4、关于直线Y…

probuffer java_Protocol Buffer的使用

Probotbuf简介在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML&#xff0c;这两种技术常被用于数据的结构化呈现和序列化。我们可以从两个方面来看JSON 和 XML与protobuf的异同&#xff1a;一个是数据结构化&#xff0c;一个是数据序列化。这里的数据结构化…

22-随机抽样一致算法RANSAC

随机抽样一致算法(Random sample consensus&#xff0c;RANSAC) 看似复杂&#xff0c;其基本思想就是&#xff1a;随机选取俩点&#xff0c;然后连接&#xff0c;给定一个容忍范围&#xff0c;在这个范围内的点越多越好&#xff0c;然后不断的迭代进行找两点之间容忍范围内点最…

23-背景建模

帧差法 由于场景中的目标在运动&#xff0c;目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算&#xff0c;不同帧对应的像素点相减&#xff0c;判断灰度差的绝对值&#xff0c;当绝对值超过一定阈值时&#xff0c;即可判断为运动目标&#xf…

DB2 9 运用开辟(733 考试)认证指南,第 3 部门: XML 数据独霸(4)

议决运用顺序存储和检索 XMLXML 编码字符编码在汗青上&#xff0c;术语 字符集、字符编码 和 码页 都有雷同的意义&#xff1a;一个字符集和一个二进制码集&#xff0c;其中每个码示意一个字符。&#xff08;码页是来自 IBM 的一个术语&#xff0c;示意一个大型主机或 IBM PC 上…

Opencv——霍夫变换以及遇到的一些问题

目录问题1 &#xff1a;颜色空间转换函数参数问题&#xff1a;CV_BGR2GRAY vs CV_GRAY2BGR问题2&#xff1a;cvRound()、cvFloor()、cvCeil()函数用法霍夫变换的含义标准霍夫直线变换霍夫线变换函数参数讲解累计概率霍夫变换霍夫变换圆变换原理和算法步骤&#xff1a;霍夫圆变换…

java ssm如何上传图片_ssm整合-图片上传功能(转)

本文介绍 ssm (SpringSpringMVCMybatis)实现上传功能。以一个添加用户的案例介绍(主要是将上传文件)。一、需求介绍我们要实现添加用户的时候上传图片(其实任何文件都可以)。文件名&#xff1a;以 博客名日期的年月日时分秒毫秒形式命名如 言曌博客2017082516403213.png路径&am…

24-光流估计

光流是空间运动物体在观测成像平面上的像素运动的“瞬间速度”&#xff0c;根据各个像素点的速度矢量特征&#xff0c;可以对图像进行动态分析&#xff0c;例如目标跟踪 亮度恒定&#xff1a;同一点随着时间的变化&#xff0c;其亮度不会发生改变 小运动&#xff1a;随着时间的…