当前位置:   article > 正文

c++使用opencv完成人脸检测_opencv实现人脸识别 c++

opencv实现人脸识别 c++

opencv是开源的计算机视觉库,实现人脸检测我们使用的是opencv库中帮我们训练好的检测器,一般在D:\opencv\sources\data\haarcascades目录下有各种检测器。


可以根据各种要求选择不同的训练器,我是结合了官网中的demo检测了人脸和人眼。代码有详细的注释,当然我还添加了一部分对图像的处理函数,有兴趣的可以了解一下。

各种函数参数都可以取opencv官网查看。

我使用的是opencv4.11和vs2017.

 

  1. #include<opencv2/opencv.hpp>
  2. #include<iostream>
  3. using namespace cv;
  4. using namespace std;
  5. //识别人眼
  6. void eyeDetect(Mat& image,Mat& Frame,vector<Rect> Eyes,CascadeClassifier& EyeDetector,double s)
  7. {
  8.     EyeDetector.detectMultiScale(image, Eyes, 1.1, 3, 0, Size(0, 0));
  9.     
  10.     for (int i = 0; i < Eyes.size(); i++)
  11.     {
  12.         
  13.         Mat roi = Frame(Rect(Eyes[i].x*s,Eyes[i].y*s,Eyes[i].width*s,Eyes[i].height*s));
  14.         resize(roi, roi, Size(Eyes[i].width*s * 1.2, Eyes[i].height *s* 1.2));
  15.         //Mat ROI = Frame(Rect((Eyes[i].x*s - (roi.cols-Eyes[i].width*s)/2), (Eyes[i].y*s - (roi.rows - Eyes[i].height*s) / 2),roi.cols,roi.rows));
  16.         //Mat p = imread("2.jpg",0);
  17.         //roi.copyTo(ROI);
  18.         //生成矩形框,颜色为绿色
  19.         rectangle(Frame, Point(Eyes[i].x, Eyes[i].y)*s, Point(Eyes[i].x + Eyes[i].width, Eyes[i].y + Eyes[i].height)*s, Scalar(0, 255, 0), 1, 8);
  20.     
  21.     }
  22.     
  23. }
  24. //对暂时保存的图像进行亮度的调节
  25. void beautifyFace(Mat& matSelfPhoto, float alpha, float beta)
  26. {
  27.     for (int y = 0; y < matSelfPhoto.rows; y++)
  28.     {
  29.         for (int x = 0; x < matSelfPhoto.cols; x++)
  30.         {
  31.             for (int c = 0; c < 3; c++)
  32.             {
  33.                 matSelfPhoto.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(alpha*(matSelfPhoto.at<Vec3b>(y, x)[c]) + beta);
  34.             }
  35.         }
  36.     }
  37. }
  38. //人脸识别函数
  39. void facedetected(Mat & IMG, Mat& Frame,vector<Rect>& faces1, CascadeClassifier& facedetect, double &Scale) {
  40.     
  41.     //人脸检测
  42.     facedetect.detectMultiScale(IMG, faces1, 1.1, 3, 0, Size(0, 0));
  43.     for (int i = 0; i < faces1.size(); i++)
  44.     {
  45.         Rect rect = faces1[i];
  46.         //生成矩形框,颜色为绿色
  47.         rectangle(Frame, Point(faces1[i].x, faces1[i].y)*Scale, Point(faces1[i].x + faces1[i].width, faces1[i].y + faces1[i].height)*Scale, Scalar(0, 255, 0), 1, 8);
  48.         //设置矩形区域并将人脸设立成为感兴趣区域,并传入函数对所选取区域进行美颜
  49.         Mat imageROI = Frame(Rect(faces1[i].x*Scale, faces1[i].y*Scale, faces1[i].width*Scale, faces1[i].height*Scale));
  50.         //磨皮处理
  51.         //bilateralFilter(imageROI, a, 30, 30 * 2, 30 / 2);
  52.     }
  53. }
  54.     
  55.     int main(int argc, const char** argv) {
  56.         CascadeClassifier faceDector,eyesDector;
  57.         eyesDector.load("D:/opencv/sources/data/haarcascades/haarcascade_eye.xml");
  58.         faceDector.load("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml");
  59.         double scale = 4;
  60.         //打开摄像头
  61.         /*VideoCapture capture(0);
  62.         //cout << capture.get(CAP_PROP_FPS) << endl;
  63.         if (!capture.isOpened()) {
  64.             cout << "摄像头打开失败" << endl;
  65.             return -1;
  66.         }*/
  67.         Mat  img, a;
  68.         vector<Rect> faces;
  69.         vector<Rect> eyes;
  70.         Mat frame0 = imread("1.jpg");
  71.         imshow("1", frame0);
  72.         Mat frame = frame0;
  73.         if (frame.empty()) {
  74.             cout << "打开失败";
  75.             return -1;
  76.         }
  77.         
  78.             //转成灰度图
  79.             cvtColor(frame, img, COLOR_RGB2GRAY);
  80.             //imshow("22222", img);
  81.             //缩放图像提高效率         
  82.             resize(img, img, Size(), 1 / scale, 1 / scale, INTER_LINEAR_EXACT);
  83.             //直方图均衡化
  84.             equalizeHist(img, img);
  85.             
  86.             eyeDetect(img, frame, eyes, eyesDector, scale);
  87.             facedetected(img,frame, faces, faceDector, scale);
  88.             //调用亮度调节函数
  89.             //beautifyFace(frame, 1.1, 68);
  90.             //高斯模糊
  91.             //GaussianBlur(frame, frame, Size(9, 9), 0, 0);
  92.             cv::imshow("2", frame);
  93.             waitKey(0);
  94.             return 0;
  95. }

代码效果:


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/324843
推荐阅读
相关标签
  

闽ICP备14008679号