資源簡介
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? {
//?檢測到人臉中心
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的語音合成源碼
評論
共有 條評論