日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

Opencv实战【1】人脸检测并对ROI区域进行部分处理(变身乔碧萝!!!)

發(fā)布時(shí)間:2023/12/1 pytorch 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Opencv实战【1】人脸检测并对ROI区域进行部分处理(变身乔碧萝!!!) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

步驟:

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
總覽一下:

haarcascade_eye.xml ;僅可以檢測(cè)睜開的眼睛 haarcascade_eye_tree_eyeglasses.xml;僅在帶被檢測(cè)者戴眼鏡時(shí)方可檢測(cè) haarcascade_frontalcatface.xml haarcascade_frontalcatface_extended.xml haarcascade_frontalface_alt.xml haarcascade_frontalface_alt_tree.xml haarcascade_frontalface_alt2.xml;個(gè)人感覺這個(gè)好用點(diǎn) 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函數(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):

#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";int main(int argc, char** atgv) {Mat img = imread("D:\\opencv_picture_test\\beauty\\裴佳欣.png",0);//Mat img = imread("D:\\opencv_picture_test\\新垣結(jié)衣\\test2.jpg");imshow("input image", img);//【1】加載分類器CascadeClassifier detector;detector.load(xmlPath);if (!detector.load(xmlPath)) //加載訓(xùn)練文件 {cout << "不能加載指定的xml文件" << endl;return -1;}//【2】檢測(cè)人臉,將信息存儲(chǔ)到矩形類faces中vector<Rect> faces;//OpenCV的Rect矩形類用法//如果創(chuàng)建一個(gè)Rect對(duì)象rect那么rect會(huì)有以下幾個(gè)功能://rect.area(); //返回rect的面積 //rect.size(); //返回rect的尺寸//rect.tl(); //返回rect的左上頂點(diǎn)的坐標(biāo) //rect.br(); //返回rect的右下頂點(diǎn)的坐標(biāo)//rect.width(); //返回rect的寬度 //rect.height(); //返回rect的高度 //rect.contains(Point(x, y)); //返回布爾變量,判斷rect是否包含Point(x, y)點(diǎn)detector.detectMultiScale(img,faces, 1.1, 3, 0);//分類器對(duì)象調(diào)用//【3】框出人臉for (size_t t = 0; t < faces.size(); t++) {rectangle(img, faces[t], Scalar(0, 0, 255), 2, 8);//faces[t]表示第t個(gè)的face的矩形類//2代表線條寬度8是線型,默認(rèn)取8}namedWindow("Result", WINDOW_NORMAL); //定義窗口顯示屬性imshow("Result", img);waitKey(0);return 0; }

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、視頻處理
(模板)

VideoCapture capture(0); //VideoCapture capture("D:\\opencv_picture_test\\videos\\臉.avi"); 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ū)域信息.......//修改完畢imshow("處理后的視頻", dstImage); //顯示當(dāng)前幀if(waitKey(10) >=0 ) break; //延時(shí)10ms}

完整的代碼(視頻+貼圖):

#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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。