zoukankan      html  css  js  c++  java
  • OpenCV: OpenCV人脸检测框可信度排序

            参考文章:http://blog.csdn.net/hua_007/article/details/45368607


           使用OpenCV进行人脸识别时,使用

       casecade.detectMultiScale
           函数,可输出每个检测框的置信度

    代码段:

    	
    const int numReserve = 4;
    std::vector<  int > rejLevel;
    std::vector<double>   levelW;
    cascade.detectMultiScale( smallImg, eyes, rejLevel, levelW, 1.1, 3, 0, cv::Size(), cv::Size(), true);
    cout << "eyes size=:" << eyes.size() << endl;
                
    // 重新排序
    std::vector<std::pair<float, int> > eyeConfi;
    for (int i = 0; i < (int)(eyes.size()); i++){
         eyeConfi.push_back(std::make_pair(levelW[i], i));
    }
    std::qsort(&eyeConfi[0], eyeConfi.size(), sizeof(eyeConfi[0]), cmpMapWishchin);
    
    //重新获取,只取前四个
    for (int i = 0; i < (int)(eyes.size()) && i<numReserve ; i++)
    {
           cv::Rect eyeSin = eyes[eyeConfi[i].second];
           eyesFinal.push_back(eyeSin) ;
    }
    
    
    函数原型:

        CV_WRAP virtual void detectMultiScale( const Mat& image,
                                       CV_OUT vector<Rect>& objects,
                                       vector<int>& rejectLevels,
                                       vector<double>& levelWeights,
                                       double scaleFactor=1.1,
                                       int minNeighbors=3, int flags=0,
                                       Size minSize=Size(),
                                       Size maxSize=Size(),
                                       bool outputRejectLevels=false );


    cmp函数:

             int cmpMapWishchin(const void *p1, const void *p2)
             {
                int v = 1;
                std::pair<float, int >  *pp1, *pp2;
                pp1 = (std::pair<float, int > *) p1;
                pp2 = (std::pair<float, int > *) p2;
    
                //最大值排序
                if (pp1->first - pp2->first < 0){
                    v = 1;
                }
                else{
                    v = -1;
                }
    
                return (v);
             }

    函数的原理是这样的(个人理解,有错误请指教):

    首先一个level一个level地测试样本,然后每一个level给一个对应的得分,也就是levelWeight,如果这个weight低于或者高于对应level的threshold,则被抛弃。

    坚持到最后一个level并且在最后一个level仍然满足threshold的框就是正确的脸(正样本)。

    所以,人脸的分应该是这样:level越大,分数越高,在相同的level,levelWeight越大分数越高。

    但是实际上真正的人脸都是能坚持到level20(最后一个level)的,所以只比对最后一个level的所有大于1的框的levelWeight进行比对就可以知道脸的得分啦~


    试验结果:

         



  • 相关阅读:
    IOS:兼容ios6和低版本
    iOS开发~sizeClass和autolayout
    iOS开发~即时通讯工具参考的一些开源框架和教程
    移动开发网站导航
    mac工具总结
    推送总结(重要)
    IOS常用学习网站和博客
    iOS~静态库开发
    iOS~视频开发
    iOS~视频编码转换
  • 原文地址:https://www.cnblogs.com/wishchin/p/9199957.html
Copyright © 2011-2022 走看看