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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

visual studo 2022中使用Opencv人脸检测

發布時間:2023/12/20 pytorch 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 visual studo 2022中使用Opencv人脸检测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1.關于.xml文件位置,Opencv下載和導入Visual studio 2022
    • 2.一張圖片的測試
    • 3.實時檢測
    • 4.視頻實時檢測
    • 5.HAAR與LBP檢測人眼(模版匹配)

1.關于.xml文件位置,Opencv下載和導入Visual studio 2022

https://blog.csdn.net/Keep_Trying_Go/article/details/124902276

關于.xml位置

關于使用python中的opencv實現人臉識別:
https://mydreamambitious.blog.csdn.net/article/details/124851743


2.一張圖片的測試

這里根據自己的需要加載相應的.xml文件

#include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; //haarcascade_frontalcatface.xml //.xml文件的位置 String filename = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\CascadeClassifer\\haarcascade_frontalface_alt.xml"; //圖片的位置 String facefile = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\images\\face1.jpg"; CascadeClassifier face_classifiler;int main() { //加載人臉識別.xml文件if (!face_classifiler.load(filename)) {printf("The CascadeClassifier load fail!");return 0;}Mat img = imread(facefile);if (img.empty()) {printf("The picture read fail!");return 0;}Mat gray;cvtColor(img, gray, COLOR_BGR2GRAY); //equalizeHist直方圖均衡化,,用于提高圖像的質量equalizeHist(gray, gray);vector<Rect>faces;//輸入圖像 vector<Rect>& objects 縮放比例 檢測次數 檢測方法 圖像大小face_classifiler.detectMultiScale(gray, faces, 1.2, 3, 0, Size(24, 24));for (size_t t = 0; t < faces.size(); t++) {rectangle(img, faces[static_cast<int>(t)], Scalar(255, 255, 0), 2, 8, 0);cv::Point locate;locate.x = (float)(faces[static_cast<int>(t)].x + faces[static_cast<int>(t)].width / 4);locate.y = (float)(faces[static_cast<int>(t)].y - 10);putText(img, "Person", locate, FONT_HERSHEY_SIMPLEX,1.2, (0, 255, 0), 2, 8);}imshow("face", img);waitKey(0);return 0; }


這個地方的坐標表示方式要注意。

上面相關函數的解釋:

detectMultiScale(InputArray image,CV_OUT std::vector<Rect>& objects,double scaleFactor = 1.1,int minNeighbors = 3, int flags = 0,Size minSize = Size(),Size maxSize = Size() ); 參數說明:參數1:image–待檢測圖片,一般為灰度圖像加快檢測速度;參數2:objects–被檢測物體的矩形框向量組;為輸出量,如人臉檢測矩陣Mat參數3:scaleFactor–表示在前后兩次相繼的掃描中,搜索窗口的比例系數。默認為1.1即每次搜索窗口依次擴大10%;一般設置為1.1參數4:minNeighbors–表示構成檢測目標的相鄰矩形的最小個數(默認為3)。如果組成檢測目標的小矩形的個數和小于 min_neighbors - 1 都會被排除。如果min_neighbors 為 0, 則函數不做任何操作就返回所有的被檢候選矩形框,這種設定值一般用在用戶自定義對檢測結果的組合程序上;參數5:flags–要么使用默認值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果設置為CV_HAAR_DO_CANNY_PRUNING,那么函數將會使用Canny邊緣檢測來排除邊緣過多或過少的區域,因此這些區域通常不會是人臉所在區域;參數67:minSize和maxSize用來限制得到的目標區域的范圍。也就是我本次訓練得到實際項目尺寸大小 rectangle(InputOutputArray img, Rect rec,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0)參數說明: img 圖像pt1 矩形的一個頂點pt2 矩形對角線上的另一個頂點color 線條顏色 (RGB) 或亮度(灰度圖像 )(grayscale image)。thickness 組成矩形的線條的粗細程度。取負值時(如 CV_FILLED)函數繪制填充了色彩的矩形。line_type 線條的類型。見cvLine的描述shift 坐標點的小數點位數。 putText( InputOutputArray img, const String& text, Point org,int fontFace, double fontScale, Scalar color,int thickness = 1, int lineType = LINE_8,bool bottomLeftOrigin = false );參數說明:img:寫文本的圖像text:要繪制的文本字符串org:文本位置fontFace:字體類型fontScalar:字體大小color:文本顏色thickness:繪制文本線條的厚度lineType:線類型bottomLeftOrigin :當為true時,圖像數據源位于左下角,為false時位于右上角

