OpenCV: OpenCV人脸检测框可信度排序
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                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進行比對就可以知道臉的得分啦~
試驗結果:
?? ?? 
 
 
 
總結
以上是生活随笔為你收集整理的OpenCV: OpenCV人脸检测框可信度排序的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: OpenCV:Adaboost训练时数据
 - 下一篇: 作业帮app如何提问