1. 程式人生 > >OpenCV人臉識別的原理 完整版程式碼

OpenCV人臉識別的原理 完整版程式碼

http://blog.csdn.net/yanming901012/article/details/8606183

  1. 本程式首先利用從攝像頭檢測到的人臉圖片,先進行直方圖均衡化  
  2. 並縮放到92*112的圖片大小,然後根據train.txt的採集到的人臉模版  
  3. 進行匹配識別(最好是在統一光照下,採集不同角度的人臉圖片各一張)  
  4. 注意:影響的極大因素在於光照,模版若與採集的影象光照不一樣,識別率很低。  
  5. 經測試,模板若與檢測的影象在同一光照下的話,側臉,仰臉,正臉均可識別,且識別率較高  
  1. //
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "cv.h"
  5. #include "cvaux.h"
  6. #include "highgui.h"
  7. #include <stdlib.h>
  8. #include <assert.h>  
  9. #include <math.h>  
  10. #include <float.h>  
  11. #include <limits.h>  
  12. #include <time.h>  
  13. #include <ctype.h>  
  14. ////定義幾個重要的全域性變數
  15. IplImage ** faceImgArr        = 0; // 指向訓練人臉和測試人臉的指標(在學習和識別階段指向不同)
  16. CvMat    *  personNumTruthMat = 0; // 人臉影象的ID號
  17. int nTrainFaces               = 0; // 訓練影象的數目
  18. int nEigens                   = 0; // 自己取的主要特徵值數目
  19. IplImage * pAvgTrainImg       = 0; // 訓練人臉資料的平均值
  20. IplImage ** eigenVectArr      = 0; // 投影矩陣,也即主特徵向量
  21. CvMat * eigenValMat           = 0; // 特徵值
  22. CvMat * projectedTrainFaceMat = 0; // 訓練影象的投影
  23. char *filename[5]={"face1.jpg","face2.jpg","face3.jpg","face4.jpg","face5.jpg"};  
  24. static CvMemStorage* storage = 0;    
  25. static CvHaarClassifierCascade* cascade = 0;    
  26. int j=0;//統計記錄的人臉數
  27. char a[512]={0};  
  28. int a1,a2,a3,a4;  
  29. time_t timeBegin, timeEnd;      
  30.   int timeuse;    
  31. //// 函式原型
  32. void learn();  
  33. void doPCA();  
  34. void storeTrainingData();  
  35. int  loadTrainingData(CvMat ** pTrainPersonNumMat);  
  36. int  findNearestNeighbor(float * projectedTestFace);  
  37. int  loadFaceImgArray(char * filename);  
  38. void printUsage();  
  39. int detect_and_draw( IplImage* image );    
  40. int recognize(IplImage *faceimg);  
  41. //主函式,主要包括學習和識別兩個階段,需要執行兩次,通過命令列傳入的引數區分
  42. int main( int argc, char** argv )  
  43. {  
  44.     CvCapture* capture = 0;    
  45.     IplImage *frame, *frame_copy = 0;    
  46.     int optlen = strlen("--cascade=");    
  47.     char *cascade_name = "H://opencv-2.4.3//opencv//data//haarcascades//haarcascade_frontalface_alt2.xml";    
  48.         //opencv裝好後haarcascade_frontalface_alt2.xml的路徑,  
  49.        //也可以把這個檔案拷到你的工程資料夾下然後不用寫路徑名cascade_name= "haarcascade_frontalface_alt2.xml";    
  50.        //或者cascade_name ="C:\\Program Files\\OpenCV\\data\\haarcascades\\haarcascade_frontalface_alt2.xml"  
  51.     cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );    
  52.     if( !cascade )    
  53.     {    
  54.         fprintf( stderr, "ERROR: Could not load classifier cascade\n" );    
  55.         fprintf( stderr,    
  56.         "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" );    
  57.         return -1;    
  58.     }    
  59.     storage = cvCreateMemStorage(0);    
  60.      capture = cvCreateCameraCapture(-1);    
  61.     cvNamedWindow( "result", 1 );    
  62.     if( capture )    
  63.     {     timeBegin = time(NULL);      
  64.           learn();  
  65.         for(;;)    
  66.         {   timeEnd = time(NULL);      
  67.     timeuse=timeEnd - timeBegin;//計算經過的時間,統計人數
  68.             if( !cvGrabFrame( capture ))    
  69.                 break;    
  70.             frame = cvRetrieveFrame( capture );    
  71.             if( !frame )    
  72.                 break;    
  73.             if( !frame_copy )    
  74.                 frame_copy = cvCreateImage( cvSize(frame->width,frame->height),    
  75.                                             IPL_DEPTH_8U, frame->nChannels );    
  76.             if( frame->origin == IPL_ORIGIN_TL )//如果影象的起點在左上角  
  77.                 cvCopy( frame, frame_copy, 0 );    
  78.             else
  79.                 cvFlip( frame, frame_copy, 0 );//如果影象的起點不在左上角,而在左下角時,進行X軸對稱  
  80.             detect_and_draw( frame_copy );  //檢測並且識別
  81.             if( cvWaitKey( 10 ) >= 0 )    
  82.                 break;    
  83.         }    
  84.         cvReleaseImage( &frame_copy );    
  85.         cvReleaseCapture( &capture );    
  86.     }    
  87.     else
  88.     {    
  89.         printf("Cannot read from CAM");    
  90.         return -1;    
  91.     }    
  92.     cvDestroyWindow("result");    
  93.     return 0;    
  94. }    
  95. //學習階段程式碼
  96. void learn()  
  97. {  
  98.     int i, offset;  
  99.     //載入訓練影象集
  100.     nTrainFaces = loadFaceImgArray("train.txt");  
  101.     if( nTrainFaces < 2 )  
  102.     {  
  103.         fprintf(stderr,  
  104.             "Need 2 or more training faces\n"
  105.             "Input file contains only %d\n", nTrainFaces);  
  106.         return;  
  107.     }  
  108.     // 進行主成分分析
  109.     doPCA();  
  110.     //將訓練圖集投影到子空間中
  111. 相關推薦

    OpenCV人臉識別原理 整版程式碼

    http://blog.csdn.net/yanming901012/article/details/8606183 本程式首先利用從攝像頭檢測到的人臉圖片,先進行直方圖均衡化   並縮放到92*112的圖片大小,然後根據train.txt的採

    OpenCV人臉識別原理 (原文整版

    http://www.educity.cn/wenda/358439.html “人臉識別”是一個在計算機視覺和生物特徵識別領域十分活躍的話題。這個主題已經被給力地研究了25年,並且最終在安全、機器人學、人機互動、數碼攝像機、遊戲和娛樂領域得到了廣泛應用。   “人臉

    OpenCV人臉識別程式碼

    本部落格直接呼叫OpenCV2.4.13附帶的訓練好的人臉檢測分類器,使用AdaBoost方法對電腦自帶攝像頭進行人臉識別。 face_detection.cpp: #include <stdio.h> #include <iostream&g

    OpenCV人臉識別

    com show wait window alt imp bsp src import import cv2 filename = ‘pic.jpg‘ def detect(filename): face_cascade = cv2.Cascade

    基於Qt的OpenCV人臉識別(一)

            OpenCV對影象處理非常專業,具有很多模組。但是其GUI模組(即highgui),互動性非常差,就連按鈕也得用滑動條來實現。而Qt這個強大的c++圖形庫很好的避免了這個缺點,因此筆者基於Qt平臺,呼叫OpenCV庫,來進行OpenCV的人

    基於Qt的OpenCV人臉識別(二)

    經過上篇的qt環境配置,現在可以進行開發了。首先進行總體的介面設計,介面的控制元件選擇及介面如下: 單擊開啟攝像頭按鈕右鍵,轉到槽,OpenCV開啟攝像頭操作槽函式程式碼如下: //開啟攝像頭 void Widget::on_btn_open_clicked() { //開

    基於python opencv人臉識別的員工考勤系統

    WorkAttendanceSystem 一個基於opencv人臉識別的員工考勤系統,作者某雙一流A類大學裡的一流學生,寫於2018/09/,python課設期間。

    java實現opencv人臉識別(二)

    Java下使用opencv進行人臉檢測 工作需要,研究下人臉識別,發現opencv比較常用,儘管能檢測人臉,但識別率不高,多數是用來獲取攝像頭的視訊流的,提取裡面的視訊幀,實現人臉識別時通常會和其他框架搭配使用,比如face_recognition、SeetaFace En

    opencv 人臉識別 二 訓練和識別

                    上一篇中我們對訓練資料做了一些預處理,檢測出人臉並儲存在\pic\color\x資料夾下(x=1,2,3,...類別號),本文做訓練和識別。為了識別,首先將人臉訓練資料 轉為灰度、對齊、歸一化,再放入分類器(EigenFaceRecognizer),最後用訓練出的model進行

    【2018.12.24】python3.7+OpenCV 人臉識別(圖片+攝像頭)

    一、識別影象中的人臉個數。註釋寫的很好(\(^o^)/恩) #!/practice/Study_Test python # -*- coding: utf-8 -*- # @Time : 2018/12/23 21:19 # @Author : yb.w # @File : ima

    opencv 人臉識別 (一)訓練樣本的處理

    本文實現基於eigenface的人臉檢測與識別。給定一個影象資料庫,進行以下步驟:進行人臉檢測,將檢測出的人臉存入資料庫2對資料庫2進行人臉建模在測試集上進行recognition本篇實現第一步:進行人臉檢測,將檢測出的人臉存入資料庫2環境:vs2010+opencv 2.4

    基於Qt的OpenCV人臉識別(四)

    上篇進行了人臉的檢測,現在進行人臉的識別,採用OpenCV的face320模組裡的EigenFace演算法。在進行檢測之間,得製作被檢測人的人臉資料,這是捕獲按鈕就起到了作用,進行人臉資料的拍攝, //拍攝人臉 void Widget::on_btn_cap_clicked() {

    基於Qt的OpenCV人臉識別(三)

    上篇完成了Qt呼叫OpenCV的攝像頭,接下來要做的是基於拍攝到的圖片進行人臉檢測。使用OpenCV的級聯檢測器HAAR人臉檢測,首先在Qt的初始化函式中載入人臉模型: //初始化 void Widget::Init() { //載入人臉檢測模型 if(!faceDetect

    openCV人臉識別,yuv420sp格式轉BGR傳入Mat矩陣

            繼續安卓人臉識別,為了達到更好的效果,程式碼需要不斷優化。         前兩篇分別實現了jpg格式和bitmap格式的圖片資料傳入Mat

    opencv人臉識別,jni中Bitmap轉BGR格式

            續上篇,繼續人臉識別。         上篇雖然成功把Bitmap轉為了BGRA的格式傳到Mat矩陣中,但是在做人臉識別的過程中,需要的影象

    CNN卷積神經網路應用於人臉識別(詳細流程+程式碼實現)和相應的超引數解釋

    DeepLearning tutorial(5)CNN卷積神經網路應用於人臉識別(詳細流程+程式碼實現) @author:wepon 本文主要講解將CNN應用於人臉識別的流程,程式基於Python+numpy+theano+PIL開發,採用類似LeNet5的

    OpenCV人臉識別實驗(一)——特徵臉(Eigenfaces)及其重構的原始碼詳解

    1、介紹Introduction 從OpenCV2.4開始,加入了新的類FaceRecognizer,我們可以使用它便捷地進行人臉識別實驗。 本實驗採用的程式設計環境為:opencv3.0+VS2013。人臉識別的實驗已經轉移到face模組中, face模組在我這裡的路徑為

    python-opencv-人臉識別實現 從圖片中扣人臉

    最近專案需要,從百度,bing 爬取圖片,並對圖片中人臉進行扣取,然後扣取的人臉作為機器學習的樣本資料進行人工標註,圖片爬取了人工篩選比較耗時,於是查詢資料發現opencv庫中人臉識別可以實現該需求,識別率還可以。 #-*-coding:utf8-*- import os

    OpenCV——人臉識別模型訓練(2)

    在之前的部落格OpenCV——人臉識別資料處理(1)之中,已經下載了ORL人臉資料庫,並且為了識別自己的人臉寫了一個拍照程式自拍。之後對拍的照片進行人臉識別和提取,最後我們得到了一個包含自己的人臉照片的資料夾s41。在部落格的最後我們提到了一個非常重要的檔案——

    openCV人臉識別三種演算法實現(官網翻譯)

     怎樣使用OpenCV進行人臉識別 友情提示,要看懂程式碼前,你得先知道OpenCV的安裝和配置,會用C++,用過一些OpenCV函式。基本的影象處理和矩陣知識也是需要的。[gm:我是簫鳴的註釋]由於我僅僅是翻譯,對於六級才過的我,肯定有一些翻譯錯的或