FaceDetectView.cpp
上传用户:sdsuchuang
上传日期:2013-01-12
资源大小:2228k
文件大小:80k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. // FaceDetectView.cpp : implementation of the CFaceDetectView class
  2. //
  3. #include "stdafx.h"
  4. #include "FaceDetect.h"
  5. #include "DIB.h"
  6. #include "FaceDetectDoc.h"
  7. #include "FaceDetectView.h"
  8. #include "STUDY_1.h"
  9. #include "Tishi.h"
  10. #include "GetStudyNum.h "
  11. #include "ShowPMessage.h"
  12. #include "XiuGai.h"
  13. #include "GetName.h"
  14. #include "Message.h"
  15. #include "shujuyanchi.h"
  16. #include "Meg.h"
  17. #include "DelectMessage.h"
  18. #include "FINDMESSAGE.h"
  19. #include "math.h"
  20. #define WIDTHBYTES(bits)  ((bits+31)/32*4)
  21. #ifdef _DEBUG
  22. #define new DEBUG_NEW
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #endif
  26. DIB gDib;
  27.  HANDLE hDIB;
  28.  HANDLE hDIB1;
  29. HANDLE hDIBTemp;
  30. HANDLE hDIBTemp1;
  31.  int gheight;
  32.  int gwidth;
  33.  WORD gwBytesPerLine;
  34.  static int v_left,v_top,v_bottom,v_right;
  35.  
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CFaceDetectView
  38. IMPLEMENT_DYNCREATE(CFaceDetectView, CView)
  39. BEGIN_MESSAGE_MAP(CFaceDetectView, CView)
  40. //{{AFX_MSG_MAP(CFaceDetectView)
  41. ON_COMMAND(ID_READY_LIGHTINGCONPENSATE, OnReadyLightingconpensate)
  42. ON_COMMAND(ID_READY_SCALE, OnReadyScale)
  43. ON_COMMAND(ID_READY_ContrastEnhance, OnREADYContrastEnhance)
  44. ON_COMMAND(ID_READY_ZFT, OnReadyZft)
  45. ON_COMMAND(ID_READY_WHITEBLACK, OnReadyWhiteblack)
  46. ON_COMMAND(ID_READY_BanishOnlyPoint, OnREADYBanishOnlyPoint)
  47. ON_COMMAND(ID_READY_Mediumvalue, OnREADYMediumvalue)
  48. ON_COMMAND(ID_READY_DilationFirst, OnREADYDilationFirst)
  49. ON_COMMAND(ID_READY_Decay, OnREADYDecay)
  50. ON_COMMAND(ID_READY_OutLine, OnREADYOutLine)
  51. ON_COMMAND(ID_READY_FixedPosition, OnREADYFixedPosition)
  52. ON_COMMAND(ID_PROCESSING_GetCharacteristicParameter, OnPROCESSINGGetCharacteristicParameter)
  53. ON_COMMAND(ID_PROSSING_detect, OnPROSSINGdetect)
  54. ON_COMMAND(AFX_ID_VIDIO, OnIdVidio)
  55. ON_COMMAND(ID_VIDIO_CANNEL, OnVidioCannel)
  56. ON_COMMAND(AFX_ID_PROSSING, OnIdProssing)
  57. ON_COMMAND(ID_READY_Template, OnREADYTemplate)
  58. ON_BN_CLICKED(IDOK_GetName, OnGetName)
  59. ON_COMMAND(ID_PROSSING_STUDY, OnProssingStudy)
  60. ON_COMMAND(ID_DETECTFACE, OnDetectface)
  61. ON_COMMAND(ID_STUDY_MENUITEM32798, OnStudyMenuitem32798)
  62. ON_COMMAND(ID_DATABASE_FIND, OnDatabaseFind)
  63. ON_COMMAND(ID_DATABASE_Delete, OnDATABASEDelete)
  64. ON_COMMAND(ID_MENUITEM32799, OnMenuitem32799)
  65. //}}AFX_MSG_MAP
  66. // Standard printing commands
  67. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  68. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  69. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  70. END_MESSAGE_MAP()
  71. /////////////////////////////////////////////////////////////////////////////
  72. // CFaceDetectView construction/destruction
  73. CFaceDetectView::CFaceDetectView()
  74. {
  75. // TODO: add construction code here
  76. Study=0;
  77. pname="temp";
  78. Picture=1;
  79. Picture1=1;
  80. flagP=false;
  81. lpRgb = NULL;
  82. lpYcc = NULL;
  83. faceNum = 0;
  84. for(int i=0; i<ImgRange; i++)
  85. for (int j=0; j<ImgRange; j++)
  86. {
  87. this->emymapc[i][j] = false;
  88. this->emymapl[i][j] = false;
  89. this->lab[i][j] = false;
  90. }
  91. this->result = false;
  92.        v_left=0;
  93.    v_top=0;
  94.        v_bottom=0;
  95.    v_right=0;
  96.    GetFlag=0;
  97.        FaceAere=false;
  98.    FaceLine=false;
  99.    FaceGray=false;
  100.    FaceGass=false;
  101.    FaceJunHeng=false;
  102.    FaceDbidu=false;
  103.    FaceTwo=false;
  104.    FaceGuLi=false;
  105.    FaceDingWei=false;
  106.    FaceTeZheng=false;
  107.    FaceShiBie=false;
  108. }
  109. CFaceDetectView::~CFaceDetectView()
  110. {
  111. }
  112. BOOL CFaceDetectView::PreCreateWindow(CREATESTRUCT& cs)
  113. {
  114. // TODO: Modify the Window class or styles here by modifying
  115. //  the CREATESTRUCT cs
  116. return CView::PreCreateWindow(cs);
  117. }
  118. /////////////////////////////////////////////////////////////////////////////
  119. // CFaceDetectView drawing
  120. void CFaceDetectView::OnDraw(CDC* pDC)
  121. {
  122. CFaceDetectDoc* pDoc = GetDocument();
  123. ASSERT_VALID(pDoc);
  124.    CPen NewPen1(PS_SOLID,2,RGB(255,0,0));
  125.  CPen *pOldPen=pDC->SelectObject(&NewPen1);
  126.    
  127. if(hDIB)
  128. {
  129.    
  130. gDib.PaintDIBTrue(pDC->GetSafeHdc(),CRect(500+100,10+50,gwidth+500+100,gheight+10+50),hDIB,CRect(0,0,gwidth,gheight),SRCCOPY);
  131.          
  132.  //dc.SetROP2(R2_NOTXORPEN);
  133.     
  134.  if(hDIB1)
  135.         gDib.PaintDIBTrue1(pDC->GetSafeHdc(),CRect(500+100-300-100+150,10+300+50,820+100-300-100+150,250+300+50),hDIB1,CRect(0,0,gwidth,gheight),SRCCOPY);
  136.     
  137. ///////////////////////////识别图象框///////////////////
  138.       int x1=10+100;
  139.   int y1=10+50;
  140.   int x2=320+10+100;
  141.   int y2=240+10+50;
  142.  pDC->MoveTo(x1-5,y1-5);
  143.  pDC->LineTo(x1-5,y2+5);
  144.  pDC->MoveTo(x1-5,y2+5);
  145.  pDC->LineTo(x2+5,y2+5);
  146.  pDC->MoveTo(x2+5,y2+5);
  147.  pDC->LineTo(x2+5,y1-5);
  148.  pDC->MoveTo(x2+5,y1-5);
  149.  pDC->LineTo(x1-5,y1-5);
  150.  pDC->TextOut(80,100,"摄");
  151.          pDC->TextOut(80,120,"像");
  152.  pDC->TextOut(80,140,"头");
  153.  
  154.  //dc.SetROP2(R2_NOTXORPEN);
  155. //////////////////////摄像头框////////////////////////
  156.    x1=500+100;
  157.    y1=10+50;
  158.    x2=820+100;
  159.    y2=250+50;
  160.  pDC->MoveTo(x1-5,y1-5);
  161.  pDC->LineTo(x1-5,y2+5);
  162.  pDC->MoveTo(x1-5,y2+5);
  163.  pDC->LineTo(x2+5,y2+5);
  164.  pDC->MoveTo(x2+5,y2+5);
  165.  pDC->LineTo(x2+5,y1-5);
  166.  pDC->MoveTo(x2+5,y1-5);
  167.  pDC->LineTo(x1-5,y1-5);
  168.          pDC->TextOut(80+490,100,"识");
  169.          pDC->TextOut(80+490,120,"别");
  170.  pDC->TextOut(80+490,140,"图");
  171.          pDC->TextOut(80+490,160,"像");
  172. /////////////////////////////////标准图象框/////////////////////////////////////
  173.  CPen NewPen2(PS_SOLID,2,RGB(0,255,0));
  174.  CPen *pOldPen2=pDC->SelectObject(&NewPen2);
  175.   x1=500+100-300-100+150;
  176.    y1=10+300+50;
  177.    x2=820+100-300-100+150;
  178.    y2=250+300+50;
  179.  pDC->MoveTo(x1-5,y1-5);
  180.  pDC->LineTo(x1-5,y2+5);
  181.  pDC->MoveTo(x1-5,y2+5);
  182.  pDC->LineTo(x2+5,y2+5);
  183.  pDC->MoveTo(x2+5,y2+5);
  184.  pDC->LineTo(x2+5,y1-5);
  185.  pDC->MoveTo(x2+5,y1-5);
  186.  pDC->LineTo(x1-5,y1-5);
  187.          pDC->TextOut(500+100-300-100-30+150,10+300+50+40,"标");
  188.          pDC->TextOut(500+100-300-100-30+150,10+300+50+40+20,"准");
  189.  pDC->TextOut(500+100-300-100-30+150,10+300+50+40+40,"图");
  190.  pDC->TextOut(500+100-300-100-30+150,10+300+50+60+40,"像");
  191. // TODO: add draw code for native data here
  192.          
  193. }
  194. /*
  195. void CFaceDetectView::OnInitialUpdate()
  196. {
  197.    CScrollView::OnInitialUpdate();
  198. CSize sizeTotal;
  199. //TODO: calculate the total size of this view
  200. sizeTotal.cx = sizeTotal.cy = 100;
  201. SetScrollSizes(MM_TEXT, sizeTotal);
  202. }
  203. */
  204. /////////////////////////////////////////////////////////////////////////////
  205. // CFaceDetectView printing
  206. void CFaceDetectView::DrawLine(int left,int top,int bottom ,int right)
  207. {
  208.        v_left=0;
  209.    v_top=0;
  210.        v_bottom=0;
  211.    v_right=0;
  212.    v_left=left;
  213.    v_top=bottom;                              
  214.        v_bottom=top;
  215.    v_right=right;
  216.        LPBYTE lpData;
  217.   long lOffset;
  218.   FaceAere=true;
  219.   lpData = gDib.FindDIBBits(hDIB);
  220.     WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  221.      for( int i=v_left; i<v_right; i++)
  222.  {
  223.               lOffset = gDib.PixelOffset( v_top,i, gwBytesPerLine);
  224.                 *(lpData + lOffset)=0;
  225.     *(lpData + lOffset+1)=0;
  226. *(lpData + lOffset+2)=255;
  227.              lOffset = gDib.PixelOffset( v_bottom,i, gwBytesPerLine);
  228.  *(lpData + lOffset)=0;
  229.   *(lpData + lOffset+1)=0;
  230.  *(lpData + lOffset+2)=255;
  231.  }
  232. for(int j=v_bottom; j<v_top; j++)
  233. {
  234.   lOffset = gDib.PixelOffset( j,v_left, gwBytesPerLine);
  235.           *(lpData + lOffset)=0;
  236.   *(lpData + lOffset+1)=0;
  237.   *(lpData + lOffset+2)=255;
  238.           lOffset = gDib.PixelOffset( j,v_right, gwBytesPerLine);
  239.   *(lpData + lOffset)=0;
  240.   *(lpData + lOffset+1)=0;
  241.   *(lpData + lOffset+2)=255;
  242. }
  243.  
  244. /* for(i=0;i<5;i++)
  245.      {  int H=((v_right-v_left)/5)*i+v_left;
  246.  for(j=v_bottom; j<v_top;  j++)
  247. {
  248.   lOffset = gDib.PixelOffset( j,H, gwBytesPerLine);
  249.           *(lpData + lOffset)=0;
  250.   *(lpData + lOffset+1)=0;
  251.   *(lpData + lOffset+2)=255;
  252.  }
  253.  }
  254.  
  255. for( i=v_left; i<v_right; i++)
  256.  {
  257.               lOffset = gDib.PixelOffset( (v_top+v_bottom)/2,i, gwBytesPerLine);
  258.                 *(lpData + lOffset)=0;
  259.     *(lpData + lOffset+1)=0;
  260. *(lpData + lOffset+2)=255;
  261.              
  262.  }
  263. for( i=v_bottom; i<v_top; i++)
  264.  {
  265.               lOffset = gDib.PixelOffset( i,(v_left+v_right)/2, gwBytesPerLine);
  266.                 *(lpData + lOffset)=0;
  267.     *(lpData + lOffset+1)=0;
  268. *(lpData + lOffset+2)=255;
  269.              
  270.  }
  271.   */
  272.  //////////////////////////////////////////////////////////////////////////////////////////////
  273.     //Invalidate();
  274. }
  275. BOOL CFaceDetectView::OnPreparePrinting(CPrintInfo* pInfo)
  276. {
  277. // default preparation
  278. return DoPreparePrinting(pInfo);
  279. }
  280. void CFaceDetectView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  281. {
  282. // TODO: add extra initialization before printing
  283. }
  284. void CFaceDetectView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  285. {
  286. // TODO: add cleanup after printing
  287. }
  288. /////////////////////////////////////////////////////////////////////////////
  289. // CFaceDetectView diagnostics
  290. #ifdef _DEBUG
  291. void CFaceDetectView::AssertValid() const
  292. {
  293. CView::AssertValid();
  294. }
  295. void CFaceDetectView::Dump(CDumpContext& dc) const
  296. {
  297. CView::Dump(dc);
  298. }
  299. CFaceDetectDoc* CFaceDetectView::GetDocument() // non-debug version is inline
  300. {
  301. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFaceDetectDoc)));
  302. return (CFaceDetectDoc*)m_pDocument;
  303. }
  304. #endif //_DEBUG
  305. /////////////////////////////////////////////////////////////////////////////
  306. // CFaceDetectView message handlers
  307. void CFaceDetectView::OnReadyLightingconpensate() 
  308. {
  309. // TODO: Add your command handler code here
  310. if(FaceAere)
  311. {
  312. ::AfxMessageBox("请确认脸部区域是否获取?");
  313. return ;
  314. }
  315. ReadyLightingconpensate2(); 
  316.     FaceLine=true;
  317. FaceAere=false;
  318. }
  319. void CFaceDetectView::ReadyLightingconpensate2() 
  320. {
  321. hDIBTemp = gDib.CopyHandle(hDIB);
  322. gDib.LightingCompensate(hDIB);
  323. GlobalUnlock(hDIB);
  324. Invalidate();
  325. }
  326. void CFaceDetectView::OnReadyScale() 
  327. {
  328. // TODO: Add your command handler code here
  329. if(!FaceLine)
  330. {
  331. ::AfxMessageBox("请确认是否进行补光处理?");
  332. return ;
  333. }
  334.     ReadyScale3();
  335. FaceGray=true;
  336.     FaceLine=false;
  337. }
  338. void CFaceDetectView::ReadyScale3() 
  339. {
  340. LPBYTE lpData;
  341. long lOffset;
  342. lpData = gDib.FindDIBBits(hDIB);
  343.     WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  344. unsigned ColorR,ColorG,ColorB,gray;
  345. Gray= new int*[v_top-v_bottom+1];
  346. int k;
  347. for( k=0;k<v_top-v_bottom+1;k++)
  348.      Gray[k]=new int [v_right-v_left+1];
  349.       int k1,i,j;
  350.   
  351. for(i=v_bottom,k=0; i<=v_top; i++,k++)
  352. {
  353. for(j=v_left,k1=0; j<=v_right; j++,k1++)
  354. {  
  355. lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
  356.            ColorB=*(lpData + lOffset);
  357.    ColorG=*(lpData + lOffset+1);
  358.    ColorR=*(lpData + lOffset+2);
  359.    gray = (ColorG*50+ColorR*39+ColorB*11)/100;
  360. //    *(lpData + lOffset)=gray ;
  361. //    *(lpData + lOffset+1)=gray ;
  362. //    *(lpData + lOffset+2)=gray ;
  363.     Gray[k][k1]=gray;
  364. }
  365. }
  366. ///////////////////////////////////////////////////////////////////////////
  367. /*
  368. int sumDCT=0;
  369. int Au,Av;
  370. int u,v,x,y;
  371. LPBITMAPINFOHEADER lpbi;
  372. lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
  373. gheight = lpbi->biHeight;
  374. gwidth = lpbi->biWidth;
  375. for(u=0; u<100; u++)
  376. for( v=0; v<100; v++)
  377. {
  378.        for(x=0; x<100; x++)
  379. for( y=0; y<10; y++)
  380. {  lOffset = gDib.PixelOffset(x, y, gwBytesPerLine);
  381.     
  382.     sumDCT=sumDCT+(*(lpData + lOffset))*cos((((2*x+1)*u*3.1415926))/((v_top-v_bottom+1)*2))*cos((((2*y+1)*v*3.1415926))/((v_left-v_right+1)*2));
  383. }
  384. if(u==0)
  385. Au=1/sqrt(v_top-v_bottom+1);
  386. else
  387. Au=sqrt(2/(v_top-v_bottom+1));
  388. if(v==0)
  389. Av=1/sqrt(v_right-v_left+1);
  390. else
  391. Av=sqrt(2/(v_right-v_left+1));
  392. // ::AfxMessageBox("只能对宽度和高度相等的图像进行方块编码!");
  393. sumDCT=Av*Au*sumDCT;
  394.  lOffset = gDib.PixelOffset(u, v, gwBytesPerLine);
  395.             *(lpData + lOffset)=sumDCT ;
  396.     *(lpData + lOffset+1)=sumDCT ;
  397.     *(lpData + lOffset+2)=sumDCT;
  398. }
  399. */
  400. //////////////////////////////////////////////////////////////////////////
  401.    Invalidate();
  402.   
  403. }
  404. //函数说明:该函数实现图像对比度增强的功能
  405. void CFaceDetectView::OnREADYContrastEnhance() 
  406. {
  407. // TODO: Add your command handler code here
  408. if(!FaceJunHeng)
  409. {
  410. ::AfxMessageBox("请确认是否进行直方图均衡?");
  411. return ;
  412. }
  413. READYContrastEnhance6();
  414.     FaceJunHeng=false;
  415. FaceDbidu=true;
  416. }
  417. void CFaceDetectView::READYContrastEnhance6()
  418. {
  419. LPBYTE lpData;
  420. long lOffset;
  421. lpData = gDib.FindDIBBits(hDIB);
  422.     WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  423. Icd= new int*[v_top-v_bottom+1];
  424. int k,i;
  425. for( k=0;k<v_top-v_bottom+1;k++)
  426.      Icd[k]=new int [v_right-v_left+1];
  427. for( i=v_bottom,k=0; i<=v_top; i++,k++)
  428. for(int j=v_left,k1=0; j<=v_right; j++,k1++)
  429. {
  430.            lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
  431.            int state=IncreaseContrast(ZFT[k][k1], 100);    
  432. //         *(lpData + lOffset)=state ;
  433. //    *(lpData + lOffset+1)=state ;
  434. //    *(lpData + lOffset+2)=state ;
  435.    Icd[k][k1]=state;
  436. }
  437.  
  438. Invalidate();
  439. }
  440. int  CFaceDetectView::IncreaseContrast(int pByte,int n)
  441. {
  442.   //根据参数n来调节对比度,n越大,对比越强烈
  443. int Low = n;
  444. int High = 255-n;
  445. float Grad = ((float)(High-Low))/255;
  446. //数据很小,设置为0
  447. if(pByte<=Low)
  448. return 0;
  449. //中间数据,进行对比增强处理
  450. else if ((Low<pByte)&&(pByte<High))
  451. return int(((pByte-Low)/Grad));
  452. //数据很大,设置为255
  453. else
  454. return  255;
  455. }
  456. //////////////////////均衡直方图/////////////////////////////////
  457. void CFaceDetectView::OnReadyZft() 
  458. {
  459. // TODO: Add your command handler code here
  460. if(!FaceGass)
  461. {
  462. ::AfxMessageBox("请确认是否进行高斯平滑?");
  463. return ;
  464. }
  465.     
  466. ReadyZft5();
  467. FaceGass=false;
  468.     FaceJunHeng=true;
  469. }
  470. void CFaceDetectView::ReadyZft5()
  471. {
  472. LPBYTE lpData;
  473. long lOffset;
  474. lpData = gDib.FindDIBBits(hDIB);
  475.     WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  476. int k,i;
  477. ZFT= new int*[v_top-v_bottom+1];
  478. for( k=0;k<v_top-v_bottom+1;k++)
  479.       ZFT[k]=new int [v_right-v_left+1];
  480.     int lCount[256];
  481. for(int t=0;t<256;t++)
  482. lCount[t]=0;
  483.     for(i=v_bottom,k=0; i<=v_top; i++,k++)
  484. for(int j=v_left,k1=0; j<=v_right; j++,k1++)
  485. {
  486.          lCount[Gray[k][k1]]++;
  487. }
  488. ///////////////////////////////////////////////////////////////////////
  489. // 计算灰度映射表
  490. int bMap[256],j;
  491. for (i = 0; i < 256; i++)
  492. {
  493. // 初始为0
  494. int lTemp = 0;
  495. for (j = 0; j <= i ; j++)
  496. {
  497. lTemp += lCount[j];
  498. }
  499. // 计算对应的新灰度值
  500. bMap[i] = (BYTE) (lTemp * 255 / (v_top-v_bottom+1) / (v_right-v_left+1));
  501. }
  502. //////////////////////////////////////////////////////////////////////
  503. for( i=v_bottom,k=0; i<=v_top; i++,k++)
  504. for(int j=v_left,k1=0; j<=v_right; j++,k1++)
  505. {
  506.            lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
  507.            int state=bMap[Gray[k][k1]];
  508. //           *(lpData + lOffset)=state ;
  509. //    *(lpData + lOffset+1)=state ;
  510. //    *(lpData + lOffset+2)=state ;
  511.    ZFT[k][k1]=state;
  512. }
  513.  
  514. Invalidate();
  515. }
  516. //////////////////////////二值化//////////////////////////////////////////
  517. /////////////////////////////////////////////////////////////////////////
  518. void CFaceDetectView::OnReadyWhiteblack() 
  519. {
  520. // TODO: Add your command handler code here
  521. if(!FaceDbidu)
  522. {
  523. ::AfxMessageBox("请确认是否进行对比度增强?");
  524. return ;
  525. }
  526.      ReadyWhiteblack7();
  527.  FaceDbidu=false;
  528.  FaceTwo=true;
  529. }
  530. void CFaceDetectView::ReadyWhiteblack7() 
  531. {
  532. LPBYTE lpData;
  533. long lOffset;
  534. lpData = gDib.FindDIBBits(hDIB);
  535.     WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  536. WhiteBlack= new int*[v_top-v_bottom+1];
  537. //////////////////////////////////////////////////////////////////////
  538.  
  539. int x,y;
  540. int n,k,k1;
  541. double Ut1,Ut2;
  542.  double Qt1;
  543.  double Qb;
  544.  double temp=0;
  545.  for(int t=100;t<256;t++)
  546.  {     int T_t=0; 
  547.        int B_t=0;
  548.        int Gsumn=0;
  549.    int Gsum=0;
  550.           for(y=v_bottom,k=0; y<=v_top; y++,k++)
  551.         for(x=v_left,k1=0; x<=v_right; x++,k1++)
  552. {
  553. lOffset = gDib.PixelOffset(y, x, gwBytesPerLine);
  554. if(Icd[k][k1]>=t)
  555. {
  556. T_t++;
  557.                         Gsum=Gsum+Icd[k][k1];
  558. }
  559. else
  560. {
  561. B_t++;
  562. Gsumn=Gsumn+Icd[k][k1];
  563. }
  564. }
  565. Qt1=double(T_t)/((v_top-v_bottom+1)*(v_right-v_left+1));
  566.                 Ut1=double(Gsum)/T_t;
  567. Ut2=double(Gsumn)/B_t;
  568.     Qb=Qt1*(1-Qt1)*(Ut1-Ut2)*(Ut1-Ut2);
  569.                 if(Qb>temp)
  570. {
  571. temp=Qb;
  572.                     n=t;
  573. }
  574.  }
  575. //////////////////////////////////////////////////////////////////////
  576. int i;
  577. for( k=0;k<v_top-v_bottom+1;k++)
  578.      WhiteBlack[k]=new int [v_right-v_left+1];
  579.      
  580. for( i=v_bottom,k=0; i<=v_top; i++,k++)
  581. for(int j=v_left,k1=0; j<=v_right; j++,k1++)
  582. {
  583.            lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
  584.            if(ZFT[k][k1]<n-60)
  585.    {
  586. //           *(lpData + lOffset)=0;
  587. //    *(lpData + lOffset+1)=0;
  588. //    *(lpData + lOffset+2)=0;
  589.    WhiteBlack[k][k1]=0;
  590.    }
  591.    else
  592.    {
  593. //    *(lpData + lOffset)=255;
  594. //    *(lpData + lOffset+1)=255;
  595. //    *(lpData + lOffset+2)=255;
  596.    WhiteBlack[k][k1]=255;
  597.    }
  598. }
  599.  
  600. Invalidate();
  601. }
  602. //////////////////////////去除孤立点////////////////////////////
  603. void CFaceDetectView::OnREADYBanishOnlyPoint() 
  604. {
  605. // TODO: Add your command handler code here
  606. if(!FaceTwo)
  607. {
  608. ::AfxMessageBox("请确认是否进行对比度增强?");
  609. return ;
  610. }
  611. LPBYTE lpData;
  612. long lOffset;
  613. lpData = gDib.FindDIBBits(hDIB);
  614.     WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  615.      int sum=0;
  616. for( int i=v_bottom+1,k=1; i<v_top; i++,k++)
  617. for(int j=v_left+1,k1=1; j<v_right; j++,k1++)
  618.        {
  619. //当前点的数值
  620. int num = WhiteBlack[k][k1];
  621. if (num !=255)//不是黑色
  622.          {
  623.          
  624.  ////////////////////判断右边////////////////////
  625.     
  626.             num = WhiteBlack[k][k1+1];
  627.             if (num !=255)//不是黑色
  628.                sum++;
  629. ///////////////////判断右下//////////////////
  630.     
  631.            num = WhiteBlack[k-1][k1+1];
  632.             if (num !=255)//不是黑色
  633.              sum++;
  634. ///////////////////判断右下//////////////////
  635.     
  636.            num = WhiteBlack[k-1][k1];
  637.             if (num !=255)//不是黑色
  638.             sum++;
  639. ///////////////////判断右偏左下//////////////////
  640.     
  641.            num = WhiteBlack[k-1][k1-1];
  642.             if (num !=255)//不是黑色
  643.              sum++;
  644.  ///////////////////判断左边//////////////////
  645.  
  646.      
  647.            num = WhiteBlack[k-1][k1];
  648.             if (num !=255)//不是黑色
  649.             sum++;
  650. ///////////////////判断左偏上边//////////////////
  651.  
  652.            num = WhiteBlack[k+1][k1-1];
  653.    if (num !=255)//不是黑色
  654.             sum++;
  655. ///////////////////判断左上//////////////////
  656.  
  657.            num = WhiteBlack[k+1][k1];
  658.             if (num !=255)//不是黑色
  659.              sum++; 
  660. ////////////////////判断是否为孤立点//////////////////////
  661.            if(sum<2)
  662.              {
  663.                lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
  664.               //*(lpData + lOffset++) = 255;
  665.   //*(lpData + lOffset++) = 255;
  666.   //*(lpData + lOffset++) = 255;
  667.  // WhiteBlack[k][k1]=255;
  668.              }
  669.            sum=0;
  670.          }
  671.         
  672.        }
  673. Invalidate();
  674.  FaceTwo=false; 
  675.  FaceGuLi=true;
  676. }
  677. //////////////////////////////////////////////////////////////////////
  678. //进行中值滤波
  679. void CFaceDetectView::OnREADYMediumvalue() 
  680. {
  681. // TODO: Add your command handler code here
  682. CFaceDetectDoc* pDoc = GetDocument();
  683. //进行中值滤波
  684.    MidFilter(3,3);
  685. Invalidate(TRUE);
  686. }
  687. void CFaceDetectView::MidFilter(int tem_w,int tem_h)
  688. {
  689. LPBYTE lpData;
  690. int m_Width;
  691. m_Width=v_right-v_left+1;
  692.     int m_Height;
  693. int lOffset;
  694. m_Height=v_top-v_bottom+1;
  695. BYTE *temp=(BYTE*)malloc(tem_w*tem_h*sizeof(BYTE));
  696. lpData = gDib.FindDIBBits(hDIB);
  697. WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  698.    for( int i=v_bottom; i<v_top; i++)
  699. {
  700. for(int j=v_left; j<v_right; j++)
  701.    {   
  702.           //将点(i,j)点作为模板的中心
  703.           for(int m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++)
  704.           {
  705.      for(int n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)
  706.  {
  707.              //将以点(i,j)为中心,与模板大小相同的范围内的象素传递到模板矩阵中
  708.   lOffset = gDib.PixelOffset(m, n, gwBytesPerLine);
  709.       temp[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)]=*(lpData + lOffset);
  710.  }
  711.           int mid;
  712.  //利用气泡法计算中值
  713.            for(m=0;m<tem_w*tem_h-1;m++)
  714.            {
  715.    
  716.       for(n=0;n<tem_w*tem_h-m-1;n++)
  717.  
  718.     if(temp[n]>temp[n+1]) 
  719.                 {
  720.     mid=temp[n];
  721.                 temp[n]=temp[n+1];
  722.     temp[n+1]=mid;
  723.   }
  724.    
  725.    } 
  726.            //将计算的结果放到新的位图的相应位置
  727.        lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
  728.               *(lpData + lOffset++) = temp[(tem_w*tem_h-1)/2];
  729.   *(lpData + lOffset++) = temp[(tem_w*tem_h-1)/2];
  730.   *(lpData + lOffset++) = temp[(tem_w*tem_h-1)/2];
  731.       
  732.  }
  733.    }
  734. }
  735. }
  736. void CFaceDetectView::OnREADYDilationFirst() 
  737. {
  738. // TODO: Add your command handler code here
  739. gDib.Dilation(hDIB,v_top,v_bottom,v_left,v_right);
  740. gDib.Dilation(hDIB,v_top,v_bottom,v_left,v_right);
  741. Invalidate();
  742. }
  743. void CFaceDetectView::OnREADYDecay() 
  744. {
  745. // TODO: Add your command handler code here
  746.     gDib.Erasion(hDIB,v_top,v_bottom,v_left,v_right);
  747. gDib.Erasion(hDIB,v_top,v_bottom,v_left,v_right);
  748. gDib.Erasion(hDIB,v_top,v_bottom,v_left,v_right);
  749. Invalidate();
  750. }
  751. void CFaceDetectView::OnREADYOutLine() 
  752. {
  753.     LPBYTE lpData;
  754. lpData = gDib.FindDIBBits(hDIB);
  755. WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  756.   
  757. //循环变量
  758.      int  i;
  759.       int j;
  760. unsigned char n,e,s,w,ne,se,nw,sw;
  761.    
  762.        
  763. //当前点的数值
  764. int k,k1;
  765. for(  i=v_bottom+1,k=1; i<v_top; i++,k++)
  766. {
  767. for( j=v_left+1,k1=1; j<v_right; j++,k1++)
  768. {
  769. int pixel = Icd[k][k1];
  770. if(pixel == 0)
  771. {
  772. nw = Icd[k][k1-1];
  773. n  = Icd[k+1][k1-1];
  774. ne = Icd[k+1][k1];
  775. w = Icd[k+1][k1+1];
  776. e = Icd[k][k1+1];
  777. sw =Icd[k-1][k1+1];
  778. s  = Icd[k-1][k1];
  779. se = Icd[k-1][k1-1];
  780. //如果相邻的八个点都是黑点
  781. if(nw+n+ne+w+e+sw+s+se==0)
  782. {
  783. int lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
  784. *(lpData + lOffset++) = 255;
  785.         *(lpData + lOffset++) = 255;
  786.         *(lpData + lOffset++) = 255;
  787. }
  788. }
  789. }
  790. }
  791. Invalidate();
  792. }
  793. /////////////////////////////////////////////////////////////////////////////////////
  794. /////////////////////////////////////定位///////////////////////////////////////////
  795. void CFaceDetectView::OnREADYFixedPosition() 
  796. {
  797. // TODO: Add your command handler code here
  798. READYFixedPosition8();
  799.    
  800. }
  801. bool CFaceDetectView::READYFixedPosition8() 
  802. {
  803.     bool Over;
  804.      
  805.  Over=FixeEyes();
  806.  if(!Over)
  807.  return false;
  808.  FaceGuLi=false;
  809.  FixeNose();
  810.  FixeMouth();
  811.  Invalidate();
  812.  return true;
  813. }
  814. /////////////////////////////////////眼睛定位////////////////////////////////////////
  815. bool CFaceDetectView::FixeEyes()
  816. {
  817. int i,j,k,k1,k_Middle,k1_Middle;
  818. LPBYTE lpData;
  819. lpData = gDib.FindDIBBits(hDIB);
  820. WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  821. int lOffset;
  822. i=j=0;
  823.     if((v_right-v_left)*(v_top-v_bottom)<10)
  824. {
  825. ::AfxMessageBox("人脸太小!无法准确识别!");
  826. return false;
  827. }
  828. Vtemp=new int[(v_right-v_left)/5+1];
  829. Htemp=new int[(v_top-v_bottom)/2+1];
  830. for(i=0;i<(v_top-v_bottom)/2+1;i++)
  831. Htemp[i]=0;
  832. for(j=0;j<(v_right-v_left)/5+1;j++)
  833. Vtemp[j]=0;
  834. k_Middle=(v_top-v_bottom)/2;
  835. k1_Middle=(v_right-v_left)/2;
  836.  
  837.     ///////////////////////////////////////////////左眼定位////////////////////////
  838. for(i=(v_top+v_bottom)/2,k=0;i<=v_top;i++,k++)
  839. for(j=v_left+(v_right-v_left)/2,k1=0;j<=v_left+(v_right-v_left);j++,k1++)
  840.           if(WhiteBlack[k+k_Middle][k1+k1_Middle]==0)
  841.   {
  842.                 Htemp[k]++;
  843.   }
  844.   
  845.   
  846.      int Max=0;
  847.  int SMax=0;
  848.  int Line=0;
  849.  int BsecondLine=0;
  850.      L_teye=10000;
  851.  int L_EyeMiddleLine=0;
  852.  int TSecondLine=0;
  853.      L_beye=0;
  854. for(i=5;i<(v_top-v_bottom)/2-2;i++)
  855. {
  856. if(Htemp[i]>Max)
  857. {   
  858. Max=Htemp[i];
  859.      Line=i;
  860. }
  861.        
  862. }
  863. if(Max<((v_right-v_left)/5)*0.2)
  864.   {
  865.    ::AfxMessageBox("请确认图片中是否有人脸!以及脸部的获取是否整确!");
  866.     return false ;
  867.   }
  868. ////////////////////////////////////////获取左波峰
  869. int t1=Htemp[(v_top-v_bottom)/10+3];
  870. int t2=Htemp[(v_top-v_bottom)/10+4];
  871. int t3=Htemp[(v_top-v_bottom)/10+5];
  872. int t4=Htemp[(v_top-v_bottom)/10+6];
  873. int t5=Htemp[(v_top-v_bottom)/10+7];
  874. int t6=Htemp[(v_top-v_bottom)/10+8];
  875. int t7=Htemp[(v_top-v_bottom)/10+9];
  876. int M_Line=Line;
  877. int t=0;
  878. int top=0;
  879. //12
  880. for(i=(v_top-v_bottom)/10+10;i<Line+4;i++)
  881. {   
  882.    if(t4>=t1&&t4>=t2&&t4>=t3&&t4>=t5&&t4>=t6&&t4>=t7&&t4>Max*0.25)
  883. {   
  884.      Line=i-2;
  885. break;
  886. }
  887.   
  888.    t1=t2;
  889.    t2=t3;
  890.    t3=t4;
  891.    t4=t5;
  892.    t5=t6;
  893.    t6=t7;
  894.    t7=Htemp[i];
  895.    
  896. }
  897.  
  898. /*
  899. ///////////////////////////////////////////////////////////////////////////////////
  900. for(j=v_left;j<v_right;j++)
  901. {
  902.   lOffset = gDib.PixelOffset(Line+v_bottom+(v_top-v_bottom)/2, j, gwBytesPerLine);
  903. *(lpData + lOffset) = 0;
  904.         *(lpData + lOffset+1) = 0;
  905.         *(lpData + lOffset+2) =255;
  906. }
  907. //////////////////////////////////////////////////////////////////////////////////
  908. */
  909. ////////////////////////////////////////////获取左上波谷
  910. ///////////////////////////////修改为0.3///////////////////////
  911. int jump=0;
  912. if(Line+2<(v_top-v_bottom)/2)
  913. for(double xishu=0.3;xishu<0.9;xishu=xishu+0.1)
  914. {
  915.     for(i=Line+1;i<(v_top-v_bottom)/2;i++)
  916. {
  917.      if(Htemp[i]<=Max*xishu)
  918.  {
  919.   L_teye=i;jump=1;
  920.   break;
  921.  }
  922. }
  923.   if(jump==1)
  924.   break;
  925. }
  926. /////////////////////////////////////////获取左下波谷
  927. if((Line-1)>0)
  928.     for(i=Line-1;i>=0;i--)
  929. {
  930.   if(Htemp[i]<=Max*0.3)
  931.  {
  932.  L_beye=i;
  933.  break;
  934.  }
  935. }
  936. L_EyeMiddleLine=Line;
  937. ////////////////////////////////////////////////////////////////////
  938.  
  939. ////////////////////////////////////////获取左左边线
  940.  
  941.   H_lleye=0;
  942.   H_lreye=0;
  943.   for(j=((v_right-v_left)/5)*3+((v_right-v_left)/5)/2;j<(v_right-v_left);j++)
  944.   {   int  Count=0;
  945.   for(i=L_beye+(v_top-v_bottom)/2;i<L_teye+(v_top-v_bottom)/2;i++)
  946.   {
  947.   if(WhiteBlack[i][j]==0)
  948.    Count++;
  949.   }
  950.    if(Count<(L_teye-L_beye)/5||j==(v_right-v_left-1))
  951.    {H_lleye=j;
  952.     break;
  953.    }
  954.   }
  955.   ////////////////////////////////////获取右边线
  956.   for(j=((v_right-v_left)/5)*3+((v_right-v_left)/5)/2;j>(v_right-v_left)/2;j--)
  957.   {   int  Count=0;
  958.   for(i=L_beye+(v_top-v_bottom)/2;i<L_teye+(v_top-v_bottom)/2;i++)
  959.   {
  960.   if(WhiteBlack[i][j]==0)
  961.    Count++;
  962.   }
  963.    if(Count<(L_teye-L_beye)/5||j==(v_right-v_left)/2+1)
  964.    {H_lreye=j;
  965.     break;
  966.    }
  967.   }
  968.    
  969. /////////////////////////////////////////右眼定位///////////////////////////
  970.    Max=0;
  971.    k1_Middle=(v_right-v_left)/5;
  972.    k_Middle=(v_top-v_bottom)/2;
  973.    int R_EyeMiddleLine=0;
  974.    int Count=0;
  975.        R_teye=0;
  976.        for(i=0;i<(v_top-v_bottom)/2+1;i++)
  977.           Htemp[i]=0;
  978.   for(i=(v_top+v_bottom)/2,k=0;i<=v_top;i++,k++)
  979. for(j=v_left,k1=0;j<=v_left+(v_right-v_left)/2;j++,k1++)
  980.           if(WhiteBlack[k+k_Middle][k1]==0)
  981.   {
  982.                 Htemp[k]++;
  983.   }
  984.   
  985.   
  986. for(i=5;i<(v_top-v_bottom)/2-2;i++)
  987. {
  988. if(Htemp[i]>Max)
  989. {   
  990. Max=Htemp[i];
  991.      Line=i;
  992. }
  993.        
  994. }
  995. int SLine=Line;
  996. /*
  997. ///////////////////////////////////////////////////////////////////////////////////
  998. for(j=v_left;j<v_right;j++)
  999. {
  1000.   lOffset = gDib.PixelOffset(Line+v_bottom+(v_top-v_bottom)/2, j, gwBytesPerLine);
  1001. *(lpData + lOffset) = 0;
  1002.         *(lpData + lOffset+1) = 0;
  1003.         *(lpData + lOffset+2) =255;
  1004. }
  1005. //////////////////////////////////////////////////////////////////////////////////
  1006. */
  1007. /*
  1008. if(Line>(v_top-v_bottom)/2-4||Max<((v_right-v_left)/5)*0.2)
  1009.   {
  1010.    ::AfxMessageBox("请确认图片中是否有人脸!");
  1011.     return false ;
  1012.   }
  1013. */
  1014. ///////////////////////////////////获取右波峰
  1015.  int x1=Htemp[5];
  1016.  int x2=Htemp[6];
  1017.  top=0;
  1018. for(i=8;i<Line+4;i++)
  1019. {   
  1020.    if(top>x1&&top>x2&&top>Max*0.25)
  1021. {   
  1022.      Line=i-2;
  1023. break;
  1024. }
  1025.    else
  1026.    {
  1027.     if(x1>x2)
  1028. t=x1;
  1029. else
  1030. t=x2;
  1031. top=t;
  1032.    }
  1033.    x1=Htemp[i];
  1034.    x2=Htemp[++i];
  1035.    
  1036. }
  1037. if(Line<L_EyeMiddleLine-15)
  1038. {
  1039.  t=0;
  1040.  x1=Htemp[L_EyeMiddleLine-15];
  1041.  x2=Htemp[L_EyeMiddleLine-14];
  1042.  top=0;
  1043.  
  1044. for(i=L_EyeMiddleLine-13;i<L_EyeMiddleLine+10;i++)
  1045. {   
  1046.    if(top>x1&&top>x2&&top>Max*0.25)
  1047. {   
  1048.      Line=i-2;
  1049. break;
  1050. }
  1051.    else
  1052.    {
  1053.     if(x1>x2)
  1054. t=x1;
  1055. else
  1056. t=x2;
  1057. top=t;
  1058.    }
  1059.    x1=Htemp[i];
  1060.    x2=Htemp[++i];
  1061.    
  1062. }
  1063. }
  1064. /*
  1065. //////////////////////////////////眼睛中线////////////////////////////////
  1066. for(j=v_left;j<v_right;j++)
  1067. {
  1068.   lOffset = gDib.PixelOffset(Line+v_bottom+(v_top-v_bottom)/2, j, gwBytesPerLine);
  1069. *(lpData + lOffset) = 0;
  1070.         *(lpData + lOffset+1) = 0;
  1071.         *(lpData + lOffset+2) =255;
  1072. }
  1073. //////////////////////////////////////////////////////////////////////////////////
  1074. */
  1075. /*
  1076.   if(Line<(v_top-v_bottom)/2-4)
  1077.   {
  1078.    ::AfxMessageBox("请确认图片中是否有人脸!");
  1079.     return false ;
  1080.   }
  1081. */
  1082.   R_EyeMiddleLine=Line;
  1083. /////////////////////////////////获取右上波谷
  1084. jump=0;
  1085. R_teye=0;
  1086. if(R_EyeMiddleLine+5<(v_top-v_bottom)/2)
  1087. for(double xishu=0.3;xishu<0.9;xishu=xishu+0.1)
  1088. {  
  1089.    for(i=Line+1;i<(v_top-v_bottom)/2;i++)
  1090. {
  1091.      if(Htemp[i]<=Max*xishu)
  1092.  {
  1093.   R_teye=i;jump=1;
  1094.   break;
  1095.  }
  1096. }
  1097.    if(jump==1)
  1098.    break;
  1099. }
  1100. /////////////////////////////////获取右下波谷
  1101.      R_beye=0;
  1102.     if((R_EyeMiddleLine-5)>0)
  1103.       for(i=Line-1;i>=0;i--)
  1104. {
  1105.   if(Htemp[i]<=Max*0.3)
  1106.  {
  1107.  R_beye=i;
  1108.  break;
  1109.  }
  1110. }
  1111. ///////////////////////////////获取右左线
  1112.   H_rleye=0;
  1113.   H_rreye=0;
  1114.   for(j=((v_right-v_left)/5)*1+((v_right-v_left)/5)/2;j<(v_right-v_left)/2;j++)
  1115.   {   int  Count=0;
  1116.   for(i=R_beye+(v_top-v_bottom)/2;i<R_teye+(v_top-v_bottom)/2;i++)
  1117.   if(WhiteBlack[i][j]==0)
  1118.    Count++;
  1119.    if(Count<(R_teye-R_beye)/5)
  1120.    {H_rleye=j;
  1121.     break;
  1122.    }
  1123.   }
  1124. /////////////////////////////////获取右右线
  1125.   for(j=((v_right-v_left)/5)+((v_right-v_left)/5)/2;j>0;j--)
  1126.   {   int  Count=0;
  1127.   for(i=R_beye+(v_top-v_bottom)/2;i<R_teye+(v_top-v_bottom)/2;i++)
  1128.   if(WhiteBlack[i][j]==0)
  1129.    Count++;
  1130.    if(Count<(R_teye-R_beye)/5)
  1131.    {H_rreye=j;
  1132.     break;
  1133.    }
  1134.   }
  1135.   
  1136.   if((H_rleye-H_rreye)<(H_lleye-H_lreye))
  1137.   H_rreye=H_rleye-(H_lleye-H_lreye);
  1138.   else
  1139.   H_lleye=H_lreye+(H_rleye-H_rreye);
  1140.   if(((L_teye-L_beye)-(R_teye-R_beye))>2)
  1141.   L_teye=L_beye+(R_teye-R_beye);
  1142.   if(((R_teye-R_beye)-(L_teye-L_beye))>2)
  1143.   R_teye=R_beye+(L_teye-L_beye);
  1144. ////////////////////////////////////////////////////////////
  1145.   if(R_beye>L_teye||R_beye==L_teye||R_teye<L_beye||R_teye==L_beye)
  1146.   {
  1147.    ::AfxMessageBox("请确认图片中是否有人脸!以及脸部的获取是否整确!");
  1148.     return false ;
  1149.   }
  1150. ///////////////////////////////////////////////////////////
  1151.     int m_top=(v_top-v_bottom)/2+L_teye;
  1152.     int m_bottom=(v_top-v_bottom)/2+L_beye;
  1153.     int m_left=H_lreye;
  1154.     int m_right=H_lleye;
  1155.   int L_EyeTopY=L_teye+(v_top-v_bottom)/2+v_bottom;
  1156.   int L_EyeTopX=TopPoint(m_top, m_bottom, m_left,m_right)+v_left;
  1157.       DrawCrossX(L_EyeTopX,L_EyeTopY);
  1158.   
  1159.  
  1160.   L_EyeLY=(L_teye-L_beye)/3+(v_top-v_bottom)/2+v_bottom+L_beye+1;
  1161.   L_EyeLX=v_left+H_lleye;
  1162.       DrawCrossX(L_EyeLX,L_EyeLY);
  1163.   L_EyeRY=(L_teye-L_beye)/3+(v_top-v_bottom)/2+v_bottom+L_beye+1;
  1164.   L_EyeRX=v_left+H_lreye;
  1165.   DrawCrossX(L_EyeRX,L_EyeRY);
  1166.   int L_EyeBY=v_bottom+(v_top-v_bottom)/2+L_beye;
  1167.   int L_EyeBX=L_EyeTopX;
  1168.          DrawCrossX(L_EyeBX,L_EyeBY);
  1169.   
  1170. ////////////////////////////////////右眼///////////////////////////////////////
  1171. ///////////////////////////////////////////////////////////////////////////////
  1172.   m_top=(v_top-v_bottom)/2+R_teye;
  1173.   m_bottom=(v_top-v_bottom)/2+R_beye;
  1174.   m_left=H_rreye;
  1175.   m_right=H_rleye;
  1176.   int R_EyeTopY=R_teye+(v_top-v_bottom)/2+v_bottom;  
  1177.   int R_EyeTopX=TopPoint(m_top, m_bottom, m_left,m_right)+v_left;
  1178.   DrawCrossX(R_EyeTopX,R_EyeTopY);
  1179.   R_EyeLY=(R_teye-R_beye)/3+(v_top-v_bottom)/2+v_bottom+R_beye+1;
  1180.   R_EyeLX=v_left+H_rleye;
  1181.           DrawCrossX(R_EyeLX,R_EyeLY);
  1182.   R_EyeRY=(R_teye-R_beye)/3+(v_top-v_bottom)/2+v_bottom+R_beye+1;
  1183.   R_EyeRX=v_left+H_rreye;
  1184.      DrawCrossX(R_EyeRX,R_EyeRY);
  1185.   int R_EyeBY=v_bottom+(v_top-v_bottom)/2+R_beye;
  1186.   int R_EyeBX= R_EyeTopX;
  1187.        DrawCrossX(R_EyeBX,R_EyeBY);
  1188.  
  1189.    /*
  1190. //////////////////////////////////////////////////////////////////////////
  1191. for(j=v_left+H_lreye;j<v_left+H_lleye;j++)
  1192. {
  1193.   lOffset = gDib.PixelOffset(L_teye+(v_top+v_bottom)/2, j, gwBytesPerLine);
  1194. *(lpData + lOffset) = 0;
  1195.         *(lpData + lOffset+1) = 0;
  1196.         *(lpData + lOffset+2) =255 ;
  1197.       lOffset = gDib.PixelOffset(L_beye+(v_top+v_bottom)/2, j, gwBytesPerLine);
  1198. *(lpData + lOffset) = 0;
  1199.         *(lpData + lOffset+1) =0 ;
  1200.         *(lpData + lOffset+2) =255;
  1201. }
  1202. for(i=(v_bottom+v_top)/2+L_beye;i<(v_bottom+v_top)/2+L_teye;i++)
  1203. {
  1204.   lOffset = gDib.PixelOffset(i,v_left+H_lleye, gwBytesPerLine);
  1205. *(lpData + lOffset) = 0;
  1206.         *(lpData + lOffset+1) = 0;
  1207.         *(lpData + lOffset+2) =255 ;
  1208.         lOffset = gDib.PixelOffset(i, v_left+H_lreye, gwBytesPerLine);
  1209. *(lpData + lOffset) = 0;
  1210.         *(lpData + lOffset+1) =0 ;
  1211.         *(lpData + lOffset+2) =255;
  1212. }
  1213. for(j=v_left+H_rreye;j<v_left+H_rleye;j++)
  1214. {
  1215.   lOffset = gDib.PixelOffset(R_teye+(v_top+v_bottom)/2, j, gwBytesPerLine);
  1216. *(lpData + lOffset) = 0;
  1217.         *(lpData + lOffset+1) = 0;
  1218.         *(lpData + lOffset+2) =255;
  1219.         lOffset = gDib.PixelOffset(R_beye+(v_top+v_bottom)/2, j, gwBytesPerLine);
  1220. *(lpData + lOffset) = 0;
  1221.         *(lpData + lOffset+1) =0 ;
  1222.         *(lpData + lOffset+2) =255;
  1223. }
  1224. for(i=(v_bottom+v_top)/2+R_beye;i<(v_bottom+v_top)/2+R_teye;i++)
  1225. {
  1226.   lOffset = gDib.PixelOffset(i,v_left+H_rleye, gwBytesPerLine);
  1227. *(lpData + lOffset) = 0;
  1228.         *(lpData + lOffset+1) = 0;
  1229.         *(lpData + lOffset+2) =255 ;
  1230.         lOffset = gDib.PixelOffset(i, v_left+H_rreye, gwBytesPerLine);
  1231. *(lpData + lOffset) = 0;
  1232.         *(lpData + lOffset+1) =0 ;
  1233.         *(lpData + lOffset+2) =255;
  1234. }
  1235. */
  1236. return true;
  1237. }
  1238. int CFaceDetectView::TopPoint(int m_top,int m_bottom,int m_left,int m_right)
  1239. {
  1240.     int Max=0;
  1241. int L,R;
  1242.    for(int j=m_left;j<m_right;j++)
  1243.    { int Count=0;
  1244.    for(int i=m_bottom;i<m_top;i++)
  1245.    if(WhiteBlack[i][j]==0)
  1246.              Count++;
  1247.    if(Max<Count)
  1248.    {
  1249.    Max=Count; L=j;
  1250.    }
  1251.    }
  1252.  Max=0;
  1253.  for(j=m_right;j>m_left;j--)  
  1254.    { int Count=0;
  1255.    for(int i=m_bottom;i<m_top;i++)
  1256.    if(WhiteBlack[i][j]==0)
  1257.              Count++;
  1258.    if(Max<Count)
  1259.    {
  1260.    Max=Count; R=j;
  1261.    }
  1262.    }
  1263.    return (L+R)/2;
  1264. }
  1265. /////////////////////////////////////鼻子定位////////////////////////////////////////
  1266. void CFaceDetectView::FixeNose()
  1267. {   
  1268. int N_top;
  1269. int i,j;
  1270. LPBYTE lpData;
  1271. lpData = gDib.FindDIBBits(hDIB);
  1272. WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  1273. int lOffset;
  1274. if(R_beye>L_beye)
  1275. N_top=L_beye;
  1276. else
  1277. N_top=R_beye;
  1278.     T_NoseMiddleLine=0;
  1279.     B_NoseMiddleLine=0;
  1280. int a=(H_rleye-H_lreye)*0.5;
  1281. for(i=(v_top-v_bottom)/2+N_top-10;i>(v_top-v_bottom)/4;i--)
  1282. {   int Count=0;
  1283. for(j=H_rleye;j<H_lreye;j++)
  1284. {
  1285. if(WhiteBlack[i][j]==0)
  1286. Count++;
  1287. }
  1288. if(((v_right-v_left)/5)*0.3<Count)
  1289. {  
  1290.     T_NoseMiddleLine=i; 
  1291. break;
  1292. }
  1293.         }
  1294.   
  1295. for(i=T_NoseMiddleLine-3;i>(v_top-v_bottom)/4;i--)
  1296. {   int Count=0;
  1297. for(j=((v_right-v_left)/5)*2;j<((v_right-v_left)/5)*3;j++)
  1298. {
  1299. if(WhiteBlack[i][j]==0)
  1300. Count++;
  1301. }
  1302. if(((v_right-v_left)/5)*0.5>Count)
  1303. {
  1304.     B_NoseMiddleLine=i; 
  1305. break;
  1306. }
  1307.         }
  1308.   ///////////////////////鼻左////////////////////////////////////////
  1309. H_lnose=0;
  1310. for(j=(H_lreye+H_rleye)/2;j<((v_right-v_left)/5)*4;j++)
  1311. {   int Count=0;
  1312. for(i=B_NoseMiddleLine;i<T_NoseMiddleLine;i++)
  1313. {
  1314. if(WhiteBlack[i][j]==0)
  1315. Count++;
  1316. }
  1317. if((T_NoseMiddleLine-B_NoseMiddleLine)*0.5<Count)
  1318. {
  1319.     H_lnose=j; 
  1320. }
  1321.         }
  1322. ///////////////////////鼻右//////
  1323. H_rnose=0;
  1324. for(j=(H_lreye+H_rleye)/2;j>((v_right-v_left)/5);j--)
  1325. {   int Count=0;
  1326. for(i=B_NoseMiddleLine;i<T_NoseMiddleLine;i++)
  1327. {
  1328. if(WhiteBlack[i][j]==0)
  1329. Count++;
  1330. }
  1331. if((T_NoseMiddleLine-B_NoseMiddleLine)*0.5<Count)
  1332. {
  1333.     H_rnose=j; 
  1334. }
  1335.         }
  1336. if(H_lnose==0)
  1337.   H_lnose=H_lreye;
  1338. if(H_rnose==0)
  1339.   H_rnose=H_rleye;
  1340.   
  1341. //////////////////////////////////////////////////////////////////////////
  1342.   int N_left=(H_lnose+H_rnose)/2;
  1343.   int N_right=((v_right-v_left)/5)*4;
  1344.   int N_ntop=T_NoseMiddleLine;
  1345.   int N_bottom=B_NoseMiddleLine;
  1346.       L_noseX=  H_lnose+v_left;
  1347.   L_noseY=NoseY(N_left,N_right,N_ntop,N_bottom)+v_bottom;
  1348.       
  1349.   N_left=((v_right-v_left)/5);
  1350.   N_right=(H_lnose+H_rnose)/2;
  1351.   N_ntop=T_NoseMiddleLine;
  1352.   N_bottom=B_NoseMiddleLine;
  1353.   R_noseX=H_rnose+v_left;
  1354.   R_noseY=NoseY(N_left,N_right,N_ntop,N_bottom)+v_bottom;
  1355.   L_noseY=(L_noseY+R_noseY)/2;
  1356.   R_noseY=L_noseY;
  1357.   
  1358.       
  1359.    N_MiddleX=(R_noseX+L_noseX)/2;
  1360.    N_MiddleY=(L_noseX-R_noseX)*0.4+L_noseY;
  1361.      DrawCrossX(N_MiddleX, N_MiddleY);
  1362.  
  1363.   DrawCrossX(L_noseX,L_noseY);
  1364.   DrawCrossX(R_noseX,R_noseY);
  1365.   /*
  1366. /////////////////////////////////鼻子框//////////////////////////////////////////
  1367. for(j=v_left+H_rnose-5;j<v_left+H_lnose+5;j++)
  1368. {
  1369.   lOffset = gDib.PixelOffset(T_NoseMiddleLine+v_bottom-5, j, gwBytesPerLine);
  1370. *(lpData + lOffset) = 0;
  1371.         *(lpData + lOffset+1) = 0;
  1372.         *(lpData + lOffset+2) =255 ;
  1373.         lOffset = gDib.PixelOffset(B_NoseMiddleLine+v_bottom+5, j, gwBytesPerLine);
  1374. *(lpData + lOffset) = 0;
  1375.         *(lpData + lOffset+1) =0 ;
  1376.         *(lpData + lOffset+2) =255;
  1377. }
  1378. ////////////////////////////////////////////////////////////////////////////////////////
  1379.   
  1380. ////////////////////////////////////////////////////////////////////////////////////////
  1381. for(i=B_NoseMiddleLine+v_bottom-5;i<T_NoseMiddleLine+v_bottom+5;i++)
  1382. {
  1383.   lOffset = gDib.PixelOffset(i,v_left+H_lnose-5, gwBytesPerLine);
  1384. *(lpData + lOffset) = 0;
  1385.         *(lpData + lOffset+1) = 0;
  1386.         *(lpData + lOffset+2) =255 ;
  1387.         lOffset = gDib.PixelOffset(i, v_left+H_rnose+5, gwBytesPerLine);
  1388. *(lpData + lOffset) = 0;
  1389.         *(lpData + lOffset+1) =0 ;
  1390.         *(lpData + lOffset+2) =255;
  1391. }
  1392. //////////////////////////////////////////////////////////////
  1393. */
  1394. }
  1395. int CFaceDetectView::NoseX(int N_left,int N_right,int N_top,int N_bottom)
  1396. {
  1397. int Max=0;
  1398. int N_x;
  1399.    for(int i=N_left;i<N_right;i++)
  1400.    {  int Count=0;
  1401.    for(int j=N_bottom;j<N_top;j++)
  1402.    {
  1403.           if(WhiteBlack[j][i]==0)
  1404. Count++; 
  1405.    }
  1406.    if(Max<Count)
  1407.    {
  1408.    Max=Count;
  1409.    N_x=i;
  1410.    }
  1411.    }
  1412.    for( i=N_x;i<N_right;i++)
  1413.    {    int  Count=0;
  1414.    for(int j=N_bottom;j<N_top;j++)
  1415.    {
  1416.           if(WhiteBlack[j][i]==0)
  1417. Count++; 
  1418.    }
  1419.    if(Max*0.5>Count)
  1420.    {
  1421.    N_x=i;break;
  1422.    }
  1423.    }
  1424.    return N_x;
  1425. }
  1426. int CFaceDetectView::NoseRX(int N_left,int N_right,int N_top,int N_bottom)
  1427. {
  1428. int Max=0;
  1429. int N_x;
  1430.    for(int i=N_right;i>N_left;i--)
  1431.    {  int Count=0;
  1432.    for(int j=N_bottom;j<N_top;j++)
  1433.    {
  1434.           if(WhiteBlack[j][i]==0)
  1435. Count++; 
  1436.    }
  1437.    if(Max<Count)
  1438.    {
  1439.    Max=Count;
  1440.    N_x=i;
  1441.    }
  1442.    }
  1443.    for(i=N_x;i>N_left;i--)
  1444.    {  int Count=0;
  1445.    for(int j=N_bottom;j<N_top;j++)
  1446.    {
  1447.           if(WhiteBlack[j][i]==0)
  1448. Count++; 
  1449.    }
  1450.    if(Max*0.5>Count)
  1451.    {
  1452.    N_x=i;break;
  1453.    }
  1454.    }
  1455.    return N_x;
  1456. }
  1457. int CFaceDetectView::NoseY(int N_left,int N_right,int N_top,int N_bottom)
  1458. {
  1459. int Max=0;
  1460. int N_y;
  1461.    for(int j=N_bottom;j<N_top;j++)
  1462.    {  int Count=0;
  1463.    for(int i=N_left;i<N_right;i++)
  1464.    {
  1465.           if(WhiteBlack[j][i]==0)
  1466. Count++; 
  1467.    }
  1468.    if(Max<Count)
  1469.    {
  1470.    Max=Count;
  1471.    N_y=j;
  1472.    }
  1473.    }
  1474.    return N_y;
  1475. }
  1476. /////////////////////////////////////嘴巴定位////////////////////////////////////////
  1477. void CFaceDetectView::FixeMouth()
  1478. {
  1479.   T_MouthMiddleLine=0;
  1480.   B_MouthMiddleLine=0;
  1481.   LPBYTE lpData;
  1482.   lpData = gDib.FindDIBBits(hDIB);
  1483.   WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  1484. int lOffset;
  1485. int i,j;
  1486. for(i=B_NoseMiddleLine-2;i>1;i--)
  1487. {   int Count=0;
  1488. for(j=((v_right-v_left)/5)*2;j<((v_right-v_left)/5)*3;j++)
  1489. {
  1490. if(WhiteBlack[i][j]==0)
  1491. Count++;
  1492. }
  1493. if(((v_right-v_left)/5)*0.5<Count)
  1494. {
  1495.     T_MouthMiddleLine=i; 
  1496. break;
  1497. }
  1498.         }
  1499.     int jump=0;
  1500. for(i=T_MouthMiddleLine-((v_right-v_left)/5)*0.5;i>3;i--)
  1501. {   int Count=0;
  1502. for(j=((v_right-v_left)/5)*2;j<((v_right-v_left)/5)*3;j++)
  1503. {
  1504. if(WhiteBlack[i][j]==0)
  1505. Count++;
  1506. }
  1507. if(((v_right-v_left)/5)*0.5>Count)
  1508. {
  1509.     B_MouthMiddleLine=i; 
  1510. break;
  1511. }
  1512.         }
  1513. int M_Max=0;
  1514. int M_Line=0;
  1515. for(i=B_NoseMiddleLine-2;i>B_NoseMiddleLine-22;i--)
  1516. {   int Count=0;
  1517. for(j=0;j<(v_right-v_left);j++)
  1518. {
  1519.          if(WhiteBlack[i][j]==0)
  1520.  Count++;
  1521. }
  1522. if(M_Max<Count)
  1523. {
  1524.          M_Max=Count;
  1525.  M_Line=i;
  1526. }
  1527. }
  1528. /*
  1529. ///////////////////////////////////////////////////////////////////////////////////
  1530. for(j=v_left;j<v_right;j++)
  1531. {
  1532.   lOffset = gDib.PixelOffset(M_Line+v_bottom, j, gwBytesPerLine);
  1533. *(lpData + lOffset) = 0;
  1534.         *(lpData + lOffset+1) = 0;
  1535.         *(lpData + lOffset+2) =255;
  1536. }
  1537. //////////////////////////////////////////////////////////////////////////////////
  1538. */
  1539.    H_lMouth=0;
  1540.    H_rMouth=0;
  1541.   for(j=((v_right-v_left)/5)*2+((v_right-v_left)/5)/2+10;j<(v_right-v_left);j++)
  1542.   {   int  Count=0;
  1543.   for(i=B_MouthMiddleLine;i<T_MouthMiddleLine+2;i++)
  1544.   if(WhiteBlack[i][j]==0)
  1545.    Count++;
  1546.    if(Count<(T_MouthMiddleLine-B_MouthMiddleLine)/4)
  1547.    {H_lMouth=j;
  1548.     break;
  1549.    }
  1550.   }
  1551.   for(j=((v_right-v_left)/5)*2+((v_right-v_left)/5)/2-6;j>0;j--)
  1552.   {   int  Count=0;
  1553.   for(i=B_MouthMiddleLine;i<T_MouthMiddleLine+2;i++)
  1554.   if(WhiteBlack[i][j]==0)
  1555.    Count++;
  1556.    if(Count<(T_MouthMiddleLine-B_MouthMiddleLine)/4)
  1557.    {H_rMouth=j;
  1558.     break;
  1559.    }
  1560.   }
  1561. ////////////////////////////////////////////////////////////////////////////
  1562.        N_MiddleX=((H_rleye+H_lreye)/2+v_left+N_MiddleX)/2;
  1563.   if(((N_MiddleX-v_left)-H_rMouth)>(H_lMouth-(N_MiddleX-v_left)))
  1564.   {
  1565.   M_RX=H_rMouth+v_left ;
  1566.   M_RY=M_Line+v_bottom;
  1567.           M_LX=((N_MiddleX-v_left)-H_rMouth)+(N_MiddleX-v_left)+v_left-2;
  1568.   M_LY=M_Line+v_bottom;
  1569.   }
  1570.   else
  1571.   { 
  1572.    M_LX=H_lMouth+v_left ;
  1573.    M_LY=M_Line+v_bottom;
  1574.    M_RX=(N_MiddleX-v_left)-(H_lMouth-(N_MiddleX-v_left))+v_left+3;
  1575.    M_RY=M_Line+v_bottom;
  1576.   }
  1577.   if(M_LX<L_noseX)
  1578.   M_LX=L_noseX+(L_noseX-R_noseX)/2;
  1579.   if(M_RX>R_noseX)
  1580.           M_RX=R_noseX-(L_noseX-R_noseX)/2;
  1581.       DrawCrossX( M_LX,  M_LY);
  1582.   
  1583.       DrawCrossX( M_RX, M_RY);
  1584.   xiabaX=N_MiddleX;
  1585.   //xiabaY=N_MiddleY-(2*(L_teye+(v_top-v_bottom)/2-N_MiddleY+v_bottom))*4/5;
  1586.   xiabaY=N_MiddleY-(N_MiddleY-T_MouthMiddleLine-v_bottom)*2-(N_MiddleY-T_MouthMiddleLine-v_bottom)/4;
  1587.   DrawCrossX( xiabaX, xiabaY);
  1588.   /*
  1589. ////////////////////////////嘴巴框//////////////////////////////////////
  1590. for(j=v_left+H_rMouth;j<v_left+H_lMouth;j++)
  1591. {
  1592.   lOffset = gDib.PixelOffset(T_MouthMiddleLine+v_bottom, j, gwBytesPerLine);
  1593. *(lpData + lOffset) = 0;
  1594.         *(lpData + lOffset+1) = 0;
  1595.         *(lpData + lOffset+2) =255 ;
  1596.         lOffset = gDib.PixelOffset(B_MouthMiddleLine+v_bottom, j, gwBytesPerLine);
  1597. *(lpData + lOffset) = 0;
  1598.         *(lpData + lOffset+1) =0 ;
  1599.         *(lpData + lOffset+2) =255;
  1600. }
  1601. for(i=B_MouthMiddleLine+v_bottom;i<T_MouthMiddleLine+v_bottom;i++)
  1602. {
  1603.   lOffset = gDib.PixelOffset(i,v_left+H_lMouth, gwBytesPerLine);
  1604. *(lpData + lOffset) = 0;
  1605.         *(lpData + lOffset+1) = 0;
  1606.         *(lpData + lOffset+2) =255 ;
  1607.         lOffset = gDib.PixelOffset(i, v_left+H_rMouth, gwBytesPerLine);
  1608. *(lpData + lOffset) = 0;
  1609.         *(lpData + lOffset+1) =0 ;
  1610.         *(lpData + lOffset+2) =255;
  1611. }
  1612. */
  1613. }
  1614. //////////////////////////////////////////////////////////////////////////////////
  1615. //////////////////////////////////获取特征参数////////////////////////////////////
  1616. void CFaceDetectView::OnPROCESSINGGetCharacteristicParameter() 
  1617. {
  1618. // TODO: Add your command handler code here
  1619.  /*   
  1620. Centerofgravity();
  1621. GetEyesParameter();
  1622.     GetPartParameter();
  1623. GetNoseParameter() ;
  1624. GetmouthParameter() ;
  1625. */
  1626. GetNewParameter();
  1627. Invalidate();
  1628. }
  1629. ///////////////////////////////////////////////////////////////////////
  1630. void CFaceDetectView::GetNewParameter()
  1631. {     
  1632.       x1=TwoPointDistance(R_EyeRX,R_EyeRY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1633.   x2=TwoPointDistance(R_EyeLX,R_EyeLY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1634.   x3=TwoPointDistance(L_EyeRX,L_EyeRY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1635.   x4=TwoPointDistance(L_EyeLX,L_EyeLY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1636.   x5=TwoPointDistance(R_noseX,R_noseY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1637.   x6=TwoPointDistance(L_noseX,L_noseY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1638.   x7=TwoPointDistance(M_RX, M_RY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1639.   x8=TwoPointDistance(M_LX, M_LY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1640.   x9=(L_EyeRX-R_EyeLX)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1641.   x10=(L_noseX-R_noseX)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1642.   x11=(M_LX-M_RX)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
  1643.   
  1644. }
  1645. double CFaceDetectView::TwoPointDistance(int x1,int y1,int x2,int y2)
  1646. {
  1647. return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
  1648. }
  1649. ///////////////////////////////////////眼、鼻子、嘴巴的重心///////////////////////
  1650. void CFaceDetectView::Centerofgravity()
  1651. {
  1652. ///////////////////////左眼重心////////////////////////////////////////////
  1653. int i,j,x,y;
  1654. int sumx=0;
  1655. int sumy=0;
  1656. int sumg=0;
  1657. for(i=(v_top-v_bottom)/2+L_beye,y=1;i<=(v_top-v_bottom)/2+L_teye;i++,y++)
  1658. for(j=H_lreye,x=1;j<=H_lleye;j++,x++)
  1659.           if(WhiteBlack[i][j]==0)
  1660.   {
  1661.                sumx=sumx+x; 
  1662.    sumy=sumy+y;
  1663.    sumg++;
  1664.   }
  1665.     Cofg_lefteyex=sumx/sumg;
  1666. Cofg_lefteyey=sumy/sumg;
  1667.      DrawCrossX(v_left+H_lreye+Cofg_lefteyex,(v_top+v_bottom)/2+L_beye+Cofg_lefteyey);
  1668. ///////////////////////右眼重心////////////////////////////////////////////
  1669.        sumx=0;
  1670.    sumy=0;
  1671.    sumg=0;
  1672.    
  1673. for(i=(v_top-v_bottom)/2+R_beye,y=1;i<(v_top-v_bottom)/2+R_teye;i++,y++)
  1674. {   
  1675. for(j=H_rreye,x=1;j<=H_rleye;j++,x++)
  1676.           if(WhiteBlack[i][j]==0)
  1677.   { 
  1678.                sumx=sumx+x; 
  1679.    sumy=sumy+y;
  1680.    sumg++;
  1681.   }
  1682. }
  1683.   Cofg_righteyex=sumx/sumg;
  1684.   Cofg_righteyey=sumy/sumg;
  1685. DrawCrossX(v_left+H_rreye+Cofg_righteyex,(v_top+v_bottom)/2+R_beye+Cofg_righteyey);
  1686. ///////////////////////鼻子重心////////////////////////////////////////////
  1687.    sumx=0;
  1688.    sumy=0;
  1689.    sumg=0;
  1690.      for(i=B_NoseMiddleLine,y=1;i<=T_NoseMiddleLine;i++,y++)
  1691.     for(j=H_rnose,x=1;j<=H_lnose;j++,x++)
  1692.           if(WhiteBlack[i][j]==0)
  1693.   {
  1694.                sumx=sumx+x; 
  1695.    sumy=sumy+y;
  1696.    sumg++;
  1697.   }
  1698.        Cofg_nosex=sumx/sumg;
  1699.        Cofg_nosey=sumy/sumg;
  1700. DrawCrossX(v_left+H_rnose+Cofg_nosex,v_bottom+B_NoseMiddleLine+Cofg_nosey);
  1701. ///////////////////////嘴巴重心////////////////////////////////////////////
  1702.        sumx=0;
  1703.    sumy=0;
  1704.    sumg=0;
  1705.      for(i=B_MouthMiddleLine,y=1;i<=T_MouthMiddleLine;i++,y++)
  1706.     for(j=H_rMouth,x=1;j<=H_lMouth;j++,x++)
  1707.           if(WhiteBlack[i][j]==0)
  1708.   {
  1709.                sumx=sumx+x; 
  1710.    sumy=sumy+y;
  1711.    sumg++;
  1712.   }
  1713.        Cofg_mouthx=sumx/sumg;
  1714.    Cofg_mouthy=sumy/sumg;
  1715. ///////////////////////////////////////////////////////////////////////////////////////////
  1716.  
  1717. }
  1718. ///////////////////////////获取眼睛的特征关系/////////////////////////////////////
  1719. void CFaceDetectView::GetEyesParameter()
  1720. {
  1721.   double TwoEyeAngle;
  1722.   double Toweye_nose;
  1723.   double Toweye_mouth;
  1724.   double Toweye_face;
  1725.   int X;
  1726.   int Y;
  1727.   ///////////////////////////////////两眼角度///////////////////////////////
  1728.     if(Cofg_lefteyex>Cofg_righteyex)
  1729. X=Cofg_lefteyex-Cofg_righteyex+H_lreye-H_rreye;
  1730. else
  1731. X=Cofg_righteyex-Cofg_lefteyex+H_lreye-H_rreye;
  1732.  if(Cofg_lefteyey>Cofg_righteyey)
  1733.  Y=Cofg_lefteyey-Cofg_righteyey+abs(L_beye-R_beye);
  1734.  else
  1735.  Y=Cofg_righteyey-Cofg_lefteyey+abs(L_beye-R_beye);
  1736.  TwoEyeAngle=atan(double(Y)/X);
  1737.    ///////////////////////////////////鼻眼鼻所形成的角//////////////////////////////
  1738.     int T_line;
  1739. int L_line ;
  1740. int R_line;
  1741. T_line=X*X+Y*Y;
  1742. R_line=((v_top-v_bottom)/2+R_beye+Cofg_righteyey-Cofg_nosey-B_NoseMiddleLine)*
  1743.            ((v_top-v_bottom)/2+R_beye+Cofg_righteyey-Cofg_nosey-B_NoseMiddleLine)+
  1744.     (H_rnose+Cofg_nosex-H_rreye-Cofg_righteyex)*(H_rnose+Cofg_nosex-H_rreye-Cofg_righteyex);
  1745.     L_line=((v_top-v_bottom)/2+L_beye+Cofg_lefteyey-Cofg_nosey-B_NoseMiddleLine)*
  1746.             ((v_top-v_bottom)/2+L_beye+Cofg_lefteyey-Cofg_nosey-B_NoseMiddleLine)+
  1747.             (H_rnose+Cofg_nosex-H_lreye-Cofg_righteyex)*(H_rnose+Cofg_nosex-H_lreye-Cofg_righteyex);
  1748.     Toweye_nose  = (T_line-R_line-L_line)/(-2.0*sqrt(R_line)*sqrt(L_line));
  1749. ///////////////////////////////////////鼻嘴鼻所形成的角////////////////////////////////            
  1750. T_line=X*X+Y*Y;
  1751. R_line=((v_top-v_bottom)/2+R_beye+Cofg_righteyey-Cofg_mouthy-B_MouthMiddleLine)*
  1752.            ((v_top-v_bottom)/2+R_beye+Cofg_righteyey-Cofg_mouthy-B_MouthMiddleLine)+
  1753.     (H_rMouth+Cofg_mouthx-H_rreye-Cofg_righteyex)*(H_rMouth+Cofg_mouthx-H_rreye-Cofg_righteyex);
  1754.     L_line=((v_top-v_bottom)/2+L_beye+Cofg_lefteyey-Cofg_mouthy-B_MouthMiddleLine)*
  1755.             ((v_top-v_bottom)/2+L_beye+Cofg_lefteyey-Cofg_mouthy-B_MouthMiddleLine)+
  1756.             (H_rMouth+Cofg_mouthx-H_lreye-Cofg_righteyex)*(H_rMouth+Cofg_mouthx-H_lreye-Cofg_righteyex);
  1757.      Toweye_mouth= (T_line-R_line-L_line)/(-2.0*sqrt(R_line)*sqrt(L_line));
  1758. /////////////////////////////////////////////////////////两个眼睛中心距与脸宽的比例/////
  1759.         Toweye_face=double(X)/(v_left-v_right);
  1760. ///////////////////////////////////////与两眼重心和斜线所形成的角///////////////////////
  1761. }
  1762. ///////////////////////////获取整个脸部特征/////////////////////////////////////
  1763. void CFaceDetectView::GetPartParameter()
  1764. {
  1765.   Zx=0.0;
  1766.   Zy=0.0;
  1767.   
  1768.   M10=GetM(1,0);
  1769.   M00=GetM(0,0);
  1770.   M01=GetM(0,1);
  1771.   Zx=M10/M00;
  1772.   Zy=M01/M00;
  1773.   
  1774.   
  1775.   M1=Getm(2,0)+Getm(0,2);
  1776.   
  1777.   M2=(Getm(2,0)-Getm(0,2))*(Getm(2,0)-Getm(0,2))+4*(Getm(1,1)*Getm(1,1));
  1778.   
  1779.   M3=(Getm(3,0)-Getm(1,2))*(Getm(3,0)-Getm(1,2))+(3*Getm(2,1)+Getm(0,3))*(3*Getm(2,1)+Getm(0,3));
  1780.   
  1781.   M4=(Getm(3,0)+Getm(1,2))*(Getm(3,0)+Getm(1,2))+(Getm(2,1)+Getm(0,3))*(Getm(2,1)+Getm(0,3));
  1782.   
  1783.   M5=(Getm(3,0)-3*Getm(1,2))*(Getm(3,0)+Getm(1,2))*((Getm(3,0)+Getm(1,2))*(Getm(3,0)+Getm(1,2))-3*(Getm(2,1)+Getm(0,3))*(Getm(2,1)+Getm(0,3)))+
  1784.      (3*Getm(2,1)-Getm(0,3))*(Getm(2,1)+Getm(0,3))*(3*(Getm(3,0)+Getm(1,2))*(Getm(3,0)+Getm(1,2))-(Getm(2,1)+Getm(0,3))*(Getm(2,1)+Getm(0,3)));
  1785.   
  1786.   M6=(Getm(2,0)-Getm(0,2))*((Getm(3,0)+Getm(1,2))*(Getm(3,0)+Getm(1,2))-(Getm(2,1)+Getm(0,3))*(Getm(2,1)+Getm(0,3)))+4*Getm(1,1)*(Getm(3,0)+Getm(1,2))*(Getm(2,1)+Getm(0,3));
  1787.  
  1788.   M7=(3*Getm(1,2)-Getm(3,0))*(Getm(3,0)+Getm(1,2))*((Getm(3,0)+Getm(1,2))*(Getm(3,0)+Getm(1,2))-3*(Getm(2,1)+Getm(0,3))*(Getm(2,1)+Getm(0,3)))+
  1789.       (3*Getm(2,1)-Getm(0,3))*(Getm(2,1)+Getm(0,3))*(2*(Getm(0,3)+Getm(1,2))*(Getm(0,3)+Getm(1,2)));
  1790.   Eleye=(Getmleye(2,0)+Getmleye(0,2)+sqrt((Getmleye(2,0)+Getmleye(0,2))*(Getmleye(2,0)+Getmleye(0,2))-4*Getmleye(0,2)*Getmleye(2,0)+4*Getmleye(1,1)*Getmleye(1,1)))/
  1791.   (Getmleye(2,0)+Getmleye(0,2)-sqrt((Getmleye(2,0)+Getmleye(0,2))*(Getmleye(2,0)+Getmleye(0,2))-4*Getmleye(0,2)*Getmleye(2,0)+4*Getmleye(1,1)*Getmleye(1,1)));
  1792.   Ereye=(Getmreye(2,0)+Getmreye(0,2)+sqrt((Getmreye(2,0)+Getmreye(0,2))*(Getmreye(2,0)+Getmreye(0,2))-4*Getmreye(0,2)*Getmreye(2,0)+4*Getmreye(1,1)*Getmreye(1,1)))/
  1793.   (Getmreye(2,0)+Getmreye(0,2)-sqrt((Getmreye(2,0)+Getmreye(0,2))*(Getmreye(2,0)+Getmreye(0,2))-4*Getmreye(0,2)*Getmreye(2,0)+4*Getmreye(1,1)*Getmreye(1,1)));
  1794. }
  1795. double CFaceDetectView::GetM(int n,int m)
  1796. {
  1797. double GetCM=0;
  1798. for(int i=0;i<v_top-v_bottom;i++)
  1799. for(int j=0;j<v_right-v_left;j++)
  1800. {  
  1801.           double Getx=0.0;
  1802.   Getx=pow(i,n);
  1803.           double Gety=0.0;
  1804.   Gety=pow(j,m);
  1805.   int fij;
  1806.   if(WhiteBlack[i][j]==0)
  1807.   fij=1;
  1808.   else 
  1809.   fij=0;
  1810.           GetCM=GetCM+fij*Getx*Gety;
  1811. }
  1812. return GetCM;
  1813. }
  1814. double CFaceDetectView::Getm(int n,int m)
  1815. {
  1816. double GetCm=0;
  1817. int flat=0;
  1818.     for(int i=0;i<v_top-v_bottom;i++)
  1819. for(int j=0;j<v_right-v_left;j++)
  1820. {  
  1821.           double Getx=0.0;
  1822.   Getx=pow(i-Zx,-n);
  1823.           double Gety=0.0;
  1824.   Gety=pow(j-Zy,-m);
  1825.   int fij;
  1826.   if(WhiteBlack[i][j]==0)
  1827.   fij=1;
  1828.   else 
  1829.   fij=0;
  1830.   GetCm=GetCm+fij*Getx*Gety;
  1831. }
  1832. double m00=1.0;
  1833. if((n+m)>1&&flat==0)
  1834. {
  1835.          m00=pow(Getm(0,0),double (m+n)/2);
  1836.  flat=1;
  1837. }
  1838.      GetCm=GetCm/m00;
  1839. return GetCm;
  1840. }
  1841. double CFaceDetectView::Getmleye(int n,int m)
  1842. {
  1843.  double GetCmleye=0;
  1844.     for(int i=(v_top-v_bottom)/2+L_beye,y=1;i<=(v_top-v_bottom)/2+L_teye;i++,y++)
  1845. for(int j=H_lreye,x=1;j<=H_lleye;j++,x++)
  1846. {  
  1847.           double Getx=0.0;
  1848.   Getx=pow(i-Zx,-n);
  1849.           double Gety=0.0;
  1850.   Gety=pow(j-Zy,-m);
  1851.   int fij;
  1852.   if(WhiteBlack[i][j]==0)
  1853.   fij=1;
  1854.   else 
  1855.   fij=0;
  1856.   GetCmleye=GetCmleye+fij*Getx*Gety;
  1857. }
  1858. return GetCmleye;
  1859. }
  1860. double CFaceDetectView::Getmreye(int n,int m)
  1861. {
  1862.    double GetCmreye=0;
  1863.     for(int i=(v_top-v_bottom)/2+R_beye,y=1;i<(v_top-v_bottom)/2+R_teye;i++,y++)  
  1864. for(int j=H_rreye,x=1;j<=H_rleye;j++,x++)
  1865. {  
  1866.           double Getx=0.0;
  1867.   Getx=pow(i-Zx,-n);
  1868.           double Gety=0.0;
  1869.   Gety=pow(j-Zy,-m);
  1870.   int fij;
  1871.   if(WhiteBlack[i][j]==0)
  1872.   fij=1;
  1873.   else 
  1874.   fij=0;
  1875.   GetCmreye=GetCmreye+fij*Getx*Gety;
  1876. }
  1877.       return GetCmreye;
  1878. }
  1879. void CFaceDetectView::OnPROSSINGdetect() 
  1880. {
  1881. // TODO: Add your command handler code here
  1882.      UpdateData(TRUE);
  1883.      CString SQLstr;
  1884.  double temp=0.0;
  1885.  int Count=100;
  1886. ///////////////////////////////////////////////////////////////////
  1887.     SQLstr = "SELECT username,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,Picture,Sex,Age,Birthday,Teleph,Address FROM CParameter";
  1888.     theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  1889.  Count=theApp.m_pADOSet->GetRecordCount();
  1890.   CFaceDetectDoc *doc=new CFaceDetectDoc();
  1891.  CString name="liminyue2";
  1892.  int nResponse=0;
  1893.      if(Count==0)
  1894.  {
  1895.   message *dlgname=new message(); 
  1896.      int GN=dlgname->DoModal();
  1897.   /////弹出对话框插入///////////
  1898.        if(GN==IDOK)
  1899.    {
  1900.      name=dlgname->m_Name;
  1901.      ////插入
  1902.      ADDFace(name);
  1903.    }
  1904.  }
  1905. /*  CFaceDetectApp *App1;//=new CFaceDetectApp();
  1906.  
  1907.      if(Count==0&&Study==0)
  1908.  {  
  1909.        nResponse =App1->study();
  1910.    if (nResponse == 1)
  1911.    {   
  1912.      MessageName dlgname;
  1913.            GetName=App1->Message();
  1914.    if(GetName==1)
  1915.           name=dlgname.m_username;
  1916.    else
  1917.    return ;
  1918.    CString s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11;
  1919.    s1.Format("%d",x1);
  1920.    s2.Format("%d",x2);
  1921.    s3.Format("%d",x3);
  1922.    s4.Format("%d",x4);
  1923.    s5.Format("%d",x5);
  1924.    s6.Format("%d",x6);
  1925.    s7.Format("%d",x7);
  1926.    s8.Format("%d",x8);
  1927.    s9.Format("%d",x9);
  1928.    s10.Format("%d",x10);
  1929.    s11.Format("%d",x11);
  1930.    CString path=doc->path;
  1931.    name="li";
  1932.    SQLstr ="insert into CParameter (username,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,Picture) values('"+name+","+s1+","+s2+","+s3+","+s4+","+s5+","+s6+","+s7+","+s8+","+s9+","+s10+","+s11+","+path+"')";
  1933.        theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  1934.     UpdateData(TRUE);
  1935. ::AfxMessageBox("请确认图片中是否有人脸!");
  1936.    }
  1937.    else if (nResponse == 0)
  1938.    {
  1939.       return ;
  1940.    }
  1941.  }
  1942. */
  1943. _variant_t sName;
  1944. _variant_t sE;
  1945. _variant_t aG;
  1946. _variant_t bI;
  1947. _variant_t tE;
  1948. _variant_t aD;
  1949. _variant_t pI;
  1950. _variant_t Y1;
  1951. _variant_t Y2;
  1952. _variant_t Y3;
  1953. _variant_t Y4;
  1954. _variant_t Y5;
  1955. _variant_t Y6;
  1956. _variant_t Y7;
  1957. _variant_t Y8;
  1958. _variant_t Y9;
  1959. _variant_t Y10;
  1960. _variant_t Y11;
  1961. if(Count>0)
  1962. {
  1963.    
  1964.      theApp.m_pADOSet->MoveFirst();
  1965.       _variant_t UnameY=theApp.m_pADOSet->GetCollect("username");
  1966.        sName=UnameY;
  1967.       Y1=theApp.m_pADOSet->GetCollect("X1");
  1968.       Y2=theApp.m_pADOSet->GetCollect("X2");
  1969.       Y3=theApp.m_pADOSet->GetCollect("X3");
  1970.       Y4=theApp.m_pADOSet->GetCollect("X4");
  1971.       Y5=theApp.m_pADOSet->GetCollect("X5");
  1972.       Y6=theApp.m_pADOSet->GetCollect("X6");
  1973.       Y7=theApp.m_pADOSet->GetCollect("X7");
  1974.       Y8=theApp.m_pADOSet->GetCollect("X8");
  1975.       Y9=theApp.m_pADOSet->GetCollect("X9");
  1976.       Y10=theApp.m_pADOSet->GetCollect("X10");
  1977.   Y11=theApp.m_pADOSet->GetCollect("X11");
  1978.                pI=theApp.m_pADOSet->GetCollect("Picture");
  1979.               sE=theApp.m_pADOSet->GetCollect("Sex");
  1980.   aG=theApp.m_pADOSet->GetCollect("Age");
  1981.   bI=theApp.m_pADOSet->GetCollect("Birthday");
  1982.   tE=theApp.m_pADOSet->GetCollect("Teleph");
  1983.   aD=theApp.m_pADOSet->GetCollect("Address");
  1984.      
  1985.   theApp.m_pADOSet->MoveNext();
  1986.   
  1987.   for(int i=0;i<Count-1;i=i+1)
  1988.   {
  1989.   
  1990.   
  1991.       _variant_t UnameZ=theApp.m_pADOSet->GetCollect("username");
  1992.       _variant_t Z1=theApp.m_pADOSet->GetCollect("X1");
  1993.       _variant_t Z2=theApp.m_pADOSet->GetCollect("X2");
  1994.       _variant_t Z3=theApp.m_pADOSet->GetCollect("X3");
  1995.       _variant_t Z4=theApp.m_pADOSet->GetCollect("X4");
  1996.       _variant_t Z5=theApp.m_pADOSet->GetCollect("X5");
  1997.       _variant_t Z6=theApp.m_pADOSet->GetCollect("X6");
  1998.       _variant_t Z7=theApp.m_pADOSet->GetCollect("X7");
  1999.       _variant_t Z8=theApp.m_pADOSet->GetCollect("X8");
  2000.       _variant_t Z9=theApp.m_pADOSet->GetCollect("X9");
  2001.       _variant_t Z10=theApp.m_pADOSet->GetCollect("X10");
  2002.   _variant_t Z11=theApp.m_pADOSet->GetCollect("X11");
  2003.                   
  2004.   
  2005.   int sum1=0;
  2006.   int sum2=0;
  2007.   if(fabs(double(Y1)-x1)>fabs(double(Z1)-x1))
  2008.           sum2++;
  2009.   else
  2010.   sum1++;
  2011.   if(fabs(double(Y2)-x2)>fabs(double(Z2)-x2))
  2012.           sum2++;
  2013.   else
  2014.   sum1++;
  2015.   
  2016.   if(fabs(double(Y3)-x3)>fabs(double(Z3)-x3))
  2017.           sum2++;
  2018.   else
  2019.   sum1++;
  2020.   if(fabs(double(Y4)-x4)>fabs(double(Z4)-x4))
  2021.           sum2++;
  2022.   else
  2023.   sum1++;
  2024.   if(fabs(double(Y5)-x5)>fabs(double(Z5)-x5))
  2025.           sum2++;
  2026.   else
  2027.   sum1++;
  2028.   if(fabs(double(Y6)-x6)>fabs(double(Z6)-x6))
  2029.           sum2++;
  2030.   else
  2031.   sum1++;
  2032.   if(fabs(double(Y7)-x7)>fabs(double(Z7)-x7))
  2033.           sum2++;
  2034.   else
  2035.   sum1++;
  2036.   
  2037.   if(fabs(double(Y8)-x8)>fabs(double(Z8)-x8))
  2038.           sum2++;
  2039.   else
  2040.   sum1++;
  2041.   if(fabs(double(Y9)-x9)>fabs(double(Z9)-x9))
  2042.           sum2++;
  2043.   else
  2044.   sum1++;
  2045.   if(fabs(double(Y10)-x10)>fabs(double(Z10)-x10))
  2046.           sum2++;
  2047.   else
  2048.   sum1++;
  2049.   if(fabs(double(Y11)-x11)>fabs(double(Z11)-x11))
  2050.           sum2++;
  2051.   else
  2052.   sum1++;
  2053.   if(sum1<sum2)
  2054.   {   sE=theApp.m_pADOSet->GetCollect("Sex");
  2055.   sE=theApp.m_pADOSet->GetCollect("Sex");
  2056.   aG=theApp.m_pADOSet->GetCollect("Age");
  2057.   bI=theApp.m_pADOSet->GetCollect("Birthday");
  2058.   tE=theApp.m_pADOSet->GetCollect("Teleph");
  2059.   aD=theApp.m_pADOSet->GetCollect("Address");
  2060.   pI=theApp.m_pADOSet->GetCollect("Picture");
  2061.   UnameY=UnameZ;
  2062.   sName=UnameY;
  2063.   Y1=Z1;
  2064.   Y2=Z2;
  2065.           Y2=Z2;
  2066.           Y3=Z3;
  2067.           Y4=Z4;
  2068.           Y5=Z5;
  2069.           Y6=Z6;
  2070.           Y7=Z7;
  2071.           Y8=Z8;
  2072.           Y9=Z9;
  2073.           Y10=Z10;
  2074.           Y11=Z11;
  2075.   }
  2076. theApp.m_pADOSet->MoveNext();
  2077.   }
  2078. }
  2079. double Dsum;
  2080.       CString a1=(char* )(_bstr_t)Y1;
  2081.   double b1=atof(a1);
  2082.   CString a2=(char* )(_bstr_t)x1;
  2083.   double b2=atof(a2);
  2084.       double Dsum1=fabs(b1-b2);
  2085.    a1=(char* )(_bstr_t)Y2;
  2086.    b1=atof(a1);
  2087.    a2=(char* )(_bstr_t)x2;
  2088.    b2=atof(a2);
  2089.       double Dsum2=fabs(b1-b2);
  2090.    
  2091.    a1=(char* )(_bstr_t)Y3;
  2092.    b1=atof(a1);
  2093.    a2=(char* )(_bstr_t)x3;
  2094.    b2=atof(a2);
  2095.       double Dsum3=fabs(b1-b2);
  2096.        a1=(char* )(_bstr_t)Y4;
  2097.    b1=atof(a1);
  2098.    a2=(char* )(_bstr_t)x4;
  2099.    b2=atof(a2);
  2100.       double Dsum4=fabs(b1-b2);
  2101.   a1=(char* )(_bstr_t)Y5;
  2102.    b1=atof(a1);
  2103.    a2=(char* )(_bstr_t)x5;
  2104.    b2=atof(a1);
  2105.       double Dsum5=fabs(b1-b2);
  2106.       a1=(char* )(_bstr_t)Y6;
  2107.    b1=atof(a1);
  2108.    a2=(char* )(_bstr_t)x6;
  2109.    b2=atof(a2);
  2110.       double Dsum6=fabs(b1-b2);
  2111.       a1=(char* )(_bstr_t)Y7;
  2112.    b1=atof(a1);
  2113.    a2=(char* )(_bstr_t)x7;
  2114.    b2=atof(a2);
  2115.       double Dsum7=fabs(b1-b2);
  2116.        a1=(char* )(_bstr_t)Y8;
  2117.    b1=atof(a1);
  2118.    a2=(char* )(_bstr_t)x8;
  2119.    b2=atof(a2);
  2120.       double Dsum8=fabs(b1-b2);
  2121.   a1=(char* )(_bstr_t)Y9;
  2122.    b1=atof(a1);
  2123.    a2=(char* )(_bstr_t)x9;
  2124.    b2=atof(a2);
  2125.       double Dsum9=fabs(b1-b2);
  2126.   a1=(char* )(_bstr_t)Y10;
  2127.    b1=atof(a1);
  2128.    a2=(char* )(_bstr_t)x10;
  2129.    b2=atof(a2);
  2130.       double Dsum10=fabs(b1-b2);
  2131.   a1=(char* )(_bstr_t)Y11;
  2132.    b1=atof(a1);
  2133.    a2=(char* )(_bstr_t)x11;
  2134.    b2=atof(a2);
  2135.       double Dsum11=fabs(b1-b2);
  2136.   
  2137.       Dsum=Dsum1+Dsum2+Dsum3+Dsum4+Dsum5+Dsum6+Dsum7+Dsum8+Dsum9+Dsum10+Dsum11;
  2138.      shujuyanchi *yanchi=new shujuyanchi();
  2139.  // yanchi->DoModal();
  2140.  
  2141.     for(int i=0;i<15000;i++)
  2142. {
  2143. for(int j=0;j<50000;j++)
  2144. {
  2145. ;
  2146. }
  2147. }
  2148.   yanchi->DestroyWindow();
  2149.         CFaceDetectDoc * InsertPicture=new CFaceDetectDoc();
  2150.         CString strTemp=(char* )(_bstr_t)pI;
  2151.         InsertPicture->OnOpenDocument1(strTemp);
  2152.         ShowPMessage *SPM=new ShowPMessage();
  2153.           SPM->m_Name=(char* )(_bstr_t)sName;//MessageBox("OK!");
  2154.           SPM->m_Sex=(char* )(_bstr_t)sE;
  2155.           SPM->m_Age=(char* )(_bstr_t)aG;
  2156.   SPM->m_Birthday=(char* )(_bstr_t)bI;
  2157.   SPM->m_Teleph=(char* )(_bstr_t)tE;
  2158.   SPM->m_Address=(char* )(_bstr_t)aD;
  2159.   SPM->DoModal();
  2160.    //MessageBox("OK!");
  2161.              
  2162.   //CString m_name="100";
  2163.  //SQLstr = "DELETE FROM CParameter WHERE (username)=('"+m_name+"')";
  2164.  //theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2165.   //name ="100";
  2166.  //SQLstr = "UPDATE CParameter SET username=('"+name+"') WHERE (username)=('"+m_name+"')";
  2167.  // theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2168. /* ////////////////////////////////////////////////////////////////////
  2169. for(i=0;i<Count;i++)
  2170. {
  2171.      SQLstr = "SELECT Name,EtoEAngle,EtoEThreshold, EtoNtoEAngle,EtoNtoEThreshold FROM CParameterusers ";
  2172.     theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2173. _variant_t Cunt=theApp.m_pADOSet->GetCollect("old");
  2174.  theApp.m_pADOSet->MpveNext();
  2175. }
  2176. //////////////////////////////////////////////////
  2177. if(flag)
  2178. {
  2179. // SQLstr = "insert into users (username) values('"+m_name+"')";
  2180. }
  2181.     */
  2182. }
  2183. ///////////////////////////////////平均值的标准偏差///////////////////////////////
  2184. double CFaceDetectView::AverageDeviation(double NewData,double OldData)
  2185. {   double Sx;
  2186. Sx=sqrt(((NewData-OldData)*(NewData-OldData))/2);
  2187. return Sx;
  2188. }
  2189. //////////////////////////////////// 画十字////////////////////////////
  2190. ///////////////////////////////////////////////////////////////////////////////////////////
  2191. void  CFaceDetectView::DrawCrossX(int X,int Y)
  2192. {
  2193. LPBYTE lpData;
  2194. lpData = gDib.FindDIBBits(hDIB);
  2195. WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  2196. int lOffset;
  2197. for(int j=X-4;j<X+4;j++)
  2198. {
  2199. lOffset = gDib.PixelOffset(Y, j, gwBytesPerLine);
  2200. *(lpData + lOffset) = 0;
  2201.         *(lpData + lOffset+1) = 0;
  2202.         *(lpData + lOffset+2) =255 ;
  2203. }
  2204. for(int i=Y-4;i<Y+4;i++)
  2205. {
  2206. lOffset = gDib.PixelOffset(i, X, gwBytesPerLine);
  2207. *(lpData + lOffset) = 0;
  2208.         *(lpData + lOffset+1) = 255;
  2209.         *(lpData + lOffset+2) =0 ;
  2210. }
  2211. Invalidate();
  2212. }
  2213. BOOL CFaceDetectView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
  2214. {
  2215. // TODO: Add your specialized code here and/or call the base class
  2216. // return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
  2217. if(CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext)==FALSE)
  2218. return false;
  2219.       
  2220.   CRect rc(10+100,10+50,320+10+100,240+10+50);
  2221.   m_VideoDisplay.Create("",WS_VISIBLE|WS_CHILD,rc,this,0);
  2222.       m_VideoDisplay.ShowWindow(SW_SHOW);
  2223.    
  2224. return TRUE;
  2225. }
  2226. void CFaceDetectView::OnIdVidio() 
  2227. {
  2228. // TODO: Add your command handler code here
  2229.     
  2230.     
  2231. if(flagP==false)
  2232. {
  2233.     CRect Rect;
  2234.     CAPDRIVERCAPS Caps;
  2235.     m_VideoDisplay.GetWindowRect(Rect);
  2236.     ScreenToClient(Rect);
  2237.     m_VFWImageProc.Initialize();
  2238.     m_VFWImageProc.DriverGetCaps(&Caps);
  2239. m_VFWImageProc.EnablePreviewVideo(*this, Rect.TopLeft().x,Rect.TopLeft().y);
  2240. flagP=true;
  2241. }
  2242. }
  2243. void CFaceDetectView::OnVidioCannel() 
  2244. {
  2245. // TODO: Add your command handler code here
  2246. m_VFWImageProc.Destroy();flagP=false;
  2247. }
  2248. BOOL Capture(CVFWImageProcessor &ImageProc, LPCTSTR Filename)//***********************
  2249. {
  2250.    ULONG Length = 0;
  2251.    CFile File;
  2252.    BOOL Ret = FALSE;
  2253.    CHAR Ext[_MAX_EXT];
  2254.    _splitpath(Filename,NULL,NULL,NULL,Ext);
  2255.    if (stricmp(Ext,".avi") == 0)
  2256.    {
  2257.       Ret = ImageProc.CaptureAVI(Filename,4.0,10,10);
  2258.    }
  2259.    else if (stricmp(Ext,".bmp") == 0)
  2260.    {
  2261.       BITMAPINFO *Bitmap = NULL;
  2262.       BITMAPFILEHEADER bfh;
  2263.       ImageProc.CaptureDIB(&Bitmap,0,&Length);
  2264.       if (Bitmap)
  2265.       {
  2266.          File.Open(Filename,CFile::modeCreate |
  2267.                                     CFile::modeWrite |
  2268.                                     CFile::shareDenyNone |
  2269.                                     CFile::typeBinary);
  2270.          bfh.bfType = 0x4d42;    // 0x42 = "B" 0x4d = "M"
  2271.          bfh.bfSize = (DWORD) Length + sizeof(BITMAPFILEHEADER);
  2272.          bfh.bfOffBits = (DWORD)   sizeof(BITMAPFILEHEADER) +
  2273.                                    sizeof(BITMAPINFOHEADER) +
  2274.                                     Bitmap->bmiHeader.biClrUsed * sizeof (RGBQUAD);
  2275.          bfh.bfReserved1 = 0;
  2276.          bfh.bfReserved2 = 0;
  2277.          File.Write(&bfh,sizeof(bfh));
  2278.          File.Write(Bitmap,Length);
  2279.          File.Close();
  2280.          Ret = TRUE;
  2281.          delete Bitmap;
  2282.       }
  2283.    }
  2284.    return Ret;
  2285. }
  2286. void CFaceDetectView::OnIdProssing()
  2287. {
  2288.    IdProssing();
  2289.    OnPROSSINGdetect();
  2290.  
  2291. }
  2292. void CFaceDetectView::IdProssing()
  2293. {
  2294. // TODO: Add your command handler code here
  2295.    CString Filter;
  2296.    CString Filename;
  2297.    CRect Rect;
  2298.  //  Filter = "Bitmap Files (*.bmp)|*.bmp|AVI Files (*.avi)|*.avi||";
  2299.  //  CFileDialog FileDlg(FALSE, "BMP", NULL,
  2300.                       // OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
  2301.                       // Filter,
  2302.                       // this);
  2303.   // if (FileDlg.DoModal() == IDOK)
  2304.   // {
  2305.       RedrawWindow();
  2306.       //Filename = FileDlg.GetPathName();
  2307.   
  2308.       Filename="d:"+pname+".bmp";
  2309.       Capture(m_VFWImageProc, Filename);
  2310.       m_VideoDisplay.GetWindowRect(Rect);
  2311.       ScreenToClient(Rect);
  2312.       m_VFWImageProc.EnablePreviewVideo(*this, Rect.TopLeft().x,Rect.TopLeft().y);
  2313.   //m_VFWImageProc.Destroy();
  2314.   flagP=false;
  2315.       CFaceDetectDoc * InsertPicture=new CFaceDetectDoc();
  2316.   InsertPicture->OnOpenDocument(Filename);
  2317.       InsertPicture->READYGetFaceOutLline1();
  2318.       ReadyLightingconpensate2();
  2319.   ReadyScale3();
  2320.   READYTemplate4();
  2321.   ReadyZft5();
  2322.   READYContrastEnhance6();
  2323.   ReadyWhiteblack7();
  2324.  bool jum=READYFixedPosition8();
  2325.           if(!jum)
  2326.   return ;
  2327.   GetNewParameter();
  2328.      
  2329.   
  2330.   Invalidate();
  2331. }
  2332. ////////////////高斯平滑//////////////////////////////////////////////////////
  2333. /////////////////////////////////////////////////////////////////////////////
  2334. void CFaceDetectView::OnREADYTemplate() 
  2335. {
  2336. // TODO: Add your command handler code here
  2337. if(!FaceGray)
  2338. {
  2339. ::AfxMessageBox("请确认是否进行灰度变化?");
  2340. return ;
  2341. }
  2342.     
  2343. READYTemplate4();
  2344. FaceGray=false;
  2345.     FaceGass=true;
  2346. }
  2347. void CFaceDetectView::READYTemplate4() 
  2348. {
  2349. //设定模板参数
  2350. double tem[9]={1,2,1,
  2351.            2,4,2,
  2352.    1,2,1};
  2353.     //设定模板系数
  2354.     double  xishu = 0.0625;   
  2355.     //进行模板操作
  2356. Template(tem ,3,3, xishu);
  2357. Invalidate(TRUE);
  2358. }
  2359. /*****************************************************
  2360. *   函数名称:
  2361. *      Template:
  2362. *
  2363. *    参数:
  2364. *    HDIB    hDIB         -图像的句柄
  2365. *      double  *tem         -指向模板的指针
  2366. *      int  tem_w           -模板的宽度
  2367. *      int  tem_h           -模板的高度
  2368. *      double xishu         -模板的系数
  2369. *         
  2370. *    功能:
  2371. *    对图像进行模板操作
  2372. *
  2373. *    说明:
  2374. *    为处理方便起见,模板的宽度和高度都应为奇数
  2375. *******************************************************/
  2376. void CFaceDetectView::Template(double * tem ,int tem_w,int tem_h,double xishu)
  2377. {
  2378.     //统计中间值
  2379.     double sum;
  2380.     //循环变量
  2381.     int i,j,m,n;
  2382. int w, h;
  2383. //获取图像的宽度
  2384. w = (v_right-v_left)+1;
  2385. //获取图像的高度
  2386. h = (v_top-v_bottom)+1;
  2387. HeightTemplate= new int*[v_top-v_bottom+1];
  2388. int k;
  2389. for( k=0;k<v_top-v_bottom+1;k++)
  2390.      HeightTemplate[k]=new int [v_right-v_left+1];
  2391. //对图像进行扫描
  2392.    
  2393. //行 
  2394.     for(i=0;i<h;i++)
  2395.     {  
  2396. //列
  2397.    for(j=0;j<w;j++)
  2398.    {   
  2399.    //为统计变量赋初始值
  2400.        sum=0;
  2401.          //对于图像的4个边框的象素保持原灰度不变
  2402.      if( j<((tem_w-1)/2) || j>(w-(tem_w+1)/2) || i<((tem_h-1)/2) || i>(h-(tem_h+1)/2) )
  2403.       HeightTemplate[i][j]=Gray[i][j];
  2404.  
  2405.          //对于其他的象素进行模板操作
  2406.  else 
  2407.          { 
  2408.           //将点(i,j)点作为模板的中心
  2409.           for(m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++)
  2410.           {
  2411.      for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)
  2412.     
  2413.              //将以点(i,j)为中心,与模板大小相同的范围内的象素与模板对用位置的系数
  2414.  //进行相乘并线形叠加
  2415.      sum+=Gray[m][n]* tem[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)];
  2416.   
  2417.   }
  2418.           
  2419.   //将结果乘上总的模板系数
  2420.           sum=(int)sum*xishu;
  2421.   //计算绝对值
  2422.   sum = fabs(sum);
  2423.   //如果小于0,强制赋值为0
  2424.           if(sum<0)     
  2425.           sum=0;
  2426.   //如果大于255,强制赋值为255
  2427.           if(sum>255)
  2428.   sum=255;
  2429.   //将计算的结果放到新的位图的相应位置
  2430.       HeightTemplate[i][j]=sum;
  2431.  }
  2432.    }
  2433. ///////////////////////////////////////////////////////////////////////
  2434. int k1;
  2435. LPBYTE lpData;
  2436. long lOffset;
  2437. lpData = gDib.FindDIBBits(hDIB);
  2438.     WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  2439.    for( i=v_bottom,k=0; i<=v_top; i++,k++)
  2440. for(j=v_left,k1=0; j<=v_right; j++,k1++)
  2441. {
  2442.            lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
  2443.        
  2444. //    *(lpData + lOffset)=HeightTemplate[k][k1];
  2445. //    *(lpData + lOffset+1)=HeightTemplate[k][k1];
  2446. //    *(lpData + lOffset+2)=HeightTemplate[k][k1];
  2447.    
  2448.   
  2449. }
  2450. ////////////////////////////////////////////////////////////////////////////  
  2451. }
  2452. void CFaceDetectView::OnGetName() 
  2453. { ::AfxMessageBox("人脸太小!无法准确识别!");
  2454. // TODO: Add your control notification handler code here
  2455. GetName *Name=new GetName();
  2456. CString name=Name->m_Name;
  2457. ADDFace(name);
  2458. }
  2459. void CFaceDetectView::ADDFace(CString name)
  2460. {       CString SQLstr;
  2461.    CFaceDetectDoc *doc=new CFaceDetectDoc();
  2462.    CString s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11;
  2463.    s1.Format("%f",x1);
  2464.    s2.Format("%f",x2);
  2465.    s3.Format("%f",x3);
  2466.    s4.Format("%f",x4);
  2467.    s5.Format("%f",x5);
  2468.    s6.Format("%f",x6);
  2469.    s7.Format("%f",x7);
  2470.    s8.Format("%f",x8);
  2471.    s9.Format("%f",x9);
  2472.    s10.Format("%f",x10);
  2473.    s11.Format("%f",x11);
  2474.     //LPCTSTR path=doc->path;
  2475.   CString path="11";
  2476.    SQLstr ="insert into CParameter (username,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,Picture) values('"+name+"','"+s1+"','"+s2+"','"+s3+"','"+s4+"','"+s5+"','"+s6+"','"+s7+"','"+s8+"','"+s9+"','"+s10+"','"+s11+"','"+path+"')";
  2477.        theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2478.    
  2479. }
  2480. void CFaceDetectView::OnProssingStudy() 
  2481. {
  2482. // TODO: Add your command handler code here
  2483.  int num;
  2484. GetStudyNum * St=new GetStudyNum();
  2485. int op=St->DoModal();
  2486. if(op==IDOK)
  2487. num=St->m_Num;
  2488. else
  2489. return ;
  2490. if(num==0)
  2491. return ;
  2492. double *x_1;
  2493.  x_1=new double [num];
  2494.  double  *x_2;
  2495.  x_2=new double [num];
  2496.  double  *x_3;
  2497.  x_3=new double [num];
  2498.  double  *x_4;
  2499.  x_4=new double [num];
  2500.  double  *x_5;
  2501.  x_5=new double [num];
  2502.  double  *x_6;
  2503.  x_6=new double [num];
  2504.  double  *x_7;
  2505.  x_7=new double [num];
  2506.  double  *x_8;
  2507.  x_8=new double [num];
  2508.  double  *x_9;
  2509.  x_9=new double [num];
  2510.  double  *x_10;
  2511.  x_10=new double [num];
  2512.  double  *x_11;
  2513.  x_11=new double [num];
  2514.  
  2515.    CString M_Name;
  2516.    CString M_Sex;
  2517.    int  M_Age;
  2518.    CString M_Birthday;
  2519.    CString M_Tel;
  2520.    CString M_Add;
  2521.   message *dlgname=new message(); 
  2522.      int GN=dlgname->DoModal();
  2523.   /////弹出对话框插入///////////
  2524.        if(GN==IDOK)
  2525.    {
  2526.     M_Name=dlgname->m_Name;
  2527. M_Sex=dlgname->m_Sex;
  2528. M_Age=dlgname->m_Age;
  2529. M_Birthday=dlgname->m_Birthday;
  2530. M_Tel=dlgname->m_Tle;
  2531. M_Add=dlgname->m_Addresss;
  2532.    }
  2533.    else
  2534.    return ;
  2535.    pname=M_Name;
  2536.   Tishi *TS=new Tishi();
  2537.  
  2538. for(int i=0;i<num;i++)
  2539. {
  2540.      
  2541.      
  2542.      
  2543.      TS->m_number=i+1;
  2544.  op=TS->DoModal();
  2545.  IdProssing();
  2546.      x_1[i]=x1;
  2547.  x_2[i]=x2;
  2548.  x_3[i]=x3;
  2549.  x_4[i]=x4;
  2550.  x_5[i]=x5;
  2551.  x_6[i]=x6;
  2552.  x_7[i]=x7;
  2553.  x_8[i]=x8;
  2554.  x_9[i]=x9;
  2555.  x_10[i]=x10;
  2556.  x_11[i]=x11;
  2557.  
  2558. }
  2559. double sum_1=0;
  2560. double sum_2=0;
  2561. double sum_3=0;
  2562. double sum_4=0;
  2563. double sum_5=0;
  2564. double sum_6=0;
  2565. double sum_7=0;
  2566. double sum_8=0;
  2567. double sum_9=0;
  2568. double sum_10=0;
  2569. double sum_11=0;
  2570. for(int j=0;j<i;j++)
  2571. {
  2572. sum_1=sum_1+x_1[j];
  2573.     sum_2=sum_2+x_2[j];
  2574.     sum_3=sum_3+x_3[j];
  2575.     sum_4=sum_4+x_4[j];
  2576.     sum_5=sum_5+x_5[j];
  2577.     sum_6=sum_6+x_6[j];
  2578.     sum_7=sum_7+x_7[j];
  2579.     sum_8=sum_8+x_8[j];
  2580.     sum_9=sum_9+x_9[j];
  2581.     sum_10=sum_10+x_10[j];
  2582.     sum_11=sum_11+x_11[j];
  2583. }
  2584. sum_1=sum_1/i;
  2585. sum_2=sum_2/i;
  2586. sum_3=sum_3/i;
  2587. sum_4=sum_4/i;
  2588. sum_5=sum_5/i;
  2589. sum_6=sum_6/i;
  2590. sum_7=sum_7/i;
  2591. sum_8=sum_8/i;
  2592. sum_9=sum_9/i;
  2593. sum_10=sum_10/i;
  2594. sum_11=sum_11/i;
  2595.        CString SQLstr;
  2596.   
  2597.    CString s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12;
  2598.    s1.Format("%f",sum_1);
  2599.    s2.Format("%f",sum_2);
  2600.    s3.Format("%f",sum_3);
  2601.    s4.Format("%f",sum_4);
  2602.    s5.Format("%f",sum_5);
  2603.    s6.Format("%f",sum_6);
  2604.    s7.Format("%f",sum_7);
  2605.    s8.Format("%f",sum_8);
  2606.    s9.Format("%f",sum_9);
  2607.    s10.Format("%f",sum_10);
  2608.    s11.Format("%f",sum_11);
  2609.    s12.Format("%f", M_Age);
  2610.     //LPCTSTR path=doc->path;
  2611.     CString path="d:"+pname+".bmp";
  2612.    SQLstr ="insert into CParameter (username,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,Picture,Sex,Age,Birthday,Teleph,Address) values('"+M_Name+"','"+s1+"','"+s2+"','"+s3+"','"+s4+"','"+s5+"','"+s6+"','"+s7+"','"+s8+"','"+s9+"','"+s10+"','"+s11+"','"+path+"','"+M_Sex+"','"+s12+"','"+M_Birthday+"','"+M_Tel+"','"+M_Add+"')";
  2613.        theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2614. }
  2615. void CFaceDetectView::OnDetectface() 
  2616. {
  2617. // TODO: Add your command handler code here
  2618. CFaceDetectDoc * InsertPicture=new CFaceDetectDoc();
  2619.  if(!hDIB)
  2620.  {::AfxMessageBox("请确定是否有需要识别的图像!");return ;}
  2621.       InsertPicture->READYGetFaceOutLline1();
  2622.       ReadyLightingconpensate2();
  2623.   ReadyScale3();
  2624.   READYTemplate4();
  2625.   ReadyZft5();
  2626.   READYContrastEnhance6();
  2627.   ReadyWhiteblack7();
  2628.   bool jum=READYFixedPosition8();
  2629.           if(!jum)
  2630.   return ;
  2631.   GetNewParameter();
  2632.    
  2633.   OnPROSSINGdetect();
  2634. }
  2635. void CFaceDetectView::OnStudyMenuitem32798() 
  2636. {
  2637. // TODO: Add your command handler code here
  2638.   
  2639.    CString M_Name;
  2640.    CString M_Sex;
  2641.    int  M_Age;
  2642.    CString M_Birthday;
  2643.    CString M_Tel;
  2644.    CString M_Add;
  2645.    message *dlgname=new message(); 
  2646.      int GN=dlgname->DoModal();
  2647.   /////弹出对话框插入///////////
  2648.        if(GN==IDOK)
  2649.    {
  2650.     M_Name=dlgname->m_Name;
  2651. M_Sex=dlgname->m_Sex;
  2652. M_Age=dlgname->m_Age;
  2653. M_Birthday=dlgname->m_Birthday;
  2654. M_Tel=dlgname->m_Tle;
  2655. M_Add=dlgname->m_Addresss;
  2656.    }
  2657.    else
  2658.    return ;
  2659.    pname=M_Name;
  2660.  CFaceDetectDoc * InsertPicture=new CFaceDetectDoc();
  2661. InsertPicture->READYGetFaceOutLline1();
  2662.       ReadyLightingconpensate2();
  2663.   ReadyScale3();
  2664.   READYTemplate4();
  2665.   ReadyZft5();
  2666.   READYContrastEnhance6();
  2667.   ReadyWhiteblack7();
  2668.   READYFixedPosition8();
  2669.   GetNewParameter();
  2670.    CString SQLstr;
  2671.   
  2672.    CString s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12;
  2673.    s1.Format("%f",x1);
  2674.    s2.Format("%f",x2);
  2675.    s3.Format("%f",x3);
  2676.    s4.Format("%f",x4);
  2677.    s5.Format("%f",x5);
  2678.    s6.Format("%f",x6);
  2679.    s7.Format("%f",x7);
  2680.    s8.Format("%f",x8);
  2681.    s9.Format("%f",x9);
  2682.    s10.Format("%f",x10);
  2683.    s11.Format("%f",x11);
  2684.    s12.Format("%d", M_Age);
  2685.     //LPCTSTR path=doc->path;
  2686.     CString path="d:"+pname+".bmp";
  2687.    SQLstr ="insert into CParameter (username,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,Picture,Sex,Age,Birthday,Teleph,Address) values('"+M_Name+"','"+s1+"','"+s2+"','"+s3+"','"+s4+"','"+s5+"','"+s6+"','"+s7+"','"+s8+"','"+s9+"','"+s10+"','"+s11+"','"+path+"','"+M_Sex+"','"+s12+"','"+M_Birthday+"','"+M_Tel+"','"+M_Add+"')";
  2688.        theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2689.    
  2690.    
  2691. }
  2692. void CFaceDetectView::OnDatabaseFind() 
  2693. {
  2694. // TODO: Add your command handler code here
  2695.     FINDMESSAGE *Find=new FINDMESSAGE();
  2696. _variant_t sE;
  2697.     _variant_t aG;
  2698.     _variant_t bI;
  2699.     _variant_t tE;
  2700.     _variant_t aD;
  2701. _variant_t UnameY;
  2702. int ok=Find->DoModal();
  2703. if(ok==IDOK)
  2704. {   
  2705. CString SQLstr = "SELECT username,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,Picture,Sex,Age,Birthday,Teleph,Address FROM CParameter";
  2706. theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2707.     int Count=theApp.m_pADOSet->GetRecordCount();
  2708.         theApp.m_pADOSet->MoveFirst();
  2709. for(int i=0;i<Count;i++)
  2710. {
  2711. UnameY=theApp.m_pADOSet->GetCollect("username");
  2712. sE=theApp.m_pADOSet->GetCollect("Sex");
  2713. aG=theApp.m_pADOSet->GetCollect("Age");
  2714. bI=theApp.m_pADOSet->GetCollect("Birthday");
  2715. tE=theApp.m_pADOSet->GetCollect("Teleph");
  2716. aD=theApp.m_pADOSet->GetCollect("Address");
  2717. CString a1=(char* )(_bstr_t)UnameY;
  2718.    
  2719. if(a1==Find->m_Name)
  2720. {
  2721.          
  2722.           ShowPMessage *SPM=new ShowPMessage();
  2723.           SPM->m_Name=(char* )(_bstr_t)UnameY;//MessageBox("OK!");
  2724.           SPM->m_Sex=(char* )(_bstr_t)sE;
  2725.           SPM->m_Age=(char* )(_bstr_t)aG;
  2726.   SPM->m_Birthday=(char* )(_bstr_t)bI;
  2727.   SPM->m_Teleph=(char* )(_bstr_t)tE;
  2728.   SPM->m_Address=(char* )(_bstr_t)aD;
  2729.   SPM->DoModal();
  2730.           return ;
  2731. }
  2732. theApp.m_pADOSet->MoveNext();
  2733. }
  2734.         Meg *Ts=new Meg();
  2735. int ok1=Ts->DoModal();
  2736. return ;
  2737. }
  2738. }
  2739. void CFaceDetectView::OnDATABASEDelete() 
  2740. {
  2741. // TODO: Add your command handler code here
  2742.     DelectMessage *opn=new DelectMessage();
  2743. int op=opn->DoModal();
  2744. CString a1;
  2745. CString SQLstr = "SELECT username,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10,X11,Picture,Sex,Age,Birthday,Teleph,Address FROM CParameter";
  2746. theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2747.     int Count=theApp.m_pADOSet->GetRecordCount();
  2748.         theApp.m_pADOSet->MoveFirst();
  2749.   if(op==IDOK)
  2750. {
  2751. for(int i=0;i<Count;i++)
  2752. {
  2753.  _variant_t UnameY=theApp.m_pADOSet->GetCollect("username");
  2754.  a1=(char* )(_bstr_t)UnameY;
  2755.    
  2756. if(a1==opn->m_Name)
  2757. {
  2758.          ::AfxMessageBox("删除成功!");
  2759.  CString m_name=opn->m_Name;
  2760.          CString SQLstr = "DELETE FROM CParameter WHERE (username)=('"+m_name+"')";
  2761.          theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2762.  break;
  2763. }
  2764.       theApp.m_pADOSet->MoveNext();
  2765. }
  2766.    if(a1!=opn->m_Name)
  2767.     ::AfxMessageBox("删除不成功!");
  2768.      
  2769. }
  2770. }
  2771. void CFaceDetectView::OnMenuitem32799() 
  2772. {
  2773. // TODO: Add your command handler code here
  2774. XiuGai *XG=new XiuGai();
  2775. CString s1;
  2776. if(XG->DoModal()==IDOK)
  2777. {
  2778. if(XG->flagN==1)
  2779. {
  2780. CString m_name=XG->m_Xname;
  2781. CString name = XG->m_Name;
  2782.     CString SQLstr = "UPDATE CParameter SET username=('"+name+"') WHERE (username)=('"+m_name+"')";
  2783.     theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2784. XG->flagN=0;
  2785. }
  2786. if(XG->flagA==1)
  2787. {
  2788. CString m_name=XG->m_Xname;
  2789. s1.Format("%d",XG->m_Age);
  2790. CString name = s1;
  2791.     CString SQLstr = "UPDATE CParameter SET Age=('"+name+"') WHERE (username)=('"+m_name+"')";
  2792.     theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2793. XG->flagA=0;
  2794. }
  2795. if(XG->flagT==1)
  2796. {
  2797. CString m_name=XG->m_Xname;
  2798. CString name = XG->m_Tel;
  2799.     CString SQLstr = "UPDATE CParameter SET Teleph=('"+name+"') WHERE (username)=('"+m_name+"')";
  2800.     theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2801. XG->flagT=0;
  2802. }
  2803. if(XG->flagB==1)
  2804. {
  2805. CString m_name=XG->m_Xname;
  2806. CString name = XG->m_Birthday;
  2807.     CString SQLstr = "UPDATE CParameter SET Birthday=('"+name+"') WHERE (username)=('"+m_name+"')";
  2808.     theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2809. XG->flagB=0;
  2810. }
  2811. if(XG->flagAD==1)
  2812. {
  2813. CString m_name=XG->m_Xname;
  2814. CString name = XG->m_Add;
  2815.     CString SQLstr = "UPDATE CParameter SET Address=('"+name+"') WHERE (username)=('"+m_name+"')";
  2816.     theApp.ADOExecute(theApp.m_pADOSet,SQLstr);
  2817. XG->flagAD=0;
  2818. }
  2819. }
  2820. }