HairFace.cpp
上传用户:yeung_1189
上传日期:2010-02-10
资源大小:3536k
文件大小:2k
源码类别:

图形/文字识别

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. // HairFace.cpp: 类CHairFace接口
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "FaceDetect.h"
  6. #include "HairFace.h"
  7. //////////////////////////////////////////////////////////////////////
  8. // 构造函数/析构函数
  9. //////////////////////////////////////////////////////////////////////
  10. //////////////////////////////////////////////////////////////////////
  11. // 构造函数
  12. // 参数:  source-原始数据
  13. //         width-图像宽度
  14. //         height-图像高度
  15. //////////////////////////////////////////////////////////////////////
  16. CHairFace::CHairFace(RGBQUAD ** source,int width,int height)
  17. {
  18. m_nWidth = width;
  19. m_nHeight= height;
  20. m_bBinaryOK = false;
  21. m_pSourceData = source;
  22. m_pBinaryArray = new  BYTE*[height];
  23. for(int i=0;i <height; i++)
  24. m_pBinaryArray[i] = new BYTE[width];
  25. }
  26. //////////////////////////////////////////////////////////////////////
  27. // 析构函数
  28. //////////////////////////////////////////////////////////////////////
  29. CHairFace::~CHairFace()
  30. {
  31. if(m_pBinaryArray!=NULL)
  32. {
  33. for(int i=0;i<m_nHeight;i++)
  34. if(m_pBinaryArray[i]!=NULL) delete m_pBinaryArray[i];
  35. delete m_pBinaryArray;
  36. }
  37. }
  38. //////////////////////////////////////////////////////////////////////
  39. // 标记脸和头发的位置
  40. //////////////////////////////////////////////////////////////////////
  41. void CHairFace::MarkHairFace()
  42. {
  43. int i,j;
  44. for(i=0;i<m_nHeight;i++)
  45. for(j=0;j<m_nWidth ;j++)
  46. {
  47. double r,g,Y,temp;
  48. temp = m_pSourceData[i][j].rgbGreen
  49. +m_pSourceData[i][j].rgbRed
  50. +m_pSourceData[i][j].rgbBlue;
  51. r = (double)m_pSourceData[i][j].rgbRed/temp;
  52. g = (double)m_pSourceData[i][j].rgbGreen/temp;
  53. Y = 0.30*m_pSourceData[i][j].rgbRed+0.59*m_pSourceData[i][j].rgbGreen
  54. +0.11*m_pSourceData[i][j].rgbBlue;
  55. if(g<0.398 && g > 0.246 && r<0.664 && r>0.333 && r>g && g>=0.5*(1-r))
  56. {
  57. m_pBinaryArray[i][j] = 0;  //脸的位置
  58. }
  59. else if(Y<40)
  60. {
  61. m_pBinaryArray[i][j] = 1;  //头发位置
  62. }
  63. else
  64. {
  65. m_pBinaryArray[i][j] = 2;  //什么也不是
  66. }
  67. }
  68. m_bBinaryOK = true;
  69. }