资源简介

C++编写的一个人脸部分美颜算法,人脸检测采用级联分类器,使用导向滤波美化,最后用泊松融合消除边缘融合问题

资源截图

代码片段和文件信息


#include    
#include 
#include  
#include “opencv2/core/core.hpp“    
#include “opencv2/highgui/highgui.hpp“    
#include “opencv2/imgproc/imgproc.hpp“
#include“opencv/cv.hpp“

using namespace std;
using namespace cv;
int width height centerx centery;
CascadeClassifier face_cascade eyes_cascade;
//导向滤波器
cv::Mat guidedfilter(Mat &srcImage Mat &srcClone int r double eps)
{
// 转换源图像信息
srcImage.convertTo(srcImage CV_64FC1);
srcClone.convertTo(srcClone CV_64FC1);
int nRows = srcImage.rows;
int nCols = srcImage.cols;
cv::Mat boxResult;
// 步骤一: 计算均值
cv::boxFilter(cv::Mat::ones(nRows nCols srcImage.type())
boxResult CV_64FC1 cv::Size(r r));
// 生成导向均值mean_I    
cv::Mat mean_I;
cv::boxFilter(srcImage mean_I CV_64FC1 cv::Size(r r));
// 生成原始均值mean_p   
cv::Mat mean_p;
cv::boxFilter(srcClone mean_p CV_64FC1 cv::Size(r r));
// 生成互相关均值mean_Ip 
cv::Mat mean_Ip;
cv::boxFilter(srcImage.mul(srcClone) mean_Ip
CV_64FC1 cv::Size(r r));
cv::Mat cov_Ip = mean_Ip - mean_I.mul(mean_p);
// 生成自相关均值mean_II 
cv::Mat mean_II;
cv::boxFilter(srcImage.mul(srcImage) mean_II CV_64FC1 cv::Size(r r));
// 步骤二:计算相关系数   
cv::Mat var_I = mean_II - mean_I.mul(mean_I);
cv::Mat var_Ip = mean_Ip - mean_I.mul(mean_p);
// 步骤三:计算参数系数a,b 
cv::Mat a = cov_Ip / (var_I + eps);
cv::Mat b = mean_p - a.mul(mean_I);
// 步骤四:计算系数a,b均值    
cv::Mat mean_a;
cv::boxFilter(a mean_a CV_64FC1 cv::Size(r r));
mean_a = mean_a / boxResult;
cv::Mat mean_b;
cv::boxFilter(b mean_b CV_64FC1 cv::Size(r r));
mean_b = mean_b / boxResult;
//步骤五:生成输出矩阵 
cv::Mat resultMat = mean_a.mul(srcImage) + mean_b;
return resultMat;
}
//人脸检测
void detectFaces(Mat frame) {
std::vector faces;
Mat frame_gray;
// 灰度变换
cvtColor(frame frame_gray COLOR_BGR2GRAY);
// 直方图均衡
equalizeHist(frame_gray frame_gray);
// 多尺度人脸检测
face_cascade.detectMultiScale(frame_gray faces
1.1 3 0 | CASCADE_SCALE_IMAGE Size(30 30));
// 人脸检测结果判定
for (size_t i = 0; i < faces.size(); i++)
{
// 检测到人脸中心
Point center(faces[i].x + faces[i].width / 2
faces[i].y + faces[i].height / 2);
Mat face = frame_gray(faces[i]);
std::vector eyes;
// 在人脸区域检测人眼
eyes_cascade.detectMultiScale(face eyes 1.1 2
0 | CASCADE_SCALE_IMAGE Size(30 30));
if (e

评论

共有 条评论