ChafenMul.cpp
上传用户:smdfuse
上传日期:2015-11-06
资源大小:98k
文件大小:3k
源码类别:

图形图象

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "ChafenMul.h"
  3. /************************************************************************
  4. * 函数名称:
  5. *     ChafenMul
  6. *
  7. * 参数:
  8. *     int width-帧宽度
  9. *     int height-帧高度
  10. *
  11. * 说明:
  12. *     构造函数,并分配内存空间,参数为帧的高度和宽度
  13. ************************************************************************/
  14. ChafenMul::ChafenMul(int width,int height,int _targetThreshold):
  15. targetThreshold(_targetThreshold),frameWidth(width),frameHeight(height),
  16. frame1(NULL),frame2(NULL),frame3(NULL),frame4(NULL)
  17. {
  18. frame1 = new unsigned char[width * height];
  19. frame2 = new unsigned char[width * height];
  20. frame3 = new unsigned char[width * height];
  21. frame4 = new unsigned char[width * height];
  22. memset(frame1,0,sizeof(unsigned char) * width * height);
  23. memset(frame2,0,sizeof(unsigned char) * width * height);
  24. memset(frame3,0,sizeof(unsigned char) * width * height);
  25. memset(frame4,0,sizeof(unsigned char) * width * height);
  26. readyCount = 0;
  27. }
  28. /************************************************************************
  29. * 函数名称:
  30. *     ~ChafenMul
  31. *
  32. * 说明:
  33. *     析构函数,释放内存空间
  34. ************************************************************************/
  35. ChafenMul::~ChafenMul()
  36. {
  37. if(frame1 != NULL) delete[] frame1;
  38. if(frame2 != NULL) delete[] frame2;
  39. if(frame3 != NULL) delete[] frame3;
  40. if(frame4 != NULL) delete[] frame4;
  41. }
  42. /************************************************************************
  43. * 函数名称:
  44. *     PrepareData
  45. *
  46. * 参数:
  47. *     unsigned char *buffer-输入图像数据
  48. *     int width-帧宽度
  49. *     int height-帧高度
  50. *
  51. * 说明:
  52. *  输入帧图像数据,并分别将帧图像数据拷贝至缓存中
  53. ************************************************************************/
  54. void ChafenMul::PrepareData(unsigned char *buffer,int width,int height)
  55. {
  56. if(readyCount == 0)
  57. memcpy(frame1,buffer,width * height * sizeof(unsigned char));
  58. if(readyCount == 1)
  59. memcpy(frame2,buffer,width * height * sizeof(unsigned char));
  60. if(readyCount == 2)
  61. memcpy(frame3,buffer,width * height * sizeof(unsigned char));
  62. if(readyCount == 3)
  63. memcpy(frame4,buffer,width * height * sizeof(unsigned char))
  64. ;
  65. readyCount ++;
  66. if(readyCount == 4)
  67. readyCount = 0;
  68. }
  69. /************************************************************************
  70. * 函数名称:
  71. *     process
  72. *
  73. * 说明:
  74. *     差分相乘法检测目标
  75. ************************************************************************/
  76. void ChafenMul::process()
  77. {
  78. int * mul = new int[frameWidth * frameHeight];
  79. for(int j = 0; j < frameHeight; j ++)
  80. {
  81. for(int i = 0; i < frameWidth; i ++)
  82. {
  83. frame1[j*frameWidth+i]=abs(frame3[j*frameWidth+i] - frame1[j * frameWidth + i]);
  84. frame2[j*frameWidth+i]=abs(frame4[j*frameWidth+ i] - frame2[j * frameWidth + i]);
  85. mul[j*frameWidth +i] = frame1[j * frameWidth + i] * frame2[j * frameWidth + i];
  86. if(mul[j*frameWidth +i] > targetThreshold)
  87. {
  88. frame1[j * frameWidth + i] = 255;
  89. }else
  90. frame1[j * frameWidth + i] = 0;
  91. }
  92. }
  93. //对frame1运用静态背景检测的方法并计算目标形心的位置
  94. //释放空间
  95. delete[] mul;
  96. }