3.實時檢測

這里根據自己的需要加載相應的.xml文件

#include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; //haarcascade_frontalcatface.xml //opencv_world455d.lib //E:\Visual studio 2019\Opencv\opencv\build\include //E:\Visual studio 2019\Opencv\opencv\build\x64\vc15\lib String filename = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\CascadeClassifer\\haarcascade_frontalface_alt.xml"; CascadeClassifier face_classifiler;int main() {if (!face_classifiler.load(filename)) {printf("The CascadeClassifier load fail!");return 0;} //打開攝像頭實時檢測namedWindow("face",WINDOW_AUTOSIZE);VideoCapture capture(0);Mat frame;Mat gray;while (capture.read(frame)) {cvtColor(frame, gray, COLOR_BGR2GRAY);//equalizeHist直方圖均衡化,,用于提高圖像的質量equalizeHist(gray, gray);vector<Rect>faces;//輸入圖像 vector<Rect>& objects 縮放比例 檢測次數 檢測方法 圖像大小face_classifiler.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30,30));for (size_t t = 0; t < faces.size(); t++) {rectangle(frame, faces[static_cast<int>(t)], Scalar(255, 255, 0), 2, 8, 0);cv::Point locate;locate.x = (float)(faces[static_cast<int>(t)].x + faces[static_cast<int>(t)].width / 4);locate.y = (float)(faces[static_cast<int>(t)].y - 10);putText(frame, "Person", locate, FONT_HERSHEY_SIMPLEX,1.2, (0, 0, 255), 2, 8);}imshow("face", frame);if (waitKey(10) == 27) {break;}}capture.release();destroyAllWindows();return 0; }

4.實時人眼檢測

#include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; //haarcascade_frontalcatface.xml //opencv_world455d.lib //E:\Visual studio 2019\Opencv\opencv\build\include //E:\Visual studio 2019\Opencv\opencv\build\x64\vc15\lib String filename = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\CascadeClassifer\\haarcascade_frontalface_alt.xml"; String filename_eye = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\CascadeClassifer\\haarcascade_eye.xml"; CascadeClassifier face_classifiler; CascadeClassifier eye_detect;int main() {if (!face_classifiler.load(filename)) {printf("The CascadeClassifier load fail!");return 0;}if (!eye_detect.load(filename_eye)) {printf("The CascadeClassifier load fail!");return 0;}//打開攝像頭實時檢測namedWindow("face", WINDOW_AUTOSIZE);VideoCapture capture(0);Mat frame;Mat gray;while (capture.read(frame)) {cvtColor(frame, gray, COLOR_BGR2GRAY);//equalizeHist直方圖均衡化,,用于提高圖像的質量equalizeHist(gray, gray);vector<Rect>faces;vector<Rect>eyes;//輸入圖像 vector<Rect>& objects 縮放比例 檢測次數 檢測方法 圖像大小face_classifiler.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30));for (size_t t = 0; t < faces.size(); t++) {rectangle(frame, faces[static_cast<int>(t)], Scalar(255, 255, 0), 2, 8, 0);cv::Point locate;locate.x = (float)(faces[static_cast<int>(t)].x + faces[static_cast<int>(t)].width / 4);locate.y = (float)(faces[static_cast<int>(t)].y - 10);putText(frame, "Person", locate, FONT_HERSHEY_SIMPLEX,1.2, (0, 0, 255), 2, 8);//首先在找到人臉的基礎上進行人眼檢測Mat eyeLocate = frame(faces[static_cast<int>(t)]);eye_detect.detectMultiScale(eyeLocate, eyes, 1.2, 10, 0, Size(20, 20));for (size_t s = 0; s < eyes.size(); s++) {Rect rect;rect.x = faces[static_cast<int>(t)].x + eyes[s].x;rect.y = faces[static_cast<int>(t)].y + eyes[s].y;rect.width = eyes[s].width;rect.height = eyes[s].height;rectangle(frame, rect, Scalar(255, 255, 0), 2, 8, 0);}}imshow("face", frame);if (waitKey(10) == 27) {break;}}capture.release();destroyAllWindows();return 0; }

