OpenCV: OpenCV人脸检测框可信度排序
生活随笔
收集整理的這篇文章主要介紹了
OpenCV: OpenCV人脸检测框可信度排序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
??????? 參考文章:http://blog.csdn.net/hua_007/article/details/45368607
?????? 使用OpenCV進(jìn)行人臉識(shí)別時(shí),使用
casecade.detectMultiScale ?????? 函數(shù),可輸出每個(gè)檢測(cè)框的置信度代碼段:
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);//重新獲取,只取前四個(gè) for (int i = 0; i < (int)(eyes.size()) && i<numReserve ; i++) {cv::Rect eyeSin = eyes[eyeConfi[i].second];eyesFinal.push_back(eyeSin) ; }函數(shù)原型: 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函數(shù):
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);}函數(shù)的原理是這樣的(個(gè)人理解,有錯(cuò)誤請(qǐng)指教):
首先一個(gè)level一個(gè)level地測(cè)試樣本,然后每一個(gè)level給一個(gè)對(duì)應(yīng)的得分,也就是levelWeight,如果這個(gè)weight低于或者高于對(duì)應(yīng)level的threshold,則被拋棄。
堅(jiān)持到最后一個(gè)level并且在最后一個(gè)level仍然滿足threshold的框就是正確的臉(正樣本)。
所以,人臉的分應(yīng)該是這樣:level越大,分?jǐn)?shù)越高,在相同的level,levelWeight越大分?jǐn)?shù)越高。
但是實(shí)際上真正的人臉都是能堅(jiān)持到level20(最后一個(gè)level)的,所以只比對(duì)最后一個(gè)level的所有大于1的框的levelWeight進(jìn)行比對(duì)就可以知道臉的得分啦~
試驗(yàn)結(jié)果:
?? ??
總結(jié)
以上是生活随笔為你收集整理的OpenCV: OpenCV人脸检测框可信度排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV:Adaboost训练时数据
- 下一篇: Haar、pico、npd、dlib等多