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

视频捕捉/采集

开发平台:

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: Scanner.h,v 1.30 2005/02/12 02:00:59 matz Exp $
  13. **/
  14. // Scanner scans across an image and finds matches for the 
  15. // classifier cascade.  There are two implementation files:
  16. // Scanner_Train.cpp for training-only functions and Scanner.cpp
  17. // for everything else.
  18. //
  19. ////////////////////////////////////////////////////////////////////
  20. //
  21. // By downloading, copying, installing or using the software you 
  22. // agree to this license.  If you do not agree to this license, 
  23. // do not download, install, copy or use the software.
  24. //
  25. // Copyright (C) 2004, Mathias Kolsch, all rights reserved.
  26. // Third party copyrights are property of their respective owners.
  27. //
  28. // Redistribution and use in binary form, with or without 
  29. // modification, is permitted for non-commercial purposes only.
  30. // Redistribution in source, with or without modification, is 
  31. // prohibited without prior written permission.
  32. // If granted in writing in another document, personal use and 
  33. // modification are permitted provided that the following two
  34. // conditions are met:
  35. //
  36. // 1.Any modification of source code must retain the above 
  37. //   copyright notice, this list of conditions and the following 
  38. //   disclaimer.
  39. //
  40. // 2.Redistribution's in binary form must reproduce the above 
  41. //   copyright notice, this list of conditions and the following 
  42. //   disclaimer in the documentation and/or other materials provided
  43. //   with the distribution.
  44. //
  45. // This software is provided by the copyright holders and 
  46. // contributors "as is" and any express or implied warranties, 
  47. // including, but not limited to, the implied warranties of 
  48. // merchantability and fitness for a particular purpose are 
  49. // disclaimed.  In no event shall the copyright holder or 
  50. // contributors be liable for any direct, indirect, incidental, 
  51. // special, exemplary, or consequential damages (including, but not 
  52. // limited to, procurement of substitute goods or services; loss of 
  53. // use, data, or profits; or business interruption) however caused
  54. // and on any theory of liability, whether in contract, strict 
  55. // liability, or tort (including negligence or otherwise) arising 
  56. // in any way out of the use of this software, even if advised of 
  57. // the possibility of such damage.
  58. //
  59. ////////////////////////////////////////////////////////////////////
  60. #ifndef __SCANNER_H
  61. #define __SCANNER_H
  62. #include "IntegralImage.h"
  63. #ifdef HAVE_FLOAT_H
  64. #include <float.h>
  65. #endif
  66. //namespace { // cubicles
  67. #ifndef CScanMatch_DEFINED
  68. #define CScanMatch_DEFINED
  69. class CScanMatch {
  70. public:
  71.   CScanMatch() 
  72.     : left(-1), top(-1), right(-1), bottom(-1),
  73.     scale(-1), scale_x(-1), scale_y(-1), name("") {};
  74.   CScanMatch(int _left, int _top, int _right, int _bottom,
  75.              double _scale, double _scale_x, double _scale_y, string _name) 
  76.     : left(_left), top(_top), right(_right), bottom(_bottom), 
  77.       scale(_scale), scale_x(_scale_x), scale_y(_scale_y), name(_name) {};
  78.   CRect AsRect() const { return CRect(left, top, right, bottom); }
  79.   int         left, top, right, bottom;
  80.   double      scale, scale_x, scale_y;
  81.   string      name;
  82. };
  83. #endif // CScanMatch_DEFINED
  84. typedef vector<CScanMatch> CScanMatchVector;
  85. typedef vector<CScanMatchVector> CScanMatchMatrix;
  86. class CClassifierCascade;
  87. class CScaleParams;
  88. // ----------------------------------------------------------------------
  89. // class CImageScanner
  90. // ----------------------------------------------------------------------
  91. class CImageScanner {
  92.  public:
  93.   CImageScanner();
  94.   CImageScanner(const CImageScanner& src);
  95.   ~CImageScanner() {};
  96.   void SetScanParameters(
  97.     double start_scale = 1.0,
  98.     double stop_scale = DBL_MAX,
  99.     double scale_inc_factor = 1.25,
  100.     double translation_inc_x = 1.0,
  101.     double translation_inc_y = 1.0,
  102.     CRect scan_area = CRect(0, 0, INT_MAX, INT_MAX)
  103.     );
  104.   void GetScanParameters(
  105.     double* pStart_scale,
  106.     double* pStop_scale,
  107.     double* pScale_inc_factor,
  108.     double* pTranslation_inc_x,
  109.     double* pTranslation_inc_y,
  110.     CRect& scan_area,
  111.     bool* pPostProcessing,
  112.     bool* pIsActive
  113.     ) const;
  114.   void SetScanArea(const CRect& scan_area);
  115.   void SetScanScales(double start_scale, double stop_scale);
  116.   const CRect& GetScanArea() const;
  117.   void GetScaleSizes(int* min_width, int* max_width,
  118.      int* min_height, int* max_height) const;
  119.   void SetAutoPostProcessing(bool on=true);
  120.   int Scan(const CClassifierCascade& cascade,
  121.    const CByteImage& image,
  122.    CScanMatchVector& matches) const;
  123.   int Scan(const CClassifierCascade& cascade,
  124.    const CIntegralImage& integral,
  125.    const CIntegralImage& squared_integral,
  126.    CScanMatchVector& matches) const;
  127.   void PostProcess(CScanMatchVector& posClsfd) const;
  128.   bool IsActive() const {return m_is_active;};
  129.   void SetActive(bool active=true) {m_is_active = active;}
  130. #ifdef WITH_TRAINING
  131.   int EvaluateThreshs(const CClassifierCascade& cascade,
  132.       const CIntegralImage& integral,
  133.       const CIntegralImage& squared_integral,
  134.       CIntMatrix& numMatches,
  135.       const CDoubleVector& threshs) const;
  136. #endif // WITH_TRAINING
  137.   ostream& output(ostream& os) const;
  138. protected:
  139.   void NextScaleParams(CScaleParams& params) const;
  140.   void InitScaleParams(const CClassifierCascade& cascade,
  141.        CScaleParams& params) const;
  142.   friend class CScaleParams;
  143.   
  144.  private:
  145.   double                      m_start_scale;
  146.   double                      m_stop_scale;
  147.   double                      m_scale_inc_factor;
  148.   double                      m_translation_inc_x;
  149.   double                      m_translation_inc_y;
  150.   CRect                       m_scan_area;
  151.   bool                        m_post_process;
  152.   bool                        m_is_active;
  153.   mutable int                 m_min_scaled_template_width;
  154.   mutable int                 m_max_scaled_template_width;
  155.   mutable int                 m_min_scaled_template_height;
  156.   mutable int                 m_max_scaled_template_height;
  157.   // local buffer
  158.   mutable CIntegralImage      m_integral;
  159.   mutable CIntegralImage      m_squared_integral;
  160. };
  161. typedef vector<CImageScanner> CScannerVector;
  162. ostream& operator<<(ostream& os, const CImageScanner& scanner);
  163. // ----------------------------------------------------------------------
  164. // class CScaleParams
  165. // ----------------------------------------------------------------------
  166. class CScaleParams {
  167. public:
  168.   CScaleParams() {};
  169. public:
  170.   double scale_x;
  171.   double scale_y;
  172.   double base_scale;
  173.   double translation_inc_x;
  174.   double translation_inc_y;
  175.   int template_width;
  176.   int template_height;
  177.   int scaled_template_width;
  178.   int scaled_template_height;
  179.   double actual_scale_x;
  180.   double actual_scale_y;
  181. protected:
  182.   // these four are only needed for m_integer_scaling
  183.   int iscale_x;
  184.   int iscale_y;
  185.   double fscale_x;
  186.   double fscale_y;
  187.   friend void CImageScanner::NextScaleParams(CScaleParams& params) const;
  188.   friend void CImageScanner::InitScaleParams(const CClassifierCascade& cascade,
  189.      CScaleParams& params) const;
  190. };
  191. //} // namespace cubicles
  192. #endif // __SCANNER_H