实例介绍
【实例截图】
【核心代码】
// HumanDetView.cpp : implementation of the CHumanDetView class // #include "stdafx.h" #include "HumanDet.h" #include "math.h" #include "HumanDetDoc.h" #include "HumanDetView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CHumanDetView IMPLEMENT_DYNCREATE(CHumanDetView, CScrollView) BEGIN_MESSAGE_MAP(CHumanDetView, CScrollView) //{{AFX_MSG_MAP(CHumanDetView) ON_COMMAND(ID_FILE_OPEN, OnFileOpen) ON_WM_KEYDOWN() //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHumanDetView construction/destruction CHumanDetView::CHumanDetView() { // TODO: add construction code here image = 0; fnum = 0; fnames = 0; noPerson=0; m_nPersonNum=0; Img1 = 0; humanCircle.degree=0; humanCircle.r=0; humanCircle.x=0; humanCircle.y=0; //region1 SReg1.x1= 60; SReg1.x2= 175; SReg1.y1 = 0; SReg1.y2 = 55; //region2 SReg2.x1= 60; SReg2.x2= 175; SReg2.y1 = 55; SReg2.y2 = 110; //region3 SReg3.x1= 60; SReg3.x2= 175; SReg3.y1 = 110; SReg3.y2 = 150; } CHumanDetView::~CHumanDetView() { if( image ) delete image; if( fnames ) delete fnames; if( Img1 ) delete Img1; } BOOL CHumanDetView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CScrollView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CHumanDetView drawing void CHumanDetView::OnDraw(CDC* pDC) { CHumanDetDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here if( image == 0 ) return; int i, j; BYTE gray; BYTE g; CString str; for( i=0; i<height; i ) { for( j=0; j<width; j ) { //original image gray = image[i*width j]; pDC->SetPixel( j, i, RGB(gray,gray,gray)); //processed image g = Img1[i*width j]; pDC->SetPixel( j width 10, i, RGB(g,g,g)); } } // indicate the position of head if a human is detected if( humanCircle.degree>3&&m_nRegFlag==1) pDC->TextOut( humanCircle.x 60 width 10, humanCircle.y, "x"); if( humanCircle.degree>2&&m_nRegFlag==2) pDC->TextOut( humanCircle.x 60 width 10, humanCircle.y, "x"); if( humanCircle.degree>2&&m_nRegFlag==3) pDC->TextOut( humanCircle.x 60 width 10, humanCircle.y, "x"); str.Format("PersonNumber=%d",m_nPersonNum); pDC->TextOut(width 10,height 10,str); } void CHumanDetView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); CSize sizeTotal; // TODO: calculate the total size of this view if( image !=0 ) { sizeTotal.cx = width; sizeTotal.cy = height; } else { sizeTotal.cx = 100; sizeTotal.cy = 100; } SetScrollSizes(MM_TEXT, sizeTotal);} ///////////////////////////////////////////////////////////////////////////// // CHumanDetView printing BOOL CHumanDetView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CHumanDetView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CHumanDetView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CHumanDetView diagnostics #ifdef _DEBUG void CHumanDetView::AssertValid() const { CScrollView::AssertValid(); } void CHumanDetView::Dump(CDumpContext& dc) const { CScrollView::Dump(dc); } CHumanDetDoc* CHumanDetView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHumanDetDoc))); return (CHumanDetDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CHumanDetView message handlers void CHumanDetView::OnFileOpen() { // TODO: Add your command handler code here CFileDialog MyFDlg(TRUE, NULL,NULL, OFN_HIDEREADONLY, NULL,NULL ); MyFDlg.m_ofn.lpstrFilter = "(*.lst;*.raw)\0*.lst;*.raw\0"; MyFDlg.m_ofn.lpstrInitialDir = "D:\\Huang\\Teaching\\ImagePro\\Programs\\5_HumanDet"; if( MyFDlg.DoModal() == IDOK ) { CString SFName; SFName = MyFDlg.GetPathName( ); //full name with path char *fnstr; fnstr = SFName.GetBuffer(4); //read the name from string FILE *fpLst; int n; int len; len = strlen( fnstr ); if( !strcmp( fnstr len-3, "raw" ) ) //raw image { fnum = 0; char *ptr; ptr = fnstr len-3; while( *ptr != '\\') ptr--; *ptr = 0; strcpy( directory, fnstr);//Directory fnames = new char[500]; strcpy( fnames, ptr 1); //image name } else //list file { fpLst = fopen( fnstr, "rb"); fscanf( fpLst, "%3d", &fnum); fscanf( fpLst, "%s", directory);//directory fnames = new char[fnum*100]; for( n=0; n<fnum; n ) fscanf( fpLst, "%s", fnames n*100);// image names fclose(fpLst); } findex = 0; readImg( findex); } } void CHumanDetView::readImg( int findex) { char fullName[120]; sprintf( fullName, "%s\\%s", directory, fnames findex*100); FILE *fpImg; fpImg = fopen( fullName, "rb"); if( fpImg==0 ) { AfxMessageBox( "Cannot open the list file", MB_OK, 0 ); return; } CString sFTitle; sFTitle.Format( "%s", fnames findex*100 ); CHumanDetDoc* pDoc; pDoc = GetDocument(); pDoc->SetTitle( sFTitle ); fread( &width, sizeof(int), 1, fpImg); fread( &height, sizeof(int), 1, fpImg); if( image ) delete image; image = new BYTE[width*height]; fread( image, sizeof(BYTE), width*height, fpImg); fclose(fpImg); if( Img1 ) delete Img1; Img1 = new BYTE[width*height]; // cut region 1 BYTE *rImg, *pImg; Rw = SReg1.x2 - SReg1.x1; Rh = SReg1.y2 - SReg1.y1; rImg = new BYTE[Rw*Rh]; pImg = new BYTE[Rw*Rh]; int i, j; for( i=SReg1.y1; i<SReg1.y2; i ) for( j=SReg1.x1; j<SReg1.x2; j ) rImg[(i-SReg1.y1)*Rw j-SReg1.x1] = image[i*width j]; //binarize and dilation myPro.Process1( rImg, Rw, Rh, pImg); //detection humanCircle = myDet.detect1( pImg, Rw, Rh ); //for display memcpy( Img1, image, sizeof(BYTE)*width*height); if(humanCircle.degree>3) { m_nRegFlag=1; m_nPersonNum ; // for display for( i=SReg1.y1; i<SReg1.y2; i ) for( j=SReg1.x1; j<SReg1.x2; j ) Img1[i*width j] = pImg[(i-SReg1.y1)*Rw j-SReg1.x1]; delete rImg; delete pImg; } /////////////////detection in Region 2/////////////////////// else { if(rImg) delete rImg; if(pImg) delete pImg; Rw = SReg2.x2 - SReg2.x1; Rh = SReg2.y2 - SReg2.y1; rImg = new BYTE[Rw*Rh]; pImg = new BYTE[Rw*Rh]; for( i=SReg2.y1; i<SReg2.y2; i ) for( j=SReg2.x1; j<SReg2.x2; j ) rImg[(i-SReg2.y1)*Rw j-SReg2.x1] = image[i*width j]; BYTE *temp; temp=new BYTE[Rw*Rh]; smooth(rImg,Rw,Rh,temp); myPro.Process2( rImg, Rw, Rh, pImg); humanCircle = myDet.detect2( pImg, Rw, Rh ); if(humanCircle.degree>2) { m_nRegFlag=2; m_nPersonNum ; for( i=SReg2.y1; i<SReg2.y2; i ) for( j=SReg2.x1; j<SReg2.x2; j ) Img1[i*width j] = pImg[(i-SReg2.y1)*Rw j-SReg2.x1]; delete pImg; delete temp; delete rImg; } else { m_nRegFlag=3; if(rImg) delete rImg; if(pImg) delete pImg; Rw = SReg3.x2 - SReg3.x1; Rh = SReg3.y2 - SReg3.y1; rImg = new BYTE[Rw*Rh]; pImg = new BYTE[Rw*Rh]; for( i=SReg3.y1; i<SReg3.y2; i ) for( j=SReg3.x1; j<SReg3.x2; j ) rImg[(i-SReg3.y1)*Rw j-SReg3.x1] = image[i*width j]; BYTE *temp; temp=new BYTE[Rw*Rh]; smooth(rImg,Rw,Rh,temp); myPro.Process3( temp, Rw, Rh, pImg); humanCircle = myDet.detect3( pImg, Rw, Rh ); for( i=SReg3.y1; i<SReg3.y2; i ) for( j=SReg3.x1; j<SReg3.x2; j ) Img1[i*width j] = pImg[(i-SReg3.y1)*Rw j-SReg3.x1]; if(humanCircle.degree>2) { m_nPersonNum ; delete pImg; delete temp; delete rImg; } } } //////////////////////////////////////////////////////////////// OnInitialUpdate(); CRect ClientRect; GetClientRect( &ClientRect ); InvalidateRect( &ClientRect ); } void CHumanDetView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default if( nChar == VK_NEXT) { if( findex < fnum ) { findex ; readImg( findex ); } } if( nChar == VK_PRIOR ) { if( findex > 0 ) { findex--; readImg( findex ); } } CScrollView::OnKeyDown(nChar, nRepCnt, nFlags); } void CHumanDetView::tranByte( int*temp, BYTE* array, int w, int h) { int dim; dim = w*h; double stm,stvar; stm = 120; stvar = 60; int i; double mean = 0; for( i=10000; i<dim; i ) mean = temp[i]; mean /= dim; // mean value double varia = 0; double diff; for( i=0; i<dim; i ) { diff = temp[i]-mean; varia = diff*diff; } varia /= dim; // varianve if( varia<0.0001 ) return; double ratio; ratio = stvar/sqrt( varia ); BYTE value; for( i=0; i<dim; i ) { value = (BYTE)( (temp[i]-mean)*ratio stm ); if( value >= 200 ) array[i] = 200; else if( value < 80 ) array[i] = 80; else array[i] = value; } /*int dim; dim = w*h; double stm,stvar; stm = 120; stvar = 60; int i; double mean = 0; for( i=0; i<dim; i ) mean = temp[i]; mean /= dim; // mean value double varia = 0; double diff; for( i=0; i<dim; i ) { diff = temp[i]-mean; varia = diff*diff; } varia /= dim; // varianve if( varia<0.0001 ) return; double ratio; ratio = stvar/sqrt( varia ); BYTE value; for( i=0; i<dim; i ) { value = (BYTE)( (temp[i]-mean)*ratio stm ); if( value >= 250 ) array[i] = 250; else if( value < 80 ) array[i] = 80; else array[i] = value; }*/ } void CHumanDetView::smooth(BYTE*window, int wid, int hei, BYTE*temp) { int i,j,m,n; int value; BYTE block[9]; int Gaus[9]; Gaus[0]=1; Gaus[1]=1; Gaus[2]=1; Gaus[3]=1; Gaus[4]=1; Gaus[5]=1; Gaus[6]=1; Gaus[7]=1; Gaus[8]=1; for(i=0;i<hei;i ) for(j=0;j<wid;j ) { if(i==0||j==0||i==hei-1||j==wid-1) temp[i*wid j]=0; else { for(m=-1;m<2;m ) for(n=-1;n<2;n ) block[(m 1)*3 n 1]=window[(i m)*wid n j]; value=convolution(Gaus,block); value=(int)(value/9.); temp[i*wid j]=(BYTE)value; } } } void CHumanDetView::sobol( BYTE*window, int wid, int hei, int *sob_x,int *sob_y) { int so_x[9],so_y[9]; so_x[0]=-1; so_x[1]=0; so_x[2]=1; so_x[3]=-2; so_x[4]=0; so_x[5]=2; so_x[6]=-1; so_x[7]=0; so_x[8]=1; so_y[0]=-1; so_y[1]=-2; so_y[2]=-1; so_y[3]=0; so_y[4]=0; so_y[5]=0; so_y[6]=1; so_y[7]=2; so_y[8]=1; BYTE block[9]; int i,j,m,n; int value; for(i=0;i<hei;i ) for(j=0;j<wid;j ) { if(i>hei-3||j>wid-3) { sob_x[i*hei j]=0; sob_y[i*hei j]=0; } else { for(m=0;m<3;m ) for(n=0;n<3;n ) block[m*3 n]=window[(i m)*wid j n]; value=convolution(so_x, block); sob_x[i*hei j]=value; value=convolution(so_y, block); sob_y[i*hei j]=value; } } } int CHumanDetView::convolution( int *sobel, BYTE*block) { int value=0; int m,n; for(m=0;m<3;m ) for(n=0;n<3;n ) value =sobel[m*3 n]*block[m*3 n]; return value; }
标签:
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论