詳細設計說明書TeamPal軟件工程項目信息化平臺_第1頁
詳細設計說明書TeamPal軟件工程項目信息化平臺_第2頁
詳細設計說明書TeamPal軟件工程項目信息化平臺_第3頁
詳細設計說明書TeamPal軟件工程項目信息化平臺_第4頁
詳細設計說明書TeamPal軟件工程項目信息化平臺_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1引言21.1編寫目的21.2背景22程序系統(tǒng)的結構23、設計說明33.1程序描述33.2功能33.3性能43.4輸入項43.5輸出項43.6主要算法43.7流程邏輯183.8接口183.9限制條件183.10測試計劃183.11尚未解決的問題18詳細設計說明書1引言1.1編寫目的項目詳細設計計劃1.2背景各小組成員開始工作后將會以詳細設計為基礎設計各個負責模塊的內容。首先,按要求定制軟件的基本需求,再次根據(jù)需求繪制出軟件的開發(fā)甘特圖,然后根據(jù)組員的狀況分配任務并按時舉行例會討論項目進展與進度。最后,需要撰寫相關的測試用例檢驗產品的容錯性及其他特性,提交產品。2程序系統(tǒng)的結構系統(tǒng)流程圖:系統(tǒng)各

2、流程詳細實現(xiàn)功能:3、設計說明3.1程序描述這部分主要用來處理獲取的視頻圖像,因為幀圖像本身的數(shù)據(jù)量太大,所以無法被高效高速的被3D系統(tǒng)識別,所以需要對圖像進行處理,進而得到簡單的實時數(shù)據(jù)(大概不超過10個),這樣可以保證數(shù)據(jù)的實時性與準確性。這些數(shù)據(jù)是傳輸給3D部分,使其得到相應的實時數(shù)據(jù)參數(shù),從而可以操作3D模型動畫與2D視頻聯(lián)動。3.2功能1、(視頻輸入)2、(相應的算法以及opencv庫函數(shù)調用)3、(得到處理后的畫面與感興趣的參數(shù))4、(參數(shù)傳遞并輸出3D實時性渲染動畫)3.3性能性能的好壞基于圖像處理所獲得的參數(shù),有時會依賴于外界環(huán)境,有時因為機器原因或者硬件或者其他原因導致系能不

3、夠穩(wěn)定,我們會及時在未來的更新中把他完善。3.4輸入項2D視頻輸入3.5輸出項2D圖像處理后的相關參數(shù)3.6主要算法人臉定位本項目中人臉定位的方法主要采用的是角點檢測的方法。先提取每一幀圖像中人臉上的眼睛、嘴的角點。眼睛和嘴的位置是按照大部分人臉上的尺寸來確定的。角點目前為止還沒有明確的數(shù)學定義。角點可以是兩條線的交叉處,也可以是位于相鄰的兩個主要方向不同的事物上的點。一般的角點檢測都是對有具體定義的、或者是能夠具體檢測出來的興趣點的檢測。這意味著興趣點可以是角點,也可以是在某些屬性上強度最大或者最小的孤立點、線段的終點,或者是曲線上局部曲率最大的點。在實踐中,通常大部分稱為角點檢測的方法檢測

4、的都是興趣點,而不是獨有的角點。因此,如果只要檢測角點的話,需要對檢測出來的興趣點進行局部檢測,以確定出哪些是真正的角點。在本項目中,我們對臉部進行區(qū)域劃分,劃分出一些比較感興趣的區(qū)域,比如將雙眼所在的區(qū)域劃分出來,以及嘴所在的區(qū)域劃分出來,然后再對相應感興趣的區(qū)域進行角點檢測。分別取眼部角點橫縱坐標的平均值,再取嘴部角點橫縱坐標的平均值,兩者去平均即可得到一個參考點,我們所做的動作,都是基于這個參考點來選取的。角點檢測的代碼如下:int FindCornerPot(int n) IplImage* imgRGB = cvCreateImage(sz,IPL_DEPTH_8U,1); IplI

5、mage* imgRGB2 = cvCreateImage(sz,IPL_DEPTH_8U,1); int w=thd_dst2->width; int h=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); const int MAX_CORNERS = 20;/estimate a corner number CvPoint

6、2D32f cornersMAX_CORNERS = 0;/ coordinates of corners /CvPoint2D32f* corners = new CvPoint2D32f MAX_CORNERS ; /another method of declaring an array int corner_count = MAX_CORNERS; double quality_level = 0.1;/threshold for the eigenvalues double min_distance = 5;/minimum distance between two corners

7、int eig_block_size = 3;/window size int use_harris = false;/use 'harris method' or not int r=2; /rectangle size int lineWidth=1; / rectangle line width if(n=0|n=1) /-initial guess by cvGoodFeaturesToTrack- cvGoodFeaturesToTrack(thd_dst2,eig_image, / output temp_image,corners,&corner_coun

8、t,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), cvPoint(cornersi.x+r,cornersi.y+r), cvScalar(255,0,0),lineWidth); */ int half_win_size=3;

