版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1 引言21.1 編寫目的21.2 背景22 程序系統(tǒng)的結(jié)構(gòu)23、設(shè)計說明33.1 程序描述33.2 功能33.3 性能43.4 輸入項43.5 輸出項43.6 主要算法43.7 流程邏輯183.8 接口183.9 限制條件183.10 測試計劃183.11 尚未解決的問題181詳細設(shè)計說明書1 引言1.1 編寫目的項目詳細設(shè)計計劃1.2 背景各小組成員開始工作后將會以詳細設(shè)計為基礎(chǔ)設(shè)計各個負責模塊的內(nèi)容。首先,按要求定制軟件的基本需求,再次根據(jù)需求繪制出軟件的開發(fā)甘特圖,然后根據(jù)組員的狀況分配任務(wù)并按時舉行例會討論項目進展與進度。最后,需要撰寫相關(guān)的測試用例檢驗產(chǎn)品的容錯性及其他特性,提交產(chǎn)
2、品。2 程序系統(tǒng)的結(jié)構(gòu)系統(tǒng)流程圖:2系統(tǒng)各流程詳細實現(xiàn)功能:3、設(shè)計說明3.1 程序描述這部分主要用來處理獲取的視頻圖像,因為幀圖像本身的數(shù)據(jù)量太大,所以無法被高效高速的被3D 系統(tǒng)識別,所以需要對圖像進行處理,進而得到簡單的實時數(shù)據(jù)(大概不超過10 個),這樣可以保證數(shù)據(jù)的實時性與準確性。這些數(shù)據(jù)是傳輸給 3D 部分,使其得到相應(yīng)的實時數(shù)據(jù)參數(shù),從而可以操作3D 模型動畫與 2D 視頻聯(lián)動。3.2 功能1、(視頻輸入) 2、(相應(yīng)的算法以及opencv 庫函數(shù)調(diào)用) 3、(得到處理后3的畫面與感興趣的參數(shù))4、(參數(shù)傳遞并輸出3D 實時性渲染動畫)3.3 性能性能的好壞基于圖像處理所獲得的參
3、數(shù),有時會依賴于外界環(huán)境,有時因為機器原因或者硬件或者其他原因?qū)е孪的懿粔蚍€(wěn)定,我們會及時在未來的更新中把他完善。3.4 輸入項2D 視頻輸入3.5 輸出項2D 圖像處理后的相關(guān)參數(shù)3.6 主要算法人臉定位本項目中人臉定位的方法主要采用的是角點檢測的方法。 先提取每一幀圖像中人臉上的眼睛、 嘴的角點。眼睛和嘴的位置是按照大部分人臉上的尺寸來確定的。角點目前為止還沒有明確的數(shù)學定義。角點可以是兩條線的交叉處,也可以是位于相鄰的兩個主要方向不同的事物上的點。一般的角點檢測都是對有具體定義的、或者是能夠具體檢測出來的興趣點的檢測。這意味著興趣點可以是角點,也可以是在某些屬性上強度最大或者最小的孤立點
4、、線段的終點,或者是曲線上局部曲率最大的點。在實踐中,通常大部分稱為角點檢測的方法檢測的都是興趣點,而不是獨有的角點。因此,如果只要檢測角點的話,需要對檢測出來的興趣點進行局部檢測,以確定出哪些是真正的角點。在本項目中,我們對臉部進行區(qū)域劃分,劃分出一些比較感興趣的區(qū)域,比如將雙眼所在的區(qū)域劃分出來,以及嘴所在的區(qū)域劃分出來,然后再對相應(yīng)感興趣的區(qū)域進行角點檢測。4分別取眼部角點橫縱坐標的平均值,再取嘴部角點橫縱坐標的平均值,兩者去平均即可得到一個參考點,我們所做的動作,都是基于這個參考點來選取的。角點檢測的代碼如下:intFindCornerPot(intn)IplImage* imgRGB
5、 = cvCreateImage(sz,IPL_DEPTH_8U,1); IplImage* imgRGB2 = cvCreateImage(sz,IPL_DEPTH_8U,1);intw=thd_dst2->width;inth=thd_dst2->height;IplImage* eig_image = cvCreateImage(cvSize(w, h),IPL_DEPTH_32F, 1); IplImage* temp_image = cvCreateImage(cvSize(w, h),IPL_DEPTH_32F, 1);constintMAX_CORNERS = 20;
6、/estimate a corner numberCvPoint2D32f cornersMAX_CORNERS = 0;/ coordinates of corners/CvPoint2D32f* corners = new CvPoint2D32f MAX_CORNERS ; /another method ofdeclaring an arrayintcorner_count = MAX_CORNERS;doublequality_level = 0.1;/threshold for the eigenvaluesdoublemin_distance = 5;/minimum dista
7、nce between two cornersinteig_block_size = 3;/window sizeintuse_harris =false; /use 'harris method' or notintr=2; /rectangle sizeintlineWidth=1;/ rectangle line widthif (n=0|n=1)/-initial guess by cvGoodFeaturesToTrack-cvGoodFeaturesToTrack(thd_dst2,eig_image,/ outputtemp_image,corners,&
8、corner_count,quality_level,min_distance,NULL,eig_block_size,use_harris);/-draw good feature corners on the original RGB image-/*for (int i=0;i<corner_count;i+)cvRectangle(imgRGB2, cvPoint(cornersi.x-r,cornersi.y-r),5cvPoint(cornersi.x+r,cornersi.y+r),cvScalar(255,0,0),lineWidth);*/inthalf_win_siz
9、e=3;/the window size will be 3+1+3=7intiteration=20;double epislon=0.1;cvFindCornerSubPix(thd_dst2,corners,corner_count,cvSize(half_win_size,half_win_size),cvSize(-1,-1), /no ignoring the neighbours of the center corner cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,iteration,epislon);/char feature
10、s_found MAX_CORNERS ;floatfeature_errors MAX_CORNERS ;CvSize pyr_sz = cvSize ( thd_dst2->width,thd_dst22->height );IplImage* pyrA = cvCreateImage( pyr_sz, IPL_DEPTH_32F,1 );IplImage* pyrB = cvCreateImage( pyr_sz, IPL_DEPTH_32F,1 );CvPoint2D32f* cornersB =new CvPoint2D32f MAX_CORNERS ;cvCalcOpt
11、icalFlowPyrLK(thd_dst2,thd_dst22,pyrA,pyrB,corners,cornersB,corner_count,cvSize(half_win_size,half_win_size),5,features_found,feature_errors,cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3 ),0);6if (n=2)corner_count2=corner_count1;/-initial guess by cvGoodFeaturesToTrack-cvGoodFeaturesToT
12、rack(thd_dst2,eig_image,/ outputtemp_image,corners,&corner_count1,quality_level,min_distance,NULL,eig_block_size,use_harris);/-draw good feature corners on the original RGB image-inthalf_win_size=3;/the window size will be 3+1+3=7intiteration=20;double epislon=0.1;cvFindCornerSubPix(thd_dst2,cor
13、ners,corner_count1,cvSize(half_win_size,half_win_size),cvSize(-1,-1), /no ignoring the neighbours of the center corner cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,iteration,epislon);/char features_found MAX_CORNERS ;floatfeature_errors MAX_CORNERS ;CvSize pyr_sz = cvSize ( thd_dst2->width,thd
14、_dst22->height );IplImage* pyrA = cvCreateImage( pyr_sz, IPL_DEPTH_32F,1 );IplImage* pyrB = cvCreateImage( pyr_sz, IPL_DEPTH_32F,1 );CvPoint2D32f* cornersB =new CvPoint2D32f MAX_CORNERS ;7cvCalcOpticalFlowPyrLK(thd_dst2,thd_dst22,pyrA,pyrB,corners,cornersB,corner_count1,cvSize(half_win_size,half_
15、win_size),5,features_found,feature_errors,cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3 ),0);if (n=3)corner_count4=corner_count3;/-initial guess by cvGoodFeaturesToTrack-cvGoodFeaturesToTrack(thd_dst2,eig_image,/ outputtemp_image,corners,&corner_count3,quality_level,min_distance,NUL
16、L,eig_block_size,use_harris);/-draw good feature corners on the original RGB image-inthalf_win_size=3;/the window size will be 3+1+3=7intiteration=20;double epislon=0.1;cvFindCornerSubPix(thd_dst2,corners,corner_count3,cvSize(half_win_size,half_win_size),cvSize(-1,-1), /no ignoring the neighbours of
17、 the center corner cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,iteration,epislon)8);/char features_found MAX_CORNERS ;floatfeature_errors MAX_CORNERS ;CvSize pyr_sz = cvSize ( thd_dst2->width,thd_dst22->height );IplImage* pyrA = cvCreateImage( pyr_sz, IPL_DEPTH_32F,1 );IplImage* pyrB = cvC
18、reateImage( pyr_sz, IPL_DEPTH_32F,1 );CvPoint2D32f* cornersB =new CvPoint2D32f MAX_CORNERS ;cvCalcOpticalFlowPyrLK(thd_dst2,thd_dst22,pyrA,pyrB,corners,cornersB,corner_count3,cvSize(half_win_size,half_win_size),5,features_found,feature_errors,cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .
19、3 ),0);/-draw subpix corners on another original RGB image-if (corner_count!=0)if (n=0)for( inti=0;i<corner_count;i+)/*cvRectangle(thd_dst2, cvPoint(cornersi.x-r,cornersi.y-r),9cvPoint(cornersi.x+r,cornersi.y+r),cvScalar(0,0,255),lineWidth);*/coredot1.x=coredot1.x+cornersi.x;coredot1.y=coredot1.y
20、+cornersi.y;/CvPoint p0 = cvPoint( cvRound( cornersi.x ),cvRound( cornersi.y ) );/CvPoint p1 = cvPoint( cvRound( cornersBi.x ), cvRound( cornersBi.y ) );/cvLine( thd_dst222, p0, p1, CV_RGB(255,0,0), 2 );coredot1.x=coredot1.x/corner_count;coredot1.y=coredot1.y/corner_count;corners19=corners19;cvRecta
21、ngle(thd_dst2, cvPoint(coredot1.x-3*r,coredot1.y-3*r), cvPoint(coredot1.x+3*r,coredot1.y+3*r), cvScalar(0,0,255),lineWidth);/to display a coordinate of the third cornercout<<"x=" <<corners2.x;cout<<",y=" <<corners2.y<<endl;cvNamedWindow( "cvFind
22、Corner0" , CV_WINDOW_AUTOSIZE ); cvShowImage( "cvFindCorner0" , thd_dst2 );if (n=1)for( inti=0;i<corner_count;i+)/*cvRectangle(thd_dst2, cvPoint(cornersi.x-r,cornersi.y-r),cvPoint(cornersi.x+r,cornersi.y+r),cvScalar(0,0,255),lineWidth);*/coredot2.x=coredot2.x+cornersi.x;coredot2.y=
23、coredot2.y+cornersi.y;/CvPoint p0 = cvPoint( cvRound( cornersi.x ),cvRound( cornersi.y ) );/CvPoint p1 = cvPoint( cvRound( cornersBi.x ), cvRound( cornersBi.y ) );/cvLine( thd_dst222, p0, p1, CV_RGB(255,0,0), 2 );10coredot2.x=coredot2.x/corner_count;coredot2.y=coredot2.y/corner_count;cvRectangle(thd
24、_dst2, cvPoint(coredot2.x-3*r,coredot2.y-3*r), cvPoint(coredot2.x+3*r,coredot2.y+3*r), cvScalar(0,0,255),lineWidth);/to display a coordinate of the third cornercout<<"x=" <<corners2.x;cout<<",y=" <<corners2.y<<endl;cvNamedWindow("cvFindCorner1&q
25、uot;,CV_WINDOW_AUTOSIZE );cvShowImage("cvFindCorner1", thd_dst2 );/cvNamedWindow("FLOW VECTORS", CV_WINDOW_AUTOSIZE ); /cvShowImage( "FLOW VECTORS", thd_dst222 ); /cvNamedWindow("cvGoodFeaturesToTrack", CV_WINDOW_AUTOSIZE ); /cvShowImage( "cvGoodFeaturesT
26、oTrack", imgRGB2 );/char c=getchar();return0;識別與實時動畫之間的結(jié)合動作的識別與實時動畫的生成的完美結(jié)合是本項目的難點之一, 如何定義表情、動作等參數(shù)的范圍, 如何將識別與實時動畫生成的代碼結(jié)合, 如何將識別的參數(shù)無損的傳遞給生成動畫的代碼都是需要考慮的問題。 以本項目中控制模型搖頭這一個簡單的特征為例, 在識別代碼中所獲取的角度參數(shù)存儲在參數(shù) angle.y 中,然后將這個參數(shù)傳遞給實時動畫生成部分的代碼, 在動畫生成部分的代碼中控制模型旋轉(zhuǎn)的參數(shù)是 yrot ,然后將 yrot 參數(shù)跟隨 angle.y 的參數(shù)而變化,從而控制模型的搖
27、頭動畫。 當然項目中需要傳遞的參數(shù)很多, 因此也增加了項目的復(fù)雜度和這一模塊的難度。11三維表示搭建 OpenGL 程序窗口在 Windows 編程構(gòu)建窗口過程的基礎(chǔ)上 (設(shè)計窗口類 ->注冊窗口類 ->創(chuàng)建窗口 ->顯示及更新窗口 ->消息循環(huán))設(shè)計 OpenGL 窗口,需要設(shè)置著色描述表,將OpenGL 連接到著色描述表中, 著色描述表會所有的 OpenGL 的調(diào)用命令連接到設(shè)備描述表中。 因此還要創(chuàng)建設(shè)備描述表來繪制 OpenGL 窗口,設(shè)備描述表會將窗口連接到 GDI(圖形設(shè)備接口)中。然后定義一些函數(shù)分別用來重置 OpenGL 場景大小,為透視圖設(shè)置屏幕,選擇
28、和重置投影矩陣和模型觀察矩陣,初始化 OpenGL 場景,定義繪制函數(shù)和銷毀 OpenGL 窗口的函數(shù),創(chuàng)建 OpenGL 窗口。最后在主函數(shù) WinMain() 中調(diào)用這些函數(shù)創(chuàng)建 OpenGL 窗口,并定義消息循環(huán)。繪制 OpenGL 的三維世界;給單調(diào)的 OpenGL 窗口增加色彩,繪制出整個三維的模擬世界, 使用 OpenGL 的繪制函數(shù)實現(xiàn)。比如給整個場景添加一個天空和大地,用天空盒的方法實現(xiàn)。載入模型載入 MS3D 的模型,一個完整的MS3D 模型如圖所示:MS3D 模型的數(shù)據(jù)結(jié)構(gòu)如下:typedef unsigned char byte;typedef unsigned shor
29、t word;/MS3D 文件頭struct MS3DHeaderchar m_ID10;12int m_version; PACK_STRUCT;/MS3D 頂點信息struct MS3DVertexbyte m_flags;float m_vertex3;char m_boneID;byte m_refCount; PACK_STRUCT;/MS3D 三角形信息struct MS3DTriangleword m_flags;word m_vertexIndices3;float m_vertexNormals33;float m_s3, m_t3;byte m_smoothingGroup
30、;byte m_groupIndex; PACK_STRUCT;/MS3D 材質(zhì)信息struct MS3DMaterialchar m_name32;float m_ambient4;float m_diffuse4;float m_specular4;float m_emissive4;float m_shininess;/ 0.0f - 128.0ffloat m_transparency;/ 0.0f - 1.0fbyte m_mode;/ 0, 1, 2 is unused nowchar m_texture128;char m_alphamap128; PACK_STRUCT;/MS
31、3D 連接點信息struct MS3DJointbyte m_flags;char m_name32;char m_parentName32;13float m_rotation3;float m_translation3;word m_numRotationKeyframes;word m_numTranslationKeyframes; PACK_STRUCT;/MS3D 關(guān)鍵幀數(shù)據(jù)struct MS3DKeyframefloat m_time;float m_parameter3; PACK_STRUCT;最后通過 loadModelData 函數(shù)來載入模型,函數(shù)定義如下:bool Mi
32、lkshapeModel:loadModelData( const char *filename )/以二進制的方式打開文件ifstream inputFile( filename, ios:in | ios:binary | ios:nocreate );if ( inputFile.fail()return false;/ 不能打開模型文件,返回失敗/返回文件大小inputFile.seekg( 0, ios:end );long fileSize = inputFile.tellg();inputFile.seekg( 0, ios:beg );/分配一個內(nèi)存,載入文件byte *pBu
33、ffer = new bytefileSize;inputFile.read( pBuffer, fileSize );inputFile.close();/讀取文件頭const byte *pPtr = pBuffer;MS3DHeader *pHeader = ( MS3DHeader* )pPtr;pPtr += sizeof( MS3DHeader );/如果不是一個有效的MS3D 文件則返回if ( strncmp( pHeader->m_ID, "MS3D000000", 10 ) != 0 )return false;/如果不能支持這種版本的文件,則返回
34、失敗if ( pHeader->m_version < 3 | pHeader->m_version > 4 )return false;/讀取頂點數(shù)據(jù)14int nVertices = *( word* )pPtr;m_numVertices = nVertices;m_pVertices = new VertexnVertices;pPtr += sizeof( word );int i;for ( i = 0; i < nVertices; i+ )MS3DVertex *pVertex = ( MS3DVertex* )pPtr;m_pVerticesi.
35、m_boneID = pVertex->m_boneID;memcpy( m_pVerticesi.m_location, pVertex->m_vertex, sizeof( float )*3 ); pPtr += sizeof( MS3DVertex );/讀取三角形信息int nTriangles = *( word* )pPtr;m_numTriangles = nTriangles;m_pTriangles = new TrianglenTriangles;pPtr += sizeof( word );for ( i = 0; i < nTriangles; i+
36、 )MS3DTriangle *pTriangle = ( MS3DTriangle* )pPtr;int vertexIndices3 = pTriangle->m_vertexIndices0, pTriangle->m_vertexIndices1, pTriangle->m_vertexIndices2 ;float t3 = 1.0f-pTriangle->m_t0, 1.0f-pTriangle->m_t1, 1.0f-pTriangle->m_t2 ;memcpy( m_pTrianglesi.m_vertexNormals, pTriangl
37、e->m_vertexNormals, sizeof( float )*3*3 );memcpy( m_pTrianglesi.m_s, pTriangle->m_s, sizeof( float )*3 ); memcpy( m_pTrianglesi.m_t, t, sizeof( float )*3 );memcpy( m_pTrianglesi.m_vertexIndices, vertexIndices, sizeof( int )*3 ); pPtr += sizeof( MS3DTriangle );/用來填充網(wǎng)格結(jié)構(gòu)int nGroups = *( word* )p
38、Ptr;m_numMeshes = nGroups;m_pMeshes = new MeshnGroups;pPtr += sizeof( word );for ( i = 0; i < nGroups; i+ )pPtr += sizeof( byte );/ flagspPtr += 32;/ name15word nTriangles = *( word* )pPtr;pPtr += sizeof( word );int *pTriangleIndices = new intnTriangles;for ( int j = 0; j < nTriangles; j+ )pTriangleIndicesj = *( word* )pPtr;pPtr += sizeof( word );char materialIndex = *( char* )pPtr;pPtr += sizeof( char );m_pMeshesi.m_materialIndex = materialIndex;m_pMeshesi.m_numTriangles = nTriangles;m_pMeshesi.m_pTriangleI
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 初級會計實務(wù)-《初級會計實務(wù)》??荚嚲?54
- 基于干擾噪聲協(xié)方差矩陣重構(gòu)的穩(wěn)健波束形成算法研究
- 安全防范與電信詐騙應(yīng)對
- 現(xiàn)代農(nóng)業(yè)產(chǎn)業(yè)園發(fā)展與建設(shè)綜合方案
- 科創(chuàng)孵化器項目商業(yè)計劃書
- 光伏組件回收產(chǎn)業(yè)未來機遇與發(fā)展報告
- 文化傳媒行業(yè)編導培訓總結(jié)
- 2025版高端石材工程采購及售后服務(wù)合同協(xié)議3篇
- 二零二五年度個人汽車維修貸款合同范本4篇
- 二零二五年度公益廣告宣傳海報設(shè)計與制作合同3篇
- JJG 705-2014液相色譜儀行業(yè)標準
- 地雷基本知識課件
- 五年級上冊小數(shù)除法豎式計算練習200題及答案
- 人教版五年級上冊數(shù)學簡便計算大全500題及答案
- 創(chuàng)新創(chuàng)業(yè)教育課程體系
- 包裝品質(zhì)彩盒外箱知識課件
- 神經(jīng)外科課件:神經(jīng)外科急重癥
- 頸復(fù)康腰痛寧產(chǎn)品知識課件
- 2024年低壓電工證理論考試題庫及答案
- 《民航服務(wù)溝通技巧》教案第14課民航服務(wù)人員上行溝通的技巧
- MT/T 538-1996煤鉆桿
評論
0/150
提交評論