版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Dragonboard410c的kinect应用系列之五——脸部识别实现代码之前的教程里,给大家讲过基于Dragonboard410c开发板搭建kinect应用实现自动跟随机器人,今天我们来讲讲实现人脸识别。一、核心代码://------------------------------------------------------------------------------////Copyright(c)MicrosoftCorporation.Allrightsreserved.////------------------------------------------------------------------------------//Definestheentrypointfortheapplication.//#include"stdafx.h"#include"SingleFace.h"#include"EggAvatar.h"#include#include"FTHelper.h"classSingleFace{public:SingleFace():m_hInst(NULL),m_hWnd(NULL),m_hAccelTable(NULL),m_pImageBuffer(NULL),m_pVideoBuffer(NULL),m_depthType(NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX),m_colorType(NUI_IMAGE_TYPE_COLOR),m_depthRes(NUI_IMAGE_RESOLUTION_320x240),m_colorRes(NUI_IMAGE_RESOLUTION_640x480),m_bNearMode(TRUE),m_bSeatedSkeletonMode(FALSE){}intRun(HINSTANCEhInst,PWSTRlpCmdLine,intnCmdShow);protected:BOOLInitInstance(HINSTANCEhInst,PWSTRlpCmdLine,intnCmdShow);voidParseCmdString(PWSTRlpCmdLine);voidUninitInstance();ATOMRegisterClass(PCWSTRszWindowClass);staticLRESULTCALLBACKWndProcStatic(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam);LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam);staticINT_PTRCALLBACKAbout(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam);BOOLPaintWindow(HDChdc,HWNDhWnd);BOOLShowVideo(HDChdc,intwidth,intheight,intoriginX,intoriginY);BOOLShowEggAvatar(HDChdc,intwidth,intheight,intoriginX,intoriginY);staticvoidFTHelperCallingBack(LPVOIDlpParam);staticintconstMaxLoadStringChars=100;HINSTANCEm_hInst;HWNDm_hWnd;HACCELm_hAccelTable;EggAvatarm_eggavatar;FTHelperm_FTHelper;IFTImage*m_pImageBuffer;IFTImage*m_pVideoBuffer;NUI_IMAGE_TYPEm_depthType;NUI_IMAGE_TYPEm_colorType;NUI_IMAGE_RESOLUTIONm_depthRes;NUI_IMAGE_RESOLUTIONm_colorRes;BOOLm_bNearMode;BOOLm_bSeatedSkeletonMode;};//RuntheSingleFaceSingleFace::Run(HINSTANCEhInst,PWSTRlpCmdLine,intnCmdShow){MSGmsg={static_cast<HWND>(0),static_cast<UINT>(0),static_cast<WPARAM>(-1)};if(InitInstance(hInst,lpCmdLine,nCmdShow)){//Mainmessageloop:while(GetMessage(&msg,NULL,0,0)){if(!TranslateAccelerator(msg.hwnd,m_hAccelTable,&msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}}UninitInstance();return(int)msg.wParam;}//Inthisfunction,wesavetheinstancehandle,thencreateanddisplaythemainprogramwindow.BOOLSingleFace::InitInstance(HINSTANCEhInstance,PWSTRlpCmdLine,intnCmdShow){m_hInst=hInstance;//StoreinstancehandleinourglobalvariableParseCmdString(lpCmdLine);WCHARszTitle[MaxLoadStringChars];//ThetitlebartextLoadString(m_hInst,IDS_APP_TITLE,szTitle,ARRAYSIZE(szTitle));staticconstPCWSTRRES_MAP[]={L"80x60",L"320x240",L"640x480",L"1280x960"};staticconstPCWSTRIMG_MAP[]={L"PLAYERID",L"RGB",L"YUV",L"YUV_RAW",L"DEPTH"};//AddmodeparamsintitleWCHARszTitleComplete[MAX_PATH];swprintf_s(szTitleComplete,L"%s--Depth:%s:%sColor:%s:%sNearMode:%s,SeatedSkeleton:%s",szTitle,IMG_MAP[m_depthType],(m_depthRes<0)?L"ERROR":RES_MAP[m_depthRes],IMG_MAP[m_colorType],(m_colorRes<0)?L"ERROR":RES_MAP[m_colorRes],m_bNearMode?L"ON":L"OFF",m_bSeatedSkeletonMode?L"ON":L"OFF");WCHARszWindowClass[MaxLoadStringChars];//themainwindowclassnameLoadString(m_hInst,IDC_SINGLEFACE,szWindowClass,ARRAYSIZE(szWindowClass));RegisterClass(szWindowClass);m_hAccelTable=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_SINGLEFACE));m_pImageBuffer=FTCreateImage();m_pVideoBuffer=FTCreateImage();m_hWnd=CreateWindow(szWindowClass,szTitleComplete,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,m_hInst,this);if(!m_hWnd){returnFALSE;}ShowWindow(m_hWnd,nCmdShow);UpdateWindow(m_hWnd);returnSUCCEEDED(m_FTHelper.Init(m_hWnd,FTHelperCallingBack,this,m_depthType,m_depthRes,m_bNearMode,TRUE,//ifnearmodedoesn'twork,fallbacktodefaultmodem_colorType,m_colorRes,m_bSeatedSkeletonMode));}voidSingleFace::UninitInstance(){//CleanupthememoryallocatedforFaceTrackingandrendering.m_FTHelper.Stop();if(m_hAccelTable){DestroyAcceleratorTable(m_hAccelTable);m_hAccelTable=NULL;}DestroyWindow(m_hWnd);m_hWnd=NULL;if(m_pImageBuffer){m_pImageBuffer->Release();m_pImageBuffer=NULL;}if(m_pVideoBuffer){m_pVideoBuffer->Release();m_pVideoBuffer=NULL;}}//Registerthewindowclass.ATOMSingleFace::RegisterClass(PCWSTRszWindowClass){WNDCLASSEXwcex={0};wcex.cbSize=sizeof(WNDCLASSEX);wcex.style=CS_HREDRAW|CS_VREDRAW;wcex.lpfnWndProc=&SingleFace::WndProcStatic;wcex.cbClsExtra=0;wcex.cbWndExtra=0;wcex.hInstance=m_hInst;wcex.hIcon=LoadIcon(m_hInst,MAKEINTRESOURCE(IDI_SINGLEFACE));wcex.hCursor=LoadCursor(NULL,IDC_ARROW);wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName=MAKEINTRESOURCE(IDC_SINGLEFACE);wcex.lpszClassName=szWindowClass;returnRegisterClassEx(&wcex);}LRESULTCALLBACKSingleFace::WndProcStatic(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){staticSingleFace*pThis=NULL;//cheating,butsincethereisjustonewindownow,itwillsuffice.if(WM_CREATE==message){pThis=reinterpret_cast<SingleFace*>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams);}returnpThis?pThis->WndProc(hWnd,message,wParam,lParam):DefWindowProc(hWnd,message,wParam,lParam);}//FUNCTION:WndProc(HWND,UINT,WPARAM,LPARAM)////PURPOSE:Processesmessagesforthemainwindow.////WM_COMMAND-processtheapplicationmenu//WM_KEYUP-ExitinresponsetoESCkey//WM_PAINT-Paintthemainwindow//WM_DESTROY-postaquitmessageandreturnLRESULTCALLBACKSingleFace::WndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){UINTwmId,wmEvent;PAINTSTRUCTps;HDChdc;switch(message){caseWM_COMMAND:wmId=LOWORD(wParam);wmEvent=HIWORD(wParam);//Parsethemenuselections:switch(wmId){caseIDM_ABOUT:DialogBox(m_hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About);break;caseIDM_EXIT:PostQuitMessage(0);break;default:returnDefWindowProc(hWnd,message,wParam,lParam);}break;caseWM_KEYUP:if(wParam==VK_ESCAPE){PostQuitMessage(0);}break;caseWM_PAINT:hdc=BeginPaint(hWnd,&ps);//DrawtheavatarwindowandthevideowindowPaintWindow(hdc,hWnd);EndPaint(hWnd,&ps);break;caseWM_DESTROY:PostQuitMessage(0);break;default:returnDefWindowProc(hWnd,message,wParam,lParam);}return0;}//Messagehandlerforaboutbox.INT_PTRCALLBACKSingleFace::About(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam){UNREFERENCED_PARAMETER(lParam);switch(message){caseWM_INITDIALOG:return(INT_PTR)TRUE;caseWM_COMMAND:if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL){EndDialog(hDlg,LOWORD(wParam));return(INT_PTR)TRUE;}break;}return(INT_PTR)FALSE;}//DrawingthevideowindowBOOLSingleFace::ShowVideo(HDChdc,intwidth,intheight,intoriginX,intoriginY){BOOLret=TRUE;//Now,copyafractionofthecameraimageintothescreen.IFTImage*colorImage=m_FTHelper.GetColorImage();if(colorImage){intiWidth=colorImage->GetWidth();intiHeight=colorImage->GetHeight();if(iWidth>0&&iHeight>0){intiTop=0;intiBottom=iHeight;intiLeft=0;intiRight=iWidth;//Keepaseparatebuffer.if(m_pVideoBuffer&&SUCCEEDED(m_pVideoBuffer->Allocate(iWidth,iHeight,FTIMAGEFORMAT_UINT8_B8G8R8A8))){//CopydothevideobufferwhileconvertingbytescolorImage->CopyTo(m_pVideoBuffer,NULL,0,0);//Computethebestapproximatecopyratio.floatw1=(float)iHeight*(float)width;floatw2=(float)iWidth*(float)height;if(w2>w1&&height>0){//videoimagetoowidefloatwx=w1/height;iLeft=(int)max(0,m_FTHelper.GetXCenterFace()-wx/2);iRight=iLeft+(int)wx;if(iRight>iWidth){iRight=iWidth;iLeft=iRight-(int)wx;}}elseif(w1>w2&&width>0){//videoimagetoonarrowfloathy=w2/width;iTop=(int)max(0,m_FTHelper.GetYCenterFace()-hy/2);iBottom=iTop+(int)hy;if(iBottom>iHeight){iBottom=iHeight;iTop=iBottom-(int)hy;}}intconstbmpPixSize=m_pVideoBuffer->GetBytesPerPixel();SetStretchBltMode(hdc,HALFTONE);BITMAPINFObmi={sizeof(BITMAPINFO),iWidth,iHeight,1,static_cast<WORD>(bmpPixSize*CHAR_BIT),BI_RGB,m_pVideoBuffer->GetStride()*iHeight,5000,5000,0,0};if(0==StretchDIBits(hdc,originX,originY,width,height,iLeft,iBottom,iRight-iLeft,iTop-iBottom,m_pVideoBuffer->GetBuffer(),&bmi,DIB_RGB_COLORS,SRCCOPY)){ret=FALSE;}}}}returnret;}//DrawingcodeBOOLSingleFace::ShowEggAvatar(HDChdc,intwidth,intheight,intoriginX,intoriginY){staticinterrCount=0;BOOLret=FALSE;if(m_pImageBuffer&&SUCCEEDED(m_pImageBuffer->Allocate(width,height,FTIMAGEFORMAT_UINT8_B8G8R8A8))){memset(m_pImageBuffer->GetBuffer(),0,m_pImageBuffer->GetStride()*height);//cleartoblackm_eggavatar.SetScaleAndTranslationToWindow(height,width);m_eggavatar.DrawImage(m_pImageBuffer);BITMAPINFObmi={sizeof(BITMAPINFO),width,height,1,static_cast<WORD>(m_pImageBuffer->GetBytesPerPixel()*CHAR_BIT),BI_RGB,m_pImageBuffer->GetStride()*height,5000,5000,0,0};errCount+=(0==StretchDIBits(hdc,0,0,width,height,0,0,width,height,m_pImageBuffer->GetBuffer(),&bmi,DIB_RGB_COLORS,SRCCOPY));ret=TRUE;}returnret;}//Drawtheeggheadandthecameravideowiththemasksuperimposed.BOOLSingleFace::PaintWindow(HDChdc,HWNDhWnd){staticinterrCount=0;BOOLret=FALSE;RECTrect;GetClientRect(hWnd,&rect);intwidth=rect.right-rect.left;intheight=rect.bottom-rect.top;inthalfWidth=width/2;//ShowthevideoontherightofthewindowerrCount+=!ShowVideo(hdc,width-halfWidth,height,halfWidth,0);//DrawtheeggavatarontheleftofthewindowerrCount+=!ShowEggAvatar(hdc,halfWidth,height,0,0);returnret;}/**The"FaceTracker"helperclassisgeneric.Itwillcallbackthisfunction*afterafacehasbeensuccessfullytracked.Thecodeinthecallbackpassestheparameters*totheEggAvatar,soitcanbeanimated.*/voidSingleFace::FTHelperCallingBack(PVOIDpVoid){SingleFace*pApp=reinterpret_cast<SingleFace*>(pVoid);if(pApp){IFTResult*pResult=pApp->m_FTHelper.GetResult();if(pResult&&SUCCEEDED(pResult->GetStatus())){FLOAT*pAU=NULL;UINTnumAU;pResult->GetAUCoefficients(&pAU,&numAU);pApp->m_eggavatar.SetCandideAU(pAU,numAU);FLOATscale;FLOATrotationXYZ[3];FLOATtranslationXYZ[3];pResult->Get3DPose(&scale,rotationXYZ,translationXYZ);pApp->m_eggavatar.SetTranslations(translationXYZ[0],translationXYZ[1],translationXYZ[2]);pApp->m_eggavatar.SetRotations(rotationXYZ[0],rotationXYZ[1],rotationXYZ[2]);}}}voidSingleFace::ParseCmdString(PWSTRlpCmdLine){constWCHARKEY_DEPTH[]=L"-Depth";constWCHARKEY_COLOR[]=L"-Color";constWCHARKEY_NEAR_MODE[]=L"-NearMode";constWCHARKEY_DEFAULT_DISTANCE_MODE[]=L"-DefaultDistanceMode";constWCHARKEY_SEATED_SKELETON_MODE[]=L"-SeatedSkeleton";constWCHARSTR_NUI_IMAGE_TYPE_DEPTH[]=L"DEPTH";constWCHARSTR_NUI_IMAGE_TYPE_DEPTH_AND_PLAYER_INDEX[]=L"PLAYERID";constWCHARSTR_NUI_IMAGE_TYPE_COLOR[]=L"RGB";constWCHARSTR_NUI_IMAGE_TYPE_COLOR_YUV[]=L"YUV";constWCHARSTR_NUI_IMAGE_RESOLUTION_80x60[]=L"80x60";constWCHARSTR_NUI_IMAGE_RESOLUTION_320x240[]=L"320x240";constWCHARSTR_NUI_IMAGE_RESOLUTION_640x480[]=L"640x480";constWCHARSTR_NUI_IMAGE_RESOLUTION_1280x960[]=L"1280x960";enumTOKEN_ENUM{TOKEN_ERROR,TOKEN_DEPTH,TOKEN_COLOR,TOKEN_NEARMODE,TOKEN_DEFAULTDISTANCEMODE,TOKEN_SEATEDSKELETON};intargc=0;LPWSTR*argv=CommandLineToArgvW(lpCmdLine,&argc);for(inti=0;i<argc;i++){NUI_IMAGE_TYPE*pType=NULL;NUI_IMAGE_RESOLUTION*pRes=NULL;TOKEN_ENUMtokenType=TOKEN_ERROR;PWCHARcontext=NULL;PWCHARtoken=wcstok_s(argv[i],L":",&context);if(0==wcsncmp(token,KEY_DEPTH,ARRAYSIZE(KEY_DEPTH))){tokenType=TOKEN_DEPTH;pType=&m_depthType;pRes=&m_depthRes;}elseif(0==wcsncmp(token,KEY_COLOR,ARRAYSIZE(KEY_COLOR))){tokenType=TOKEN_COLOR;pType=&m_colorType;pRes=&m_colorRes;}elseif(0==wcsncmp(token,KEY_NEAR_MODE,ARRAYSIZE(KEY_NEAR_MODE))){tokenType=TOKEN_NEARMODE;m_bNearMode=TRUE;}elseif(0==wcsncmp(token,KEY_DEFAULT_DISTANCE_MODE,ARRAYSIZE(KEY_DEFAULT_DISTANCE_MODE))){tokenType=TOKEN_DEFAULTDISTANCEMODE;m_bNearMode=FALSE;}elseif(0==wcsncmp(token,KEY_SEATED_SKELETON_MODE,ARRAYSIZE(KEY_SEATED_SKELETON_MODE))){tokenType=TOKEN_SEATEDSKELETON;m_bSeatedSkeletonMode=TRUE;}if(tokenType==TOKEN_DEPTH||tokenType==TOKEN_COLOR){_ASSERT(pType!=NULL&&pRes!=NULL);while((token=wcstok_s(NULL,L":",&context))!=NULL){if(0==wcsncmp(token,STR_NUI_IMAGE_TYPE_DEPTH,ARRAYSIZE(STR_NUI_IMAGE_TYPE_DEPTH))){*pType=NUI_IMAGE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中道德与法治课程中培养学生公民素养的教学策略研究教学研究课题报告
- 2025年能源行业可再生能源创新技术与市场前景报告
- 手指再植术后并发症预防与处理
- 人工智能在教育评价中的应用:学生个性化学习效果评估与智能教学优化教学研究课题报告
- 辽宁省丹东市东港市2025-2026学年八年级上学期期末考试道德与法治试卷(含答案)
- 吉林省吉林市蛟河市2025-2026学年七年级上学期1月期末道德与法治试卷(含答案)
- 2025年老年健康产业服务模式创新行业报告
- 2025年城市绿色建筑发展创新报告
- 2026年能源行业氢燃料电池技术报告
- 2026年职业健康培训服务评估协议
- 2025年广东省第一次普通高中学业水平合格性考试(春季高考)数学试题(含答案详解)
- 朗读艺术入门学习通超星课后章节答案期末考试题库2023年
- 世界贸易组织的法律框架与组织结构
- ESPEN指南外科手术中的临床营养
- 2001广东高考标准分和原始分换算表
- 卡乐康包衣学校培训资料专家讲座
- GB/T 6075.6-2002在非旋转部件上测量和评价机器的机械振动第6部分:功率大于100kW的往复式机器
- 天津市南开中学2022-2023学年高三上学期第三次月考(1月期末考)语文试题 Word版含答案
- 考研考博-英语-上海海事大学考试押题三合一+答案详解4
- 绿色装配式施工方案
- CMA全套文件(质量手册+程序文件+作业指导书+表格)
评论
0/150
提交评论