9、/the window size will be 3+1+3=7 int iteration=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

10、 features_found MAX_CORNERS ; float feature_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_COR

11、NERS ; cvCalcOpticalFlowPyrLK( 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 ); if(n=2) corner_count2=corner_count1; /-initial guess by cvGoodFe

12、aturesToTrack- cvGoodFeaturesToTrack(thd_dst2,eig_image, / output temp_image,corners,&corner_count1,quality_level,min_distance,NULL,eig_block_size,use_harris); /-draw good feature corners on the original RGB image- int half_win_size=3;/the window size will be 3+1+3=7 int iteration=20; double epi

13、slon=0.1; cvFindCornerSubPix( thd_dst2, corners, 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 ; float feature_errors MAX_CORNE

14、RS ; 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 ; cvCalcOpticalFlowPyrLK( thd_dst2, thd_dst22, pyrA, py

15、rB, corners, cornersB, corner_count1, cvSize(half_win_size,half_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, /

16、output temp_image,corners,&corner_count3,quality_level,min_distance,NULL,eig_block_size,use_harris); /-draw good feature corners on the original RGB image- int half_win_size=3;/the window size will be 3+1+3=7 int iteration=20; double epislon=0.1; cvFindCornerSubPix( thd_dst2, corners, corner_cou

17、nt3, 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 ; float feature_errors MAX_CORNERS ; CvSize pyr_sz = cvSize ( thd_dst2->width,thd_dst22-

18、>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 ; cvCalcOpticalFlowPyrLK( thd_dst2, thd_dst22, pyrA, pyrB, corners, cornersB, corner_count3, cvSize(half_win_size,

19、half_win_size), 5, features_found, feature_errors, cvTermCriteria( CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3 ), 0 ); / /-draw subpix corners on another original RGB image- if(corner_count!=0) if(n=0) for (int i=0;i<corner_count;i+) /*cvRectangle(thd_dst2, cvPoint(cornersi.x-r,cornersi.y-r), cvPo

20、int(cornersi.x+r,cornersi.y+r), cvScalar(0,0,255),lineWidth);*/ coredot1.x=coredot1.x+cornersi.x; coredot1.y=coredot1.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,

21、 p1, CV_RGB(255,0,0), 2 ); coredot1.x=coredot1.x/corner_count; coredot1.y=coredot1.y/corner_count; corners19=corners19; cvRectangle(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 corner co

22、ut<<"x="<<corners2.x; cout<<",y="<<corners2.y<<endl; cvNamedWindow("cvFindCorner0", CV_WINDOW_AUTOSIZE ); cvShowImage( "cvFindCorner0", thd_dst2 ); if(n=1) for (int i=0;i<corner_count;i+) /*cvRectangle(thd_dst2, cvPoint(corners

23、i.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=coredot2.y+cornersi.y; /CvPoint p0 = cvPoint( cvRound( cornersi.x ), cvRound( cornersi.y ) ); /CvPoint p1 = cvPoint( cvRound( cornersBi.x ), cvRound( cornersBi.y ) );

24、 /cvLine( thd_dst222, p0, p1, CV_RGB(255,0,0), 2 ); coredot2.x=coredot2.x/corner_count; coredot2.y=coredot2.y/corner_count; cvRectangle(thd_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 corne

25、r cout<<"x="<<corners2.x; cout<<",y="<<corners2.y<<endl;cvNamedWindow("cvFindCorner1", CV_WINDOW_AUTOSIZE ); cvShowImage( "cvFindCorner1", thd_dst2 ); /cvNamedWindow("FLOW VECTORS", CV_WINDOW_AUTOSIZE ); /cvShowImage( &q

26、uot;FLOW VECTORS", thd_dst222 ); /cvNamedWindow("cvGoodFeaturesToTrack", CV_WINDOW_AUTOSIZE ); /cvShowImage( "cvGoodFeaturesToTrack", imgRGB2 ); /char c=getchar(); return 0;識別與實時動畫之間的結合動作的識別與實時動畫的生成的完美結合是本項目的難點之一,如何定義表情、動作等參數(shù)的范圍,如何將識別與實時動畫生成的代碼結合,如何將識別的參數(shù)無損的傳遞給生成動畫的代碼都是需要考慮的

27、問題。以本項目中控制模型搖頭這一個簡單的特征為例,在識別代碼中所獲取的角度參數(shù)存儲在參數(shù)angle.y中,然后將這個參數(shù)傳遞給實時動畫生成部分的代碼,在動畫生成部分的代碼中控制模型旋轉的參數(shù)是yrot,然后將yrot參數(shù)跟隨angle.y的參數(shù)而變化,從而控制模型的搖頭動畫。當然項目中需要傳遞的參數(shù)很多,因此也增加了項目的復雜度和這一模塊的難度。 三維表示搭建OpenGL程序窗口在Windows編程構建窗口過程的基礎上(設計窗口類->注冊窗口類->創(chuàng)建窗口->顯示及更新窗口->消息循環(huán))設計OpenGL窗口,需要設置著色描述表,將OpenGL連接到著色描述表中,著色描述

28、表會所有的OpenGL的調用命令連接到設備描述表中。因此還要創(chuàng)建設備描述表來繪制OpenGL窗口,設備描述表會將窗口連接到GDI(圖形設備接口)中。然后定義一些函數(shù)分別用來重置OpenGL場景大小,為透視圖設置屏幕,選擇和重置投影矩陣和模型觀察矩陣,初始化OpenGL場景,定義繪制函數(shù)和銷毀OpenGL窗口的函數(shù),創(chuàng)建OpenGL窗口。最后在主函數(shù)WinMain()中調用這些函數(shù)創(chuàng)建OpenGL窗口,并定義消息循環(huán)。繪制OpenGL的三維世界;給單調的OpenGL窗口增加色彩,繪制出整個三維的模擬世界,使用OpenGL的繪制函數(shù)實現(xiàn)。比如給整個場景添加一個天空和大地,用天空盒的方法實現(xiàn)。載入模

29、型載入MS3D的模型,一個完整的MS3D模型如圖所示:MS3D模型的數(shù)據(jù)結構如下:typedef unsigned char byte;typedef unsigned short word;/MS3D文件頭struct MS3DHeaderchar m_ID10;int 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;

30、word m_vertexIndices3;float m_vertexNormals33;float m_s3, m_t3;byte m_smoothingGroup;byte m_groupIndex; PACK_STRUCT;/MS3D材質信息struct MS3DMaterial char m_name32; float m_ambient4; float m_diffuse4; float m_specular4; float m_emissive4; float m_shininess;/ 0.0f - 128.0f float m_transparency;/ 0.0f - 1.

31、0f byte m_mode;/ 0, 1, 2 is unused now char m_texture128; char m_alphamap128; PACK_STRUCT;/MS3D連接點信息struct MS3DJointbyte m_flags;char m_name32;char m_parentName32;float m_rotation3;float m_translation3;word m_numRotationKeyframes;word m_numTranslationKeyframes; PACK_STRUCT;/MS3D關鍵幀數(shù)據(jù)struct MS3DKeyfr

32、amefloat m_time;float m_parameter3; PACK_STRUCT;最后通過loadModelData函數(shù)來載入模型,函數(shù)定義如下:bool MilkshapeModel:loadModelData( const char *filename )/以二進制的方式打開文件ifstream inputFile( filename, ios:in | ios:binary | ios:nocreate );if ( inputFile.fail()return false;/ 不能打開模型文件,返回失敗/返回文件大小inputFile.seekg( 0, ios:end

33、);long fileSize = inputFile.tellg();inputFile.seekg( 0, ios:beg );/分配一個內存,載入文件byte *pBuffer = new bytefileSize;inputFile.read( pBuffer, fileSize );inputFile.close();/讀取文件頭const byte *pPtr = pBuffer;MS3DHeader *pHeader = ( MS3DHeader* )pPtr;pPtr += sizeof( MS3DHeader );/如果不是一個有效的MS3D文件則返回if ( strncmp

34、( pHeader->m_ID, "MS3D000000", 10 ) != 0 )return false; /如果不能支持這種版本的文件,則返回失敗if ( pHeader->m_version < 3 | pHeader->m_version > 4 )return false; /讀取頂點數(shù)據(jù)int nVertices = *( word* )pPtr; m_numVertices = nVertices;m_pVertices = new VertexnVertices;pPtr += sizeof( word );int i;for

35、 ( i = 0; i < nVertices; i+ )MS3DVertex *pVertex = ( MS3DVertex* )pPtr;m_pVerticesi.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_pTriang

36、les = new TrianglenTriangles;pPtr += sizeof( word );for ( i = 0; i < nTriangles; i+ )MS3DTriangle *pTriangle = ( MS3DTriangle* )pPtr;int vertexIndices3 = pTriangle->m_vertexIndices0, pTriangle->m_vertexIndices1, pTriangle->m_vertexIndices2 ;float t3 = 1.0f-pTriangle->m_t0, 1.0f-pTrian

37、gle->m_t1, 1.0f-pTriangle->m_t2 ;memcpy( m_pTrianglesi.m_vertexNormals, pTriangle->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,

38、 sizeof( int )*3 );pPtr += sizeof( MS3DTriangle );/用來填充網(wǎng)格結構int nGroups = *( word* )pPtr;m_numMeshes = nGroups;m_pMeshes = new MeshnGroups;pPtr += sizeof( word );for ( i = 0; i < nGroups; i+ )pPtr += sizeof( byte );/ flagspPtr += 32;/ nameword 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_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論