版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、/ AppDesignDlg.cpp : implementation file/#include stdafx.h#include AppDesign.h#include AppDesignDlg.h#include #include #include Select.h#include CvvImage.h#define MAX_POINT 200#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAboutDlg dialog used for App About
2、using namespace std;CvCapture * m_Video; / opencv 庫的指針,從視頻獲取圖像int nFrmNum=0; /定義第 nFrmNum 幀, 初始化為 0,自動(dòng)增值, nFrmNum 是幀控件的關(guān) 聯(lián)變量,幀控件的 ID 為 IDC_FRAMNUM/ 定義幾個(gè)重要的全局變量int nTrainFaces =0; / 訓(xùn)練圖像的數(shù)目,即人臉庫中有 n 張人臉int nEigens =0; / 自己取的主要特征值數(shù)目 (在提取特征臉的時(shí)候用到的參數(shù))IplImage* faceImgArr =0; / 指向訓(xùn)練人臉和測(cè)試人臉的指針(在學(xué)習(xí)和識(shí)別階段指向不
3、 同)CvMat* personNumTruthMat=0; / 人臉圖像的 ID 號(hào)IplImage* pAvgTrainImg =0; / 訓(xùn)練人臉數(shù)據(jù)的平均值IplImage* eigenVectArr =0; / 投影矩陣,也即主特征向量CvMat* eigenValMat =0; / 特征值CvMat* projectedTrainFaceMat=0; / 訓(xùn)練圖像的投影CvMat* trainPersonNumMat=0;/*以下是自定義函數(shù)的聲明,具體定義會(huì)在下方,cv 開頭的是 OPENCV 自帶的庫函數(shù) */void learn();int loadFaceImgArr(ch
4、ar *filename);void recognize2(IplImage *img);void doPCA();void storeTrainingData();int loadTrainingData(CvMat* pTrainPersonNumMat);int findNearestNeighbor(float* projectedtestFace);/用字符串時(shí)一定要把 using namespace std;寫在前面,否則不能用 ,下面是用于顯示的字符串CvHaarClassifierCascade* cascade=NULL;/OPENcv 的分類器文件進(jìn)行人臉檢測(cè), 此函數(shù)是一
5、個(gè)匹配函數(shù), 根據(jù)不同的分類 器( tree 、stump )進(jìn)行不同的匹配 ,返回整形值,具體參考 或 ,是人臉檢測(cè)中用到的一個(gè)很重要 的函數(shù)/* 以下是 MFC 框架代碼,在我們用鼠標(biāo)進(jìn)行搭建框架的時(shí)候自動(dòng)生成 */ class CAboutDlg : public Cdialogpublic:CAboutDlg();/ Dialog Data/AFX_DATA(CAboutDlg)enum IDD = IDD_ABOUTBOX ;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CAboutDl
6、g)protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUAL / Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP() ;CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)
7、CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg) /AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ CAppDesignDlg dialogCAppDesignDlg:CAppDesignDlg(CWnd* pParent /*=NULL*/): CDialog(CAppDesignDlg:IDD, pParent)/AFX_DATA_INI
8、T(CAppDesignDlg)/ NOTE: the ClassWizard will add member initialization here /AFX_DATA_INIT/ Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); pCapture = NULL;m_totalfrm = 0;m_curfrm = 0;m_stop = false;loadxml=false;m_src = NULL;m_tim
9、es =0;void CAppDesignDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAppDesignDlg)/DDX_Control(pDX, IDC_PROGRESS1, m_progress);/AFX_DATA_MAPDDX_Control(pDX, IDC_PROGRESS1, m_progress);BEGIN_MESSAGE_MAP(CAppDesignDlg, CDialog)/AFX_MSG_MAP(CAppDesignDlg)ON_WM_SYSCOMMAN
10、D()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, OnOpenFile)ON_WM_TIMER()ON_BN_CLICKED(IDC_BUTTON5, OnStop)ON_WM_CTLCOLOR()/AFX_MSG_MAPON_BN_CLICKED(IDC_BUTTON2, &CAppDesignDlg:OnBnClickedButton2)ON_BN_CLICKED(IDC_BUTTON3, &CAppDesignDlg:OnBnClickedButton3) END_MESSAGE_MAP()/ CAppDesi
11、gnDlg message handlersBOOL CAppDesignDlg:OnInitDialog()CDialog:OnInitDialog();/ Add About. menu item to system menu./ IDM_ABOUTBOX must be in the system command range.ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING , IDM_ABOUT
12、BOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically / when the applications main window is not a dialog SetIcon(m_hIcon, TRUE);/ Set big iconSetIcon(m_hIcon, FALSE); / Set small icon/ TODO: Add extra initialization herereturn TRUE; / return TRUE unless you set th
13、e focus to a control void CAppDesignDlg:OnSysCommand(UINT nID, LPARAM lParam) if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout; dlgAbout.DoModal();else CDialog:OnSysCommand(nID, lParam);/ If you add a minimize button to your dialog, you will need the code below / to draw the icon. For MFC applica
14、tions using the document/view model, / this is automatically done for you by the framework.void CAppDesignDlg:OnPaint() /OnPaint 是 WM_PAINT 消息 的消息處理函數(shù) , 是 CWnd 的 類成員,負(fù)責(zé)響應(yīng) WM_PAINT 消息if (IsIconic()CPaintDC dc(this); / device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(),
15、 0);/ Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;/ Draw the icon dc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/ T
16、he system calls this to obtain the cursor to display while the user drags / the minimized window.HCURSOR CAppDesignDlg:OnQueryDragIcon()return (HCURSOR) m_hIcon;/*這個(gè)程序的思路是, 每 33 毫秒,就調(diào)用 opencv 獲取攝像頭的圖像資料, 并更新到界面上, 讓用戶看起來是錄像,實(shí)時(shí)的感覺,其實(shí)就是每 33 毫秒更新一次圖片,然后載入頭像資料 進(jìn)行識(shí)別 */* “打開攝像頭”控件的相關(guān)代碼 OnOpenFile() */void
17、CAppDesignDlg:OnOpenFile()/ OnOpenFile() 是“打開攝像頭”這個(gè)控件的控制事 件,也就是其函數(shù), m_Video是控件的變量/* 調(diào)用 opencv 打開視頻 */m_Video = cvCaptureFromCAM(-1); / cvCaptureFromCAM(-1) 是 opencv的庫函數(shù), 用來從視頻中獲 取圖像,直接調(diào)用,這里也是界面與攝像頭的接口if (!m_Video)AfxMessageBox( 無法打開攝像頭 ); / AfxMessageBox 這個(gè)函數(shù)是 MFC中彈出消息框的 函數(shù),直接調(diào)用return;/cascade是級(jí)聯(lián)f(!
18、cascade)string cascade name = haarcascade frontalface alt.xml;cascade = (CvHaarClassifierCascade*)cvLoad( cascade name.c str(), 0, 0, 0);/* 啟動(dòng)計(jì)時(shí)器 */SetTimer(1,33,NULL);/* 上面的內(nèi)容基本都是 MFC 的框架代碼,下面函數(shù)開始是自定義的函數(shù) 了 */ID/ int nID 在這 里是形參,而/在控件中顯示圖片,第一個(gè)參數(shù)是要顯示的圖片,第二個(gè)參數(shù)是控件的void CAppDesignDlg:show_pic(IplImage *
19、t,int nID)不是具體的IDCDC *pDC = GetDlgItem(nID)-GetDC();HDC hDC= pDC-GetSafeHdc();CRect rect;GetDlgItem(nID)-GetClientRect(&rect);CvvImage img;img.CopyOf(t,3); img.DrawToHDC(hDC,&rect);ReleaseDC(pDC);/* 獲得圖像興趣區(qū)域 ,并且保存為 tmp.jpg , pImg 是待處理圖像, CvRect roi 是確定一個(gè)矩 形區(qū)域 roi */void GetSubImage(IplImage *pImg, C
20、vRect roi)/基于給定的矩形設(shè)置圖像的 ROI ,即獲取感興趣的圖像 cvSetImageROI(pImg,roi);/保存圖像到指定文件 tmp.jpgcvSaveImage(tmp.jpg,pImg);/ 釋放圖像 pImg 中被設(shè)定的感興趣區(qū)域 ROI ,與 cvSetImageROI 相對(duì)應(yīng)。 cvResetImageROI(pImg);/這個(gè)函數(shù)主要是識(shí)別開始檢測(cè)到的人臉,是人臉識(shí)別的入口函數(shù)void RecgnizeRoi(IplImage *img,char *a)int i, nTestFaces=0; / 測(cè)試的人臉數(shù)float* projectedTestFace=
21、0; / 訓(xùn)練的人臉數(shù)? projectedTestFace=(float*)cvAlloc(nEigens*sizeof(float); /cvAlloc 是 opencv 中用于內(nèi) 存管理的函數(shù)/for (i=0;idata.iiNearest;/ char *itoa(int value, char *string, int radix); 作用是把一整數(shù)轉(zhuǎn)換為 字符串 。value: 待轉(zhuǎn)化的整數(shù); radix: 是基數(shù)的意思 , 即先將 value 轉(zhuǎn)化為 radix 進(jìn)制的數(shù),范圍介 于 2-36 ,比如 10 表示 10 進(jìn)制,16 表示 16 進(jìn)制;* string: 保存轉(zhuǎn)換
22、后得到的字符 串,和函數(shù)返回值相同,也就是說,最后的圖片存儲(chǔ)稱 aitoa(nearest,a,10);/檢測(cè)和識(shí)別的入口, 頭像識(shí)別核心代碼void CAppDesignDlg:Detect_Draw(IplImage *pImg) bool bFirstFace = TRUE;string strFirstFace = ;/ 一個(gè)顏色數(shù)組, 這個(gè)數(shù)組定義了一些顏色值 用這些顏色依次圈出不同的人臉 ,在 最后畫圓來圈出人臉的那句代碼中cvCircle( img, center, radius, colorsi%8, 3, 8, 0 );中的 color的數(shù)值。static CvScalar
23、colors = 0,0,255, / 藍(lán)色 0,128,255, 0,255,255, 0,255,0, 255,128,0, 255,255,0, 255,0,0, 255,0,255;/ 先把識(shí)別到的學(xué)號(hào)初始化為空 namelist= ;源代碼不知道有沒有/ 調(diào)用 opencv創(chuàng)建存儲(chǔ)空間(為 NAMELIST)CvMemStorage* storage = cvCreateMemStorage(0);double scale = 1.8;/ 函數(shù) IplImage* cvCreateImage( CvSize size, int depth, int channels );創(chuàng)建頭并分配
24、數(shù)據(jù) ,參數(shù)意義: size 圖像寬、 高; depth 圖像元素的位深度; channels 每個(gè)元 素(像素)通道數(shù) .可以是 1, 2, 3 或 4.通道是交叉存取的IplImage* gray = cvCreateImage( cvSize(pImg-width,pImg-height), 8, 1 ); /仍然是這個(gè)函數(shù),對(duì)目標(biāo)圖進(jìn)行設(shè)置和分配空間( gray 是原圖)IplImage* small_img = cvCreateImage( cvSize( cvRound (pImg-width/scale),/int cvRound (double value) 對(duì)一個(gè) doubl
25、e 型的數(shù)進(jìn)行四舍五入,并返回一個(gè)整型 數(shù)!cvRound (pImg-height/scale),8, 1 );int i;/灰度化, cvCvtColor 是 Opencv 里的顏色空間轉(zhuǎn)換函數(shù),可以實(shí)現(xiàn) RGB 顏色向 HSV,HSI 等 顏 色 空 間 的 轉(zhuǎn) 換 , 也 可 以 轉(zhuǎn) 換 為 灰 度 圖 像 。 具 體 參 見 。cvCvtColor( pImg, gray, CV_BGR2GRAY );/歸一化尺度, 函數(shù) cvResize 重新調(diào)整圖像 src(或它的 ROI),使它精確匹配目 標(biāo) dst(或其 ROI ),src 源圖像; dst 目標(biāo)圖; interpolati
26、on 修改、插補(bǔ)的方法,取 值如下: CV_INTER_LINEAR 是其 默認(rèn)方法,為雙線性插值。cvResize( gray, small_img, CV_INTER_LINEAR );/直方圖均衡, 函數(shù)原型為 void cvEqualizeHist( const CvArr* src, CvArr* dst );用來使灰度圖象 直方圖均衡化 。具體見 。 cvEqualizeHist( small_img, small_img );/刪除存儲(chǔ)空間,與上面創(chuàng)建空間對(duì)應(yīng)。cvClearMemStorage( storage );/ 如果識(shí)別成功,就標(biāo)識(shí)出來。if( cascade ) 又是
27、級(jí)聯(lián)/人臉檢測(cè)函數(shù), cvHaarDetectObjects 函數(shù)用來檢測(cè)圖像中的目標(biāo) ,具體見 。/*級(jí)聯(lián)分類器訓(xùn)練中采用的檢測(cè)目標(biāo)的尺寸 */);/ 檢測(cè)人臉返回矩形人臉 /*使 用針對(duì)某目標(biāo)物體訓(xùn)練的級(jí)聯(lián)分類器在圖像中找到包含目標(biāo)物體的矩形區(qū)域,并且 將這些區(qū)域作為一序列的矩形框返回。CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/, cvSize(40, 40) );for( i = 0; i total : 0); i+ )CvRe
28、ct* r ,通過方形左上角坐標(biāo)和方形的高和寬來確定一個(gè)矩形區(qū)域,nt x; /* 方形的左上角的 x-坐標(biāo) */ ;int y; /* 方形的左上角的 y-坐標(biāo)*/ ;int width; /* 寬 */ ; int height; /* 高 */CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); / 訪問人臉庫中的第 i 個(gè)元素CvPoint pt1, pt2; / OpenCV 的基本數(shù)據(jù)類型之一, 表示坐標(biāo)為整數(shù)的二維 點(diǎn)r-x = r-x * scale;r-y = r-y * scale;r-width = r-width * scale;
29、r-height = r-height * scale;pt1.x = r-x;pt1.y = r-y;pt2.x = r-x + r-width;pt2.y = r-y + r-height;/ 矩形將人臉框起來。 cvRectangle 是 OpenCV 里面的繪圖函數(shù),四個(gè)參數(shù)分別代表(圖像,矩形的兩個(gè)點(diǎn),線條顏色,線條粗細(xì),線條類型,小數(shù)點(diǎn)位數(shù))cvRectangle( pImg, pt1, pt2, colorsi%8, 3, 8, 0);GetSubImage(gray, *r);/ 獲取圖片 /讀入圖像,參數(shù)分別為(被讀入圖像的文件名(包括后綴), 指定讀入圖像的顏色和深度 ,
30、CV_LOAD_IMAGE_GRAYSCALE 是 單 通 道 ) , 具 體 見 。IplImage *gray1=cvLoadImage(tmp.jpg,CV_LOAD_IMAGE_GRAYSCALE);/ 創(chuàng)建頭并分配數(shù)據(jù)(圖像寬,高, depth 圖像元素的位深度,每個(gè)元素(像素) 通道數(shù))IplImage *dst=cvCreateImage(cvSize(96,96),8,1);/函數(shù) cvResize 重新調(diào)整圖像 src(或它的 ROI ),使它精確匹配目標(biāo) dst(或其 ROI) cvResize(gray1,dst,CV_INTER_NN); / CV_INTER_NN -
31、 最近 -鄰居插補(bǔ) 的修改方法char a20=;/識(shí)別檢測(cè)到的人臉,調(diào)用了之前定義的函數(shù)RecgnizeRoi(dst,a);/ 應(yīng)該是有關(guān)輸出的對(duì)齊方式的CvFont font1;cvInitFont(&font1, CV_FONT_ITALIC, 0.75F, 0.75F, 0, 3, 8); /將識(shí)別結(jié)果顯示出來/函數(shù) cvPutText 將具有指定字體的和指定顏色的文本加載到圖像中。 加載到圖像中的文本 被感興趣的矩形框圈定。 (輸入圖像,顯示字符串,第一個(gè)字符左下角的坐標(biāo),字體結(jié)構(gòu) 初始化,文本的字體顏色)cvPutText(pImg, a, wp, &font1, colors2
32、);/在控件上顯示出識(shí)別了幾個(gè)人 CString str;/Format 是 CString 類的一個(gè)成員函數(shù),它通過格式操作使任意類型的數(shù)據(jù)轉(zhuǎn)換成 一個(gè)字符串。 。str.Format(%d,faces-total);/返回窗口中指定參數(shù) ID 的子元素的句柄,可以通過返回的句柄對(duì)窗口內(nèi)的子元素 進(jìn)行操作。GetDlgItem(IDC_PEOPLENUM)-SetWindowText(str);/系統(tǒng)釋放存儲(chǔ)空間 cvReleaseImage( &gray );cvReleaseImage( &small_img );每 33 毫秒調(diào)用一下這個(gè)模塊/定時(shí)器函數(shù), nIDEvent 是定時(shí)器標(biāo)
33、識(shí)符void CAppDesignDlg:OnTimer(UINT nIDEvent)IplImage* image;IplImage* motion = 0;/* 調(diào)用 opencv 提取視頻圖像數(shù)據(jù) */讀取攝像頭一幀 , cvQueryFrame(m_Video) 從攝像頭或者文件中抓取并返回一幀 image=cvQueryFrame(m_Video);/* 幀數(shù)計(jì)算器 */下面四行代碼是將幀數(shù)顯示在控件上/* 幀數(shù)計(jì)算器 */nFrmNum+;CString str;/str 就是那個(gè)變化的幀值,同 str 幾個(gè)人是一樣一樣的/* 把幀數(shù)在界面顯示出來 */str.Format(%d,
34、nFrmNum);/顯示函數(shù)/返回窗口中指定參數(shù) ID 的子元素的句柄, 可以通過返回的句柄對(duì)窗口內(nèi)的子元 素進(jìn)行操作。上面共識(shí)別幾個(gè)人的那個(gè)控件也用到了這條語句,功能是一樣的。GetDlgItem(IDC_FRAMNUM)-SetWindowText(str);/ cvGetTickCount() 是 測(cè) 量 運(yùn) 行 時(shí) 間 的 函 數(shù) , 在程 序 段 的 開 始 和 結(jié) 束 時(shí) 兩 次 使 用 cvGetTickCount() ,然后將兩次的差除以 cvGetTickFrequency() 后就可以獲得程序 段的以微秒 us 為單位的運(yùn)行時(shí)間, 而 *1000 表示精確到 msdoubl
35、e tt =(double)cvGetTickCount();Detect_Draw, Detect_Draw 這/如果加載了訓(xùn)練結(jié)果,則可以開始檢測(cè)識(shí)別了,調(diào)用函數(shù) 個(gè)函數(shù)是頭像識(shí)別函數(shù)if(loadxml)Detect_Draw(image);/得到?jīng)]幀的時(shí)間消耗tt=(double)cvGetTickCount()-tt;str.Format(%lf,tt/(cvGetTickFrequency()*1000.);/ 把處理耗時(shí)顯示在界面上GetDlgItem(IDC_TIME)-SetWindowText(str);/ 把識(shí)別到的人的學(xué)號(hào)顯示在界面的列表中GetDlgItem(IDC_
36、NAMELIST)-SetWindowText(namelist);/控件上顯示圖片/* 把攝像頭的圖像顯示到圖片空間上 */show_pic(image,IDC_SHOWIMG);是定時(shí)器的函數(shù), 為什么要在這33 毫秒觸發(fā) 1 次的定時(shí)器CDialog:OnTimer(nIDEvent);/ /OnTimer(UINT nIDEvent)里寫這句?/這個(gè)暫停按鈕的代碼void CAppDesignDlg:OnStop()/ TODO: Add your control notification handler code here m_stop=!m_stop;if (m_stop)Kill
37、Timer(1);/ 銷毀定時(shí)器 else SetTimer(1,33,NULL); /創(chuàng)建定時(shí)器,這里是一個(gè)/繼續(xù)void CAppDesignDlg:OnOK()/ TODO: Add extra validation here cvReleaseCapture( &pCapture ); CDialog:OnOK();/控制控件的顯示顏色, OnCtlColor 有關(guān)參見 pDC 是一個(gè) CDC 指針,是用來繪圖和顯示的 pWnd 是一個(gè) cWnd 指針,指向控件(不確定) nCtlColor 則是用來區(qū)別不同的調(diào)用的HBRUSH CAppDesignDlg:OnCtlColor(CDC
38、* pDC, CWnd* pWnd, UINT nCtlColor) HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtlColor);if (pWnd-GetDlgCtrlID() = IDC_FRAMNUM) pDC-SetTextColor(RGB(255,0, 0); / 幀控件的字體顏色if (pWnd-GetDlgCtrlID() = IDC_TIME) pDC-SetTextColor(RGB(255, 0, 0);/時(shí)間控件的字體顏色/ TODO: Return a different brush if the default is n
39、ot desired return hbr;/訓(xùn)練樣本的函數(shù)void CAppDesignDlg:Train()int i;/文件解析,得到文件列表或者稱,加載訓(xùn)練圖像集 nTrainFaces為訓(xùn)練圖像的數(shù)目; 導(dǎo)入 faceImgArr( 指向訓(xùn)練人臉的指針) ,解析得到 train.txt nTrainFaces=loadFaceImgArr(train.txt);if(nTrainFaces2)fprintf(stderr,Need 2 or more training facesn,Input file contains only %dn, nTrainFaces);return;/
40、設(shè)置進(jìn)度條, m_progress 是進(jìn)度條的關(guān)聯(lián)參數(shù), 1 和 nTrainFaces 分別是起始和結(jié)束 的位置m_progress.SetRange(1, nTrainFaces);/PCA 提取特征,進(jìn)行主成分分析/*int nTrainFaces =0;/ 訓(xùn)練圖像的數(shù)目,即人臉庫中有 n 張人臉int nEigens =0; / 自己取的主要特征值數(shù)目 (在提取特征臉的時(shí)候用到的參數(shù) )CvMat* eigenValMat =0; / 特征值CvMat* projectedTrainFaceMat=0; / 訓(xùn)練圖像的投影CvMat* trainPersonNumMat=0;*/do
41、PCA();/ projectedTrainFaceMat 是訓(xùn)練圖像的投影; cvCreateMat 是創(chuàng)建矩陣函數(shù),參數(shù)分別為(矩 陣行數(shù),矩陣列數(shù),元素類型) ,下面的分別是(訓(xùn)練圖像數(shù)目,特征值數(shù)目,32 位數(shù)據(jù))projectedTrainFaceMat=cvCreateMat(nTrainFaces,nEigens,CV_32FC1);for (i=0;idata.fl+i*nEigens); m_progress.SetPos(i+1); / 進(jìn)度條的位置加 1 Sleep(100); /程序暫停 1 毫秒/將訓(xùn)練結(jié)果保存到文件 storeTrainingData();/解析文件
42、列表,就是讀文件 / 加載 txt 文件的列舉的圖像int loadFaceImgArr(char *filename)FILE* imgListFile=0;char imgFilename512;int iFace, nFaces=0;/open the input file imgListFile=fopen(filename,r);/ 統(tǒng)計(jì)人臉數(shù) while(fgets(imgFilename,512,imgListFile) +nFaces;/fgets: read a line of files strings to store in imgFilename/function fg
43、ets stops if meets a line break or read number of parameter 2 rewind(imgListFile);/get the pointer to the start position of a file/ 分配人臉圖像存儲(chǔ)空間和人臉 ID 號(hào)存儲(chǔ)空間 faceImgArr=(IplImage*)cvAlloc(nFaces*sizeof(IplImage*);personNumTruthMat=cvCreateMat(1,nFaces,CV_32SC1);for (iFace=0;iFacedata.i+iFace,imgFilenam
44、e);/將圖片保存在數(shù)組中 / 加載人臉圖像 faceImgArriFace=cvLoadImage(imgFilename,CV_LOAD_IMAGE_GRAYSCALE);fclose(imgListFile);return nFaces;/PCA 提取人臉特征void doPCA()int i;CvTermCriteria calcLimit; / CvTermCriteria criteria :停止迭代的標(biāo)準(zhǔn),傳入; CvSize faceImgSize; / 人臉框的大小/set the number of eigenvalues to use nEigens=nTrainFace
45、s-1; / 特增值的數(shù)目/分配內(nèi)存空間faceImgSize.width=faceImgArr0-width;/ faceImgArr 測(cè)試人臉的寬faceImgSize.height=faceImgArr0-height; / faceImgArr 測(cè)試人臉的高 eigenVectArr=(IplImage*)cvAlloc(sizeof(IplImage*)*nEigens); / 分配個(gè)數(shù)為住特征值個(gè) 數(shù)/按照設(shè)定的特征值,從小到大,依次給主特征向量分配內(nèi)存空間(測(cè)試人臉框的大小,深 度,通道數(shù))for (i=0;idata.fl);/保存訓(xùn)練結(jié)果函數(shù)void storeTrainin
46、gData()CvFileStorage* fileStorage;int i;/create a file-storage interface cvOpenFileStorage :為讀寫數(shù)據(jù)打開文件存儲(chǔ)器 fileStorage=cvOpenFileStorage(facedata.xml,0,CV_STORAGE_WRITE);/ 存儲(chǔ)特征值,投影矩陣,平均矩陣等訓(xùn)練結(jié)果 cvWriteInt(fileStorage,nEigens,nEigens); 特征值數(shù)目 cvWriteInt(fileStorage,nTrainFaces,nTrainFaces); 訓(xùn)練圖像數(shù)目 cvWrit
47、e(fileStorage,trainPersonNumMat,personNumTruthMat,cvAttrList(0,0); 人臉圖像ID 號(hào) cvWrite(fileStorage,eigenV alMat,eigenValMat,cvAttrList(0,0); 特征值 cvWrite(fileStorage,projectedTrainFaceMat,projectedTrainFaceMat,cvAttrList(0,0); 訓(xùn) 練圖像的投影cvWrite(fileStorage,avgTrainImg,pAvgTrainImg,cvAttrList(0,0); 訓(xùn)練人臉數(shù)據(jù)的平均值for (i=0;inEigens;i+)char varname200;sprintf(varname,eigenVect_%d,i); / 把格式化的數(shù)據(jù)寫入 varname 中 /將目標(biāo)寫入文件存儲(chǔ)器中cvWrite(fileStorage,varname,eigenVectArri,cvAttrList(0,0);/release the file-storage interface cvReleaseFileStorage(&fileStorage);/加載訓(xùn)練數(shù)據(jù),與上面的void storeTrainingData() 對(duì)應(yīng),先保存然后加載, “載入已訓(xùn)練數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 裝飾管理合同模板
- 卷布訂貨合同模板
- 綠化種植施工合同模板
- 房屋代理協(xié)議合同模板
- 正規(guī)機(jī)械購銷合同模板
- 機(jī)封合同模板
- 租賃物資合同模板
- 非標(biāo)件合同模板
- 商店務(wù)工合同模板
- 冷庫承包使用合同模板
- 紙箱報(bào)價(jià)公式
- 第三節(jié)流水地貌2課件
- 全國(guó)常規(guī)免疫接種率監(jiān)測(cè)方案
- 地源熱泵機(jī)房調(diào)試方案 (1)
- 附表 電力服務(wù)(涉電維護(hù)、檢測(cè)等)收費(fèi)項(xiàng)目及標(biāo)準(zhǔn)
- 《礦山機(jī)械設(shè)備》復(fù)習(xí)題
- 焊接工藝設(shè)計(jì)方案
- 二手車舊機(jī)動(dòng)車評(píng)估圖文實(shí)例及交易注意事項(xiàng)珍貴教材PPT課件
- 管02酸洗、鈍化記錄
- 《內(nèi)科護(hù)理學(xué)》病例分析(完整版)
- 低壓有源濾波柜訂貨技術(shù)文件
評(píng)論
0/150
提交評(píng)論