4.視頻實時檢測

#include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; //haarcascade_frontalcatface.xml //opencv_world455d.lib //E:\Visual studio 2019\Opencv\opencv\build\include //E:\Visual studio 2019\Opencv\opencv\build\x64\vc15\lib String filename = "E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\CascadeClassifer\\haarcascade_frontalface_alt.xml"; CascadeClassifier face_classifiler;int main() {if (!face_classifiler.load(filename)) {printf("The CascadeClassifier load fail!");return 0;}//打開攝像頭實時檢測namedWindow("face", WINDOW_AUTOSIZE);VideoCapture capture;Mat frame;Mat gray;//打開視頻文件capture.open("E:\\conda_3\\PyCharm\\OpenCV\\FaceDetect\\Video\\video.mp4");while (capture.read(frame)) {cvtColor(frame, gray, COLOR_BGR2GRAY);//equalizeHist直方圖均衡化,,用于提高圖像的質量equalizeHist(gray, gray);vector<Rect>faces;//輸入圖像 vector<Rect>& objects 縮放比例 檢測次數 檢測方法 圖像大小face_classifiler.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30));for (size_t t = 0; t < faces.size(); t++) {rectangle(frame, faces[static_cast<int>(t)], Scalar(255, 255, 0), 2, 8, 0);cv::Point locate;locate.x = (float)(faces[static_cast<int>(t)].x + faces[static_cast<int>(t)].width / 4);locate.y = (float)(faces[static_cast<int>(t)].y - 10);putText(frame, "Person", locate, FONT_HERSHEY_SIMPLEX,1.2, (0, 0, 255), 2, 8);}imshow("face", frame);if (waitKey(10) == 27) {break;}}capture.release();destroyAllWindows();return 0; }

5.HAAR與LBP檢測人眼(模版匹配)

