资源简介
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
- 上一篇:遗传算法解决TSP问题C++版
- 下一篇:基于科大讯飞SDK的语音合成源码
相关资源
- 人工智能经典作业,野人与传教士过
- wumpus世界(MFC编写)
- OPENCV人脸检测加角点检测并输出坐标
- 深度学习之卷积神经网络CNN用于人脸
- 四子棋智能下棋C语言实现
- 基于VC++实现的人脸检测
- LeNet-5神经网络——C源代码
- Python基础教程第3版) 高清PDF
- 人脸跟踪基于opencv
- 基于人工智能的五子棋人机对弈
- 推箱子人工智能算法
- 疲劳检测程序源码
- 人工智能小游戏-基于alpha-beta剪枝算法
- opencv结合MFC进行人脸检测
- 动物识别系统MFC)
- 九宫格程序c++人工智能
- K210使用情况指南以及测试情况
- 基于opencv中AdaBoost的人脸检测
- 人工智能归结反演c++代码
- 人工智能 A算法 九宫格 启发式搜索
- 用C语言实现的基于adaboost算法的人脸
- VS2012 + Opencv2.4.9实现单张人脸检测及人
- C++实现的人脸识别系统
- 11_人脸检测与识别系统.zip
- Othello黑白棋游戏与AI
- C++下使用OpenCV实现人脸检测
- 人工智能的贪食蛇
- OpenCV人脸识别实例源码142702
- Alpha-Beta剪枝算法一字棋源码及实验报
- opencv人脸检测与跟踪
评论
共有 条评论