zoukankan      html  css  js  c++  java
  • 提取图片中人脸特征点

    提取图片中人脸特征点

    //提取图片中人脸特征点
    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.
    ");
            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.
    ", (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
    ", 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;
    }
  • 相关阅读:
    SQL SERVER 2008的元数据视图
    SQL Server 2008 中的 XML 功能
    SQL SERVER 2008的层次结构支持
    C#打包程序
    SQL SERVER 2008的top增强
    SQL SERVER导出数据字典
    SQL SERVER 2008的转置函数PIVOT
    SQL SERVER 2008的SQLCMD模式
    SQL SERVER 2008传递表值参数
    SQL Server 2005导出表中数据的SQL脚本形式(即INSERT语句)
  • 原文地址:https://www.cnblogs.com/herd/p/11749024.html
Copyright © 2011-2022 走看看