#include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace std;String facefile = "E:\\Visual studio 2019\\Opencv\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt.xml"; String lefteyefile = "E:\\Visual studio 2019\\Opencv\\opencv\\build\\etc\\haarcascades\\haarcascade_eye.xml"; String righteyefile = "E:\\Visual studio 2019\\Opencv\\opencv\\build\\etc\\haarcascades\\haarcascade_eye.xml"; CascadeClassifier face_detector; CascadeClassifier leftyeye_detector; CascadeClassifier righteye_detector;Rect leftEye, rightEye; //人眼區域 人眼的具體區域 人眼的具體坐標 void trackEye(Mat& im, Mat& tpl, Rect& rect) {Mat result;//圖像寬度int result_cols = im.cols - tpl.cols + 1;//圖像高度int result_rows = im.rows - tpl.rows + 1;// 模板匹配 create(int rows, int cols, int type)創建多維數組//U——usigned char(無符號字符型,不是無符號整型)C——通道數 S——signed int(有符號整型);//其中前兩個參數分別表示行(row)跟列(column)、第三個CV_8UC3中的8表示每個通道占8位、U表示無符號、 // C表示Char類型、3表示通道數目是3,第四個參數是向量表示初始化每個像素值是多少,向量長度對應通道數目一致//https://blog.csdn.net/FightingCSH/article/details/124195152//而我們這里人眼區域圖是gray,所以最后的通道數為1result.create(result_rows, result_cols, CV_32FC1);//matchTemplate( InputArray image, InputArray templ,OutputArray result, int method, InputArray mask = noArray() );//基本思想是將模板圖像在目標圖像上滑動逐一對比,通過統計的基本方法進行匹配,比如方差檢驗,相關性檢驗等方法來尋找最佳匹配;//輸入圖像 匹配圖像 輸出結果(函數返回值) 比較的方法 matchTemplate(im, tpl, result, TM_CCORR_NORMED);// 尋找位置double minval, maxval;Point minloc, maxloc;//功能:從一個矩陣中找出全局的最大值和最小值。//輸入單通道矩陣 最小值指針 最大值指針 最小值位置指針 最大值位置指針//https://blog.csdn.net/jndingxin/article/details/108447110minMaxLoc(result, &minval, &maxval, &minloc, &maxloc);if (maxval > 0.75) {rect.x = rect.x + maxloc.x;rect.y = rect.y + maxloc.y;}else {rect.x = rect.y = rect.width = rect.height = 0;} }int main(int argc, char** argv) {if (!face_detector.load(facefile)) {printf("could not load data file...\n");return -1;}if (!leftyeye_detector.load(lefteyefile)) {printf("could not load data file...\n");return -1;}if (!righteye_detector.load(righteyefile)) {printf("could not load data file...\n");return -1;}Mat frame;VideoCapture capture(0);namedWindow("demo-win", WINDOW_AUTOSIZE);Mat gray;vector<Rect> faces;vector<Rect> eyes;Mat lefttpl, righttpl; // 模板while (capture.read(frame)) {//對圖像進行翻轉flip(frame, frame, 1);cvtColor(frame, gray, COLOR_BGR2GRAY);//提高圖片的質量equalizeHist(gray, gray);//人臉檢測face_detector.detectMultiScale(gray, faces, 1.1, 3, 0, Size(30, 30));for (size_t t = 0; t < faces.size(); t++) {rectangle(frame, faces[t], Scalar(255, 0, 0), 2, 8, 0);// 計算 人眼的offset ROIint offsety = faces[t].height / 4;int offsetx = faces[t].width / 8;int eyeheight = faces[t].height / 2 - offsety;int eyewidth = faces[t].width / 2 - offsetx;// 截取左眼區域Rect leftRect;leftRect.x = faces[t].x + offsetx;leftRect.y = faces[t].y + offsety;leftRect.width = eyewidth;leftRect.height = eyeheight;//得到人眼的圖片區域(不是左眼的具體位置)Mat leftRoi = gray(leftRect);// 檢測左眼leftyeye_detector.detectMultiScale(leftRoi, eyes, 1.1, 1, 0, Size(20, 20));if (lefttpl.empty()) {if (eyes.size()) {//獲取左眼的準確坐標leftRect = eyes[0] + Point(leftRect.x, leftRect.y);lefttpl = gray(leftRect);rectangle(frame, leftRect, Scalar(0, 0, 255), 2, 8, 0);}}else {// 跟蹤, 基于模板匹配leftEye.x = leftRect.x;leftEye.y = leftRect.y;trackEye(leftRoi, lefttpl, leftEye);if (leftEye.x > 0 && leftEye.y > 0) {leftEye.width = lefttpl.cols;leftEye.height = lefttpl.rows;rectangle(frame, leftEye, Scalar(0, 0, 255), 2, 8, 0);}}// 截取右眼區域(注意這里的攝像頭截取的圖片人眼和我們本身人眼是相反的)Rect rightRect;rightRect.x = faces[t].x + faces[t].width / 2;rightRect.y = faces[t].y + offsety;rightRect.width = eyewidth;rightRect.height = eyeheight;//獲取右眼的區域(不是右眼的具體位置)Mat rightRoi = gray(rightRect);// 檢測右眼righteye_detector.detectMultiScale(rightRoi, eyes, 1.1, 1, 0, Size(20, 20));if (righttpl.empty()) {if (eyes.size()) {//獲取右眼的準確坐標rightRect = eyes[0] + Point(rightRect.x, rightRect.y);righttpl = gray(rightRect);rectangle(frame, rightRect, Scalar(0, 255, 255), 2, 8, 0);}}else {// 跟蹤, 基于模板匹配rightEye.x = rightRect.x;rightEye.y = rightRect.y;trackEye(rightRoi, righttpl, rightEye);if (rightEye.x > 0 && rightEye.y > 0) {//righttpl.cols表示圖片匹配之后的寬度 righttpl.rows表示圖片匹配之后的高度rightEye.width = righttpl.cols;rightEye.height = righttpl.rows;rectangle(frame, rightEye, Scalar(0, 255, 255), 2, 8, 0);}}}imshow("demo-win", frame);char c = waitKey(100);if (c == 27) { // ESCbreak;}}// release resourcecapture.release();waitKey(0);return 0; }

參考視頻教程:
https://b23.tv/LnlcNDh

總結

以上是生活随笔為你收集整理的visual studo 2022中使用Opencv人脸检测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。