提取图片中人脸特征点

提取图片中人脸特征点

提取图片中人脸特征点

//提取图片中人脸特征点
QVector<cv::Point> facedetect_frontal_surveillance5(cv::Mat imageParam)
{
    QVector<cv::Point> vec_pointsParam;
    cv::resize(imageParam, imageParam, cv::Size(600, 600));
    cv::Mat img_result1 = cv::Mat(imageParam.size(), imageParam.type());
    pBuffer3 = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
    if (!pBuffer3)
    {
        fprintf(stderr, "Can not alloc buffer.\n");
        return vec_pointsParam;
    }
    //vec_pointsParam = facedetect_frontal_surveillance4(imgParam, winName);


    int w1 = imageParam.cols;
    int h1 = imageParam.rows;

    cv::Mat gray;
    cv::cvtColor(imageParam, 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(pBuffer3, (unsigned char*)(gray.ptr(0)), gray.cols, gray.rows, (int)gray.step,
        scale1, min_neightbors1, min_obj_width, 0, doLandmark);
    //printf("%d faces detected.\n", (pResults ? *pResults : 0));
    cv::Mat result_frontal_surveillance = imageParam.clone();;
    //print the detection results

    int heightParam2 = 0;
    int widthParam2 = 0;
    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\n", x, y, w, h, neighbors, angle);
        rectangle(result_frontal_surveillance, cv::Rect(x, y, w, h), cv::Scalar(0, 255, 0), 2);
        if (doLandmark)
        {
            std::cout << "";
            for (int j = 0; j < 68; j++)
            {
                int x1 = (int)p[6 + 2 * j];
                int y1 = (int)p[6 + 2 * j + 1];

                std::cout << " (" << x1 << "," << y1 << ") ";
                //circle(result_frontal_surveillance, cv::Point((int)p[6 + 2 * j], (int)p[6 + 2 * j + 1]), 1, cv::Scalar(0, 255, 0));
                circle(result_frontal_surveillance, cv::Point(x1, y1), 1, cv::Scalar(0, 255, 0));

                cv::Point point_index;
                point_index.x = x1;
                point_index.y = y1;
                vec_pointsParam.append(point_index);
            }
            std::cout << "" << std::endl;
        }

        //face_img  = cv::Mat(index_img,index_img.type(),1,)
        //face_img = cv_img::copyRectangle(index_img, y, x, w, h);

    }



    free(pBuffer3);
    return vec_pointsParam;
}
01-09 03:28