利用opencv的detector检测并保存截取的人脸图像

通常在进行人脸提特征之前,会先检测ROI区域,利用opencv的cascade类可以检测人脸,并截取保存为制定路径和文件名(listNew),要保持原文件名,需更改路径,如下:

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>
#include <stdio.h>
#include<direct.h>
#include<sstream>
#include<string>
#include<fstream>
using namespace std;
using namespace cv;

String face_cascade_name = "haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
String lefteye_cascade_name = "haarcascade_mcs_lefteye.xml";
String righteye_cascade_name = "haarcascade_mcs_righteye.xml";
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
CascadeClassifier lefteye_cascade;
CascadeClassifier righteye_cascade;

void detectAndDisplay(Mat frame, int &num,string szNewPath);
int main(void)
{
    if (!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); return -1; };
    if (!eyes_cascade.load(eyes_cascade_name)){ printf("--(!)Error loading\n"); return -1; };
    if (!lefteye_cascade.load(lefteye_cascade_name)){ printf("--(!)Error loading\n"); return -1; };
    if (!righteye_cascade.load(righteye_cascade_name)){ printf("--(!)Error loading\n"); return -1; };
    _mkdir("images");
    int num = 0;
    string strList = "list.txt";
    string strListNew = "listNEW.txt";
    ifstream ifsList(strList.c_str());
    ifstream ifsListNew(strListNew.c_str());
    if (ifsList.fail())
    {
        printf("open list failed\n");
        return -1;
    }
    if (ifsListNew.fail())
    {
        printf("open listNew failed\n");
        return -1;
    }
    //nNum = 0;
    char szPath[256]; 
    char szNewPath[256];

    while (!ifsList.eof())
    {
        memset(szPath, 0, sizeof(char)* 256);
        ifsList >> szPath;
        memset(szNewPath, 0, sizeof(char)* 256);
        ifsListNew >> szNewPath;
        Mat img = imread(szPath);
            if (!img.empty())
            {
                detectAndDisplay(img, num,szNewPath);
            }
            else
            {
                printf(" --(!) No captured frame -- Break!"); break;
            }

            int c = waitKey(10);
            if ((char)c == 'c') { break; }

        }

    return 0;
}


void detectAndDisplay(Mat frame, int &num,string szNewPath)
{
    std::vector<Rect> faces;
    Mat frame_gray;

    cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
    equalizeHist(frame_gray, frame_gray);
    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
    Mat out;

    for (size_t i = 0; i < faces.size(); i++)
    {
        Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);

        //   ellipse( frame, center, Size( faces[i].width/2, faces[i].height/2), 0, 0, 360, Scalar( 255, 0, 255 ), 2, 8, 0 );
        out = frame(Rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height));//my add code
        Mat faceROI = frame_gray(faces[i]);
        std::vector<Rect> eyes;
        std::vector<Rect> lefteye;

        //-- 在脸中检测眼睛
        //OpenCV2:
        // eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );
        //OpenCV3:
        eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
        lefteye_cascade.detectMultiScale(faceROI, lefteye, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
        for (size_t j = 0; j < lefteye.size(); j++)
        {
            Point eye_center(faces[i].x + lefteye[j].x + lefteye[j].width / 2, faces[i].y + lefteye[j].y + lefteye[j].height / 2);
            //int radius = cvRound((lefteye[j].width + lefteye[j].height)*0.25);
            cout << eye_center << endl;
            // circle( frame, eye_center, radius, Scalar( 255, 0, 0 ), 3, 8, 0 );
        }

        for (size_t j = 0; j < eyes.size(); j++)
        {
            Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);
            int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);
            // circle( frame, eye_center, radius, Scalar( 255, 0, 0 ), 3, 8, 0 );
        }
    }
    //imshow(window_name, frame);
    //stringstream ss;
    //ss << num;
    //string s = ss.str();
    //s = "images\\" + s + ".jpg";
    //imwrite(szNewPath, out);
    num++;
}

参考文献,《opencv3编程入门》毛星云

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值