IntegralImage.h
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:8k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * cubicles
  3.   *
  4.   * This is an implementation of the Viola-Jones object detection 
  5.   * method and some extensions.  The code is mostly platform-
  6.   * independent and uses only standard C and C++ libraries.  It
  7.   * can make use of MPI for parallel training and a few Windows
  8.   * MFC functions for classifier display.
  9.   *
  10.   * Mathias Kolsch, matz@cs.ucsb.edu
  11.   *
  12.   * $Id: IntegralImage.h,v 1.71 2005/02/12 02:00:59 matz Exp $
  13. **/
  14. // IntegralImage is the basic data type for training and 
  15. // recognition: a simple accumulative matrix generated from a 
  16. // gray-level image, akin a "data cube" as known in the database
  17. // community.
  18. // This file includes IntegralImage.cxx
  19. //
  20. ////////////////////////////////////////////////////////////////////
  21. //
  22. // By downloading, copying, installing or using the software you 
  23. // agree to this license.  If you do not agree to this license, 
  24. // do not download, install, copy or use the software.
  25. //
  26. // Copyright (C) 2004, Mathias Kolsch, all rights reserved.
  27. // Third party copyrights are property of their respective owners.
  28. //
  29. // Redistribution and use in binary form, with or without 
  30. // modification, is permitted for non-commercial purposes only.
  31. // Redistribution in source, with or without modification, is 
  32. // prohibited without prior written permission.
  33. // If granted in writing in another document, personal use and 
  34. // modification are permitted provided that the following two
  35. // conditions are met:
  36. //
  37. // 1.Any modification of source code must retain the above 
  38. //   copyright notice, this list of conditions and the following 
  39. //   disclaimer.
  40. //
  41. // 2.Redistribution's in binary form must reproduce the above 
  42. //   copyright notice, this list of conditions and the following 
  43. //   disclaimer in the documentation and/or other materials provided
  44. //   with the distribution.
  45. //
  46. // This software is provided by the copyright holders and 
  47. // contributors "as is" and any express or implied warranties, 
  48. // including, but not limited to, the implied warranties of 
  49. // merchantability and fitness for a particular purpose are 
  50. // disclaimed.  In no event shall the copyright holder or 
  51. // contributors be liable for any direct, indirect, incidental, 
  52. // special, exemplary, or consequential damages (including, but not 
  53. // limited to, procurement of substitute goods or services; loss of 
  54. // use, data, or profits; or business interruption) however caused
  55. // and on any theory of liability, whether in contract, strict 
  56. // liability, or tort (including negligence or otherwise) arising 
  57. // in any way out of the use of this software, even if advised of 
  58. // the possibility of such damage.
  59. //
  60. ////////////////////////////////////////////////////////////////////
  61. #include "cubicles.hpp"
  62. #include "Image.h"
  63. #if !defined(__INTEGRALIMAGE_H__INCLUDED_)
  64. #define __INTEGRALIMAGE_H__INCLUDED_
  65. #if _MSC_VER > 1000
  66. #pragma once
  67. #endif // _MSC_VER > 1000
  68. #ifdef WIN32
  69. #define isnan _isnan
  70. #endif // WIN32
  71. //namespace {  // cubicles
  72. extern int g_verbose; // defined in IntegralFeatures.cpp
  73. extern FILE* g_ostream; // defined in IntegralFeatures.cpp
  74. #if defined(DEBUG) && defined(WIN32_todo)
  75. #define VERBOSE0(level, fmt) DbgLog((LOG_CUSTOM1, level, fmt))
  76. #define VERBOSE1(level, fmt,x) DbgLog((LOG_CUSTOM1, level, fmt,x))
  77. #define VERBOSE2(level, fmt,x,y) DbgLog((LOG_CUSTOM1, level, fmt,x,y))
  78. #define VERBOSE3(level, fmt,x,y,z) DbgLog((LOG_CUSTOM1, level, fmt,x,y,z))
  79. #define VERBOSE4(level, fmt,x,y,z,k) DbgLog((LOG_CUSTOM1, level, fmt,x,y,z,k))
  80. #define VERBOSE5(level, fmt,x,y,z,k,l) DbgLog((LOG_CUSTOM1, level, fmt,x,y,z,k,l))
  81. #define VERBOSE6(level, fmt,x,y,z,k,l,m) DbgLog((LOG_CUSTOM1, level, fmt,x,y,z,k,l,m))
  82. #else // DEBUG && WIN32
  83. #define VERBOSE0(level, fmt) if (g_verbose>=level) {fprintf(g_ostream, fmt); fprintf(g_ostream, "n"); fflush(g_ostream);}
  84. #define VERBOSE1(level, fmt,x) if (g_verbose>=level) {fprintf(g_ostream, fmt,x); fprintf(g_ostream, "n"); fflush(g_ostream);}
  85. #define VERBOSE2(level, fmt,x,y) if (g_verbose>=level) {fprintf(g_ostream, fmt,x,y); fprintf(g_ostream, "n"); fflush(g_ostream);}
  86. #define VERBOSE3(level, fmt,x,y,z) if (g_verbose>=level) {fprintf(g_ostream, fmt,x,y,z); fprintf(g_ostream, "n"); fflush(g_ostream);}
  87. #define VERBOSE4(level, fmt,x,y,z,k) if (g_verbose>=level) {fprintf(g_ostream, fmt,x,y,z,k); fprintf(g_ostream, "n"); fflush(g_ostream);}
  88. #define VERBOSE5(level, fmt,x,y,z,k,l) if (g_verbose>=level) {fprintf(g_ostream, fmt,x,y,z,k,l); fprintf(g_ostream, "n"); fflush(g_ostream);}
  89. #define VERBOSE6(level, fmt,x,y,z,k,l,m) if (g_verbose>=level) {fprintf(g_ostream, fmt,x,y,z,k,l,m); fprintf(g_ostream, "n"); fflush(g_ostream);}
  90. #endif // DEBUG
  91. #define ITTS_VERSION_1_0_STRING "Integration-Templates TrainingSet file, version 1.0"
  92. #define ITTS_VERSION_1_1_STRING "Integration-Templates TrainingSet file, version 1.1"
  93. #define ITTS_VERSION_1_2_STRING "Integration-Templates TrainingSet file, version 1.2"
  94. #define ITTS_VERSION_1_3_STRING "Integration-Templates TrainingSet file, version 1.3"
  95. #define IT_INTEGRALS_VERSION_1_3_STRING "Integration-Templates TrainingIntegrals file, version 1.3"
  96. #define IT_CONDUCTOR_VERSION_1_3_STRING "Integration-Templates VisionConductor file, version 1.3"
  97. #define IT_CONDUCTOR_VERSION_1_4_STRING "Integration-Templates VisionConductor file, version 1.4"
  98. typedef vector<int> CIntVector;
  99. typedef vector<CIntVector> CIntMatrix;
  100. typedef vector<double> CDoubleVector;
  101. typedef vector<CDoubleVector> CDoubleMatrix;
  102. typedef vector<float> CFloatVector;
  103. typedef vector<CRect> CRectVector;
  104. /////////////////////////////////////////////////////////////////////////////
  105. // CIntegralImageT
  106. /////////////////////////////////////////////////////////////////////////////
  107. template<class TYPE>
  108. class CIntegralImageT
  109. {
  110.   // Construction
  111.  public:
  112.   CIntegralImageT();
  113.   ~CIntegralImageT();
  114.   
  115.   // Operations
  116.  public:
  117.   TYPE operator[](int i) const;
  118.   TYPE GetElement(int col, int row) const;
  119.   void SetElement(int col, int row, TYPE val);
  120.   void IncElement(int col, int row, TYPE inc);
  121.   void CreateFrom(const CByteImage& image, bool normalize);
  122.   static void CreateSimpleNSquaredFrom(const CByteImage& image,
  123.                                        CIntegralImageT<TYPE>& integral,
  124.                                        CIntegralImageT<TYPE>& squared_integral,
  125.                                        const CRect& roi);
  126.   void SetSize(int width, int height);
  127.   int GetWidth() const { return m_width; }
  128.   int GetHeight() const { return m_height; }
  129.   
  130.   // raw data access, don't use this unless you implemented
  131.   // CIntegralImageT yourself;
  132.   // functions for MPI serialization
  133.   const TYPE* GetRawData() const { return m_pPaddedData; }
  134.   TYPE* GetRawData() { return m_pPaddedData; }
  135.   int GetRawDataLen() const { return m_arraylen;}
  136.   
  137.   template< class TYPE2 >
  138.     friend ostream& 
  139.     operator<< (ostream& os, const CIntegralImageT<TYPE2>& clsf);
  140.   
  141.   // Implementation
  142.  protected:
  143.   TYPE* m_pData;
  144.   TYPE* m_pPaddedData;
  145.   int m_width;
  146.   int m_padded_width;
  147.   int m_height;
  148.   int                           m_arraylen;
  149. };
  150. // NOTE: the matrix is padded with one row of zeros on top of the
  151. // actual matrix, and one column of zeros to the left of the actual
  152. // matrix. this allows us to take col==-1 || row==-1 and return zero
  153. // without a check. This padded datastructure is not visible to
  154. // the outside.
  155. #ifndef DEBUG  // debug version in CIntegralImage.cpp
  156. /*
  157. template<class TYPE>
  158. inline TYPE CIntegralImageT::operator[](int i) const
  159. { return m_pData[i]; }
  160. */
  161. template<class TYPE>
  162. inline TYPE CIntegralImageT<TYPE>::GetElement(int col, int row) const
  163. { return m_pData[row*m_padded_width+col]; }
  164. template<class TYPE>
  165. inline void CIntegralImageT<TYPE>::SetElement(int col, int row, TYPE val) 
  166. { m_pData[row*m_padded_width+col]=val; }
  167. template<class TYPE>
  168. inline void CIntegralImageT<TYPE>::IncElement(int col, int row, TYPE inc) 
  169. { m_pData[row*m_padded_width+col]+=inc; }
  170. #endif
  171. /////////////////////////////////////////////////////////////////////////////
  172. // CIntegralImage type instantiation
  173. /////////////////////////////////////////////////////////////////////////////
  174. // type of data in integration images:
  175. #if defined(II_TYPE_FLOAT)
  176. #define II_TYPE float
  177. #elif defined(II_TYPE_DOUBLE)
  178. #define II_TYPE double
  179. #elif defined(II_TYPE_INT)
  180. #define II_TYPE int
  181. #elif defined(II_TYPE_UINT)
  182. #define II_TYPE unsigned int
  183. #else 
  184. #error you must define II_TYPE
  185. #endif
  186. typedef CIntegralImageT<II_TYPE> CIntegralImage;
  187. #include "IntegralImage.cxx"
  188. //} // namespace cubicles
  189. #endif // !defined(__INTEGRALIMAGE_H__INCLUDED__)