Opencv实战【1】人脸检测并对ROI区域进行部分处理(变身乔碧萝!!!)
步驟:
1、利用Opencv自帶的分類器檢測(cè)人臉
預(yù)備知識(shí):Haar特征分類器
Haar特征分類器就是一個(gè)XML文件,該文件中會(huì)描述人體各個(gè)部位的Haar特征值。包括人臉、眼睛、嘴唇等等。
Haar特征分類器存放地址:
(找自己的安裝目錄)
1、D:\opencv\opencv4.0\opencv4.0.0\sources\data\haarcascades
2、D:\opencv\opencv4.0\opencv4.0.0\build\etc\haarcascades
總覽一下:
detectMultiScale函數(shù)詳解
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() );函數(shù)介紹:
參數(shù)1:image–待檢測(cè)圖片,一般為灰度圖像加快檢測(cè)速度;
參數(shù)2:objects–被檢測(cè)物體的矩形框向量組;
參數(shù)3:scaleFactor–表示在前后兩次相繼的掃描中,搜索窗口的比例系數(shù)。默認(rèn)為1.1即每次搜索窗口依次擴(kuò)大10%;
參數(shù)4:minNeighbors–表示構(gòu)成檢測(cè)目標(biāo)的相鄰矩形的最小個(gè)數(shù)(默認(rèn)為3個(gè))。
如果組成檢測(cè)目標(biāo)的小矩形的個(gè)數(shù)和小于 min_neighbors - 1 都會(huì)被排除。
如果min_neighbors 為 0, 則函數(shù)不做任何操作就返回所有的被檢候選矩形框,
這種設(shè)定值一般用在用戶自定義對(duì)檢測(cè)結(jié)果的組合程序上;
參數(shù)5:flags–要么使用默認(rèn)值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果設(shè)置為
CV_HAAR_DO_CANNY_PRUNING,那么函數(shù)將會(huì)使用Canny邊緣檢測(cè)來排除邊緣過多或過少的區(qū)域,
因此這些區(qū)域通常不會(huì)是人臉?biāo)趨^(qū)域;
參數(shù)6、7:minSize和maxSize用來限制得到的目標(biāo)區(qū)域的范圍。
代碼實(shí)現(xiàn):
2、對(duì)人臉矩形框內(nèi)進(jìn)行一些處理(這里只對(duì)灰度圖進(jìn)行處理)
1、打馬賽克(這里我們使用均值濾波)
//打馬賽克函數(shù) void mosaic(Mat& srcImage, Mat& dstImage, int times) {blur(srcImage,dstImage, Size(times*2+1, times * 2 + 1)); }2、換成其他圖片(使用resize,根據(jù)人臉區(qū)域進(jìn)行大小改變)//變身喬碧蘿
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、視頻處理
(模板)
完整的代碼(視頻+貼圖):
#include <opencv2/opencv.hpp> #include <iostream> #include "windows.h" #include <stdio.h> #include "My_ImageProssing_base.h"using namespace cv; using namespace std;//訓(xùn)練文件路徑 string xmlPath = "D:\\opencv\\opencv4.0\\opencv4.0.0\\build\\etc\\haarcascades\\haarcascade_frontalface_alt2.xml"; //打馬賽克函數(shù) 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)) //加載訓(xùn)練文件 {cout << "不能加載指定的xml文件" << endl;return -1;}//調(diào)用攝像頭VideoCapture capture(0); //類似于 int a=1;//VideoCapture capture("D:\\opencv_picture_test\\videos\\臉.avi"); //類似于 int a=1;while (1){Mat img;capture >> img; //讀取當(dāng)前幀//imshow("原視頻", img); //顯示當(dāng)前幀cvtColor(img,img, COLOR_BGR2GRAY); //轉(zhuǎn)化為灰度圖Mat dstImage = img.clone();//【2】檢測(cè)人臉,將信息存儲(chǔ)到矩形類faces中vector<Rect> faces;detector.detectMultiScale(img, faces, 1.1, 3, 0);//分類器對(duì)象調(diào)用//【3】修改區(qū)域信息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++) //行循環(huán){for (int i = 0;i < cols;i++) //列循環(huán){//-------【開始處理每個(gè)像素】---------------ROI.at<uchar>(j, i) = img.at<uchar>(j + start_y, i + start_x);//-------【處理結(jié)束】---------------}}//馬賽克化//mosaic(ROI,dstROI,10);//貼圖paste(img2,dstROI);//去雀斑(磨皮)//clearFreckle(ROI, dstROI, 10);for (int j = 0;j < rows;j++) //行循環(huán){for (int i = 0;i < cols;i++) //列循環(huán){//-------【開始處理每個(gè)像素】---------------dstImage.at<uchar>(j + start_y, i + start_x) = dstROI.at<uchar>(j, i);//-------【處理結(jié)束】---------------}}}imshow("處理后的視頻", dstImage); //顯示當(dāng)前幀if(waitKey(10) >=0 ) break; //延時(shí)10ms}return 0; }效果展示
1、馬賽克效果
2、磨皮效果(臉蛋更加白凈!!!)
3、變身喬碧蘿
視頻放不上來,就放gif動(dòng)態(tài)圖了。
參考鏈接
haarcascade_eye.xml、eye_tree_eyeglasses.xml、haarcascade_lefteye_2splits.xml區(qū)別使用
OpenCV人臉識(shí)別–detectMultiScale函數(shù)
總結(jié)
以上是生活随笔為你收集整理的Opencv实战【1】人脸检测并对ROI区域进行部分处理(变身乔碧萝!!!)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 颐和园需要坐船游览吗
- 下一篇: Opencv——DFT变换(实现两个Ma