libfacedetection

libfacedetection测试

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <facedetect-dll.h>


//define the buffer size. Do not change the size!
//定义缓冲区大小 不要改变大小!
#define DETECT_BUFFER_SIZE 0x20000
using namespace cv;

unsigned char * pBuffer;

void facedetect_frontal_surveillance1(Mat image);

int main()
{
    VideoCapture video1(0);
    Mat image;
    while (1)
    {
        pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
        if (!pBuffer)
        {
            fprintf(stderr, "Can not alloc buffer.
");
            return -1;
        }

        //load an image and convert it to gray (single-channel)
        //加载图像并将其转换为灰色(单通道)
        //Mat image = imread("E:\libfacedetection\libfacedetection_install\images\keliamoniz1.jpg");
        video1.read(image);
        //Mat image = imread("E:\libfacedetection\libfacedetection_install\images\1.jpg");
        if (image.empty())
        {
            return -1;
        }
        facedetect_frontal_surveillance1(image);

        //waitKey();
        char c1 = waitKey(10);
        if (c1 == 27)
        {
            break;
        }

        free(pBuffer);
    }
    
    
    //release the buffer
    

    return 0;
}


void facedetect_frontal_surveillance1(Mat image)
{
    int w1 = image.cols;
    int h1 = image.rows;

    Mat gray;
    cvtColor(image, gray, CV_BGR2GRAY);

    int min_obj_width = 8;
    float scale1 = 1.1f;
    int min_neightbors1 = 2;

    int * pResults = NULL;
    //pBuffer is used in the detection functions.
    //pBuffer指针用于检测函数。
    //If you call functions in multiple threads, please create one buffer for each thread!
    //如果您在多个线程中调用函数,请为每个线程创建一个缓冲区!
    
    int doLandmark = 2;

    ///////////////////////////////////////////
    // frontal face detection designed for video surveillance / 68 landmark detection
    //正面人脸检测专为视频监控/ 68标志性检测而设计
    // it can detect faces with bad illumination.
    //它可以检测到不良照明的面部。
    //////////////////////////////////////////
    //!!! The input image must be a gray one (single-channel)
    //!!! DO NOT RELEASE pResults !!!
    pResults = facedetect_frontal_surveillance(pBuffer, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,
        scale1, min_neightbors1, min_obj_width, 0, doLandmark);
    //printf("%d faces detected.
", (pResults ? *pResults : 0));
    Mat result_frontal_surveillance = image.clone();;
    //print the detection results
    for (int i = 0; i < (pResults ? *pResults : 0); i++)
    {
        short * p = ((short*)(pResults + 1)) + 142 * i;
        int x = p[0];
        int y = p[1];
        int w = p[2];
        int h = p[3];
        int neighbors = p[4];
        int angle = p[5];

        printf("face_rect=[%d, %d, %d, %d], neighbors=%d, angle=%d
", x, y, w, h, neighbors, angle);
        rectangle(result_frontal_surveillance, Rect(x, y, w, h), Scalar(0, 255, 0), 2);
        if (doLandmark)
        {
            for (int j = 0; j < 68; j++)
                circle(result_frontal_surveillance, Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 1, Scalar(0, 255, 0));
        }
    }

    if (w1>1600)
    {
        resize(result_frontal_surveillance, result_frontal_surveillance, Size(w1 / 4, h1 / 4));
    }


    imshow("Results_frontal_surveillance", result_frontal_surveillance);

}

原文地址:https://www.cnblogs.com/herd/p/11632636.html