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;
    }
  • 相关阅读:
    第三方包源码maven 下载
    Redis实现主从复制(转)
    Linq的优缺点
    async & await (转载)
    [转]抽象类与接口的区别及应用
    转载:C#中的泛型
    MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult
    C#中委托
    创建新的虚拟机
    GitHub上整理的一些工具[转载]
  • 原文地址:https://www.cnblogs.com/herd/p/11749024.html
Copyright © 2011-2022 走看看