Cascade.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: Cascade.h,v 1.30 2004/11/11 01:58:58 matz Exp $
  13. **/
  14. // Cascade.h: header file for ClassifierCascades.
  15. //
  16. ////////////////////////////////////////////////////////////////////
  17. //
  18. // By downloading, copying, installing or using the software you 
  19. // agree to this license.  If you do not agree to this license, 
  20. // do not download, install, copy or use the software.
  21. //
  22. // Copyright (C) 2004, Mathias Kolsch, all rights reserved.
  23. // Third party copyrights are property of their respective owners.
  24. //
  25. // Redistribution and use in binary form, with or without 
  26. // modification, is permitted for non-commercial purposes only.
  27. // Redistribution in source, with or without modification, is 
  28. // prohibited without prior written permission.
  29. // If granted in writing in another document, personal use and 
  30. // modification are permitted provided that the following two
  31. // conditions are met:
  32. //
  33. // 1.Any modification of source code must retain the above 
  34. //   copyright notice, this list of conditions and the following 
  35. //   disclaimer.
  36. //
  37. // 2.Redistribution's in binary form must reproduce the above 
  38. //   copyright notice, this list of conditions and the following 
  39. //   disclaimer in the documentation and/or other materials provided
  40. //   with the distribution.
  41. //
  42. // This software is provided by the copyright holders and 
  43. // contributors "as is" and any express or implied warranties, 
  44. // including, but not limited to, the implied warranties of 
  45. // merchantability and fitness for a particular purpose are 
  46. // disclaimed.  In no event shall the copyright holder or 
  47. // contributors be liable for any direct, indirect, incidental, 
  48. // special, exemplary, or consequential damages (including, but not 
  49. // limited to, procurement of substitute goods or services; loss of 
  50. // use, data, or profits; or business interruption) however caused
  51. // and on any theory of liability, whether in contract, strict 
  52. // liability, or tort (including negligence or otherwise) arising 
  53. // in any way out of the use of this software, even if advised of 
  54. // the possibility of such damage.
  55. //
  56. ////////////////////////////////////////////////////////////////////
  57. #if !defined(_CASCADE_H__INCLUDED_)
  58. #define _CASCADE_H__INCLUDED_
  59. #if _MSC_VER > 1000
  60. #pragma once
  61. #endif // _MSC_VER > 1000
  62. #include "Classifiers.h"
  63. //namespace {  // cubicles
  64.   
  65. typedef vector<CStrongClassifier> CSClsfVector;
  66. typedef vector<CWeakClassifier> CWeakClsfVector;
  67. typedef vector<CSClsfVector> CSClsfMatrix;
  68. typedef vector<string> CStringVector;
  69. /////////////////////////////////////////////////////////////////////////////
  70. //
  71. // class CClassifierCascade
  72. //
  73. class CClassifierCascade {
  74.  private:
  75.   enum CascadeType {
  76.     CASCADE_TYPE_SEQUENTIAL = 0,
  77.     CASCADE_TYPE_FAN        = 1,
  78.     CASCADE_TYPE_TREE       = 3
  79.   };
  80.  public:
  81.   CClassifierCascade();
  82.   CClassifierCascade(const CClassifierCascade& frm);
  83.   CClassifierCascade(int template_width, int template_height,
  84.      double image_area_ratio);
  85.   ~CClassifierCascade();
  86.   CClassifierCascade& operator=(const CClassifierCascade& frm);
  87.   CStrongClassifier& AddStrongClassifier();
  88.   CStrongClassifier& AddStrongClassifier(int branch, double fpr, double dr);
  89.   bool Evaluate(const CIntegralImage& image, 
  90.                 CStringVector& matches) const;
  91. #pragma warning (disable: 4786)
  92.   bool EvaluateDebug(const CIntegralImage& image, 
  93.                      CStringVector& matches, ostream& os) const;
  94.   bool Evaluate(const CIntegralImage& image,
  95. double mean_adjust, double stddev, int left, int top,
  96.                 CStringVector& matches) const;
  97. #pragma warning (default: 4786)
  98. #ifdef WITH_TRAINING
  99.   bool Evaluate(const ExampleList::const_iterator example) const;
  100.   void EvaluateSet(const ExampleList& examples,
  101.    double* false_pos_rate, double* detection_rate) const;
  102.   void DecreaseThreshMeetDR(
  103.            const ExampleList& examples,
  104.    double* false_pos_rate,
  105.    double* detection_rate, double min_detection_rate, 
  106.    int adjust_clsf, int num_steps);
  107.   void AdjustThreshMeetDR(
  108.            const ExampleList& examples,
  109.    double* false_pos_rate, double max_false_pos_rate,
  110.    double* detection_rate, double min_detection_rate, 
  111.    int adjust_clsf, int num_steps);
  112.   void AdjustThreshMeetFPR(
  113.            const ExampleList& examples,
  114.    double* false_pos_rate, double max_false_pos_rate,
  115.    double* detection_rate,
  116.    int adjust_clsf, int num_steps);
  117.   void EvaluateThreshs(const CIntegralImage& image,
  118.        double mean_adjust, double stddev, int left, int top,
  119.        CIntMatrix& numMatches, 
  120.                        const CDoubleVector& threshs) const;
  121. #endif // WITH_TRAINING
  122.   void ScaleFeaturesEvenly(double scale_x, double scale_y,
  123.         int scaled_template_width, int scaled_template_height) const;
  124.   //  void ParseFrom(istream& is);
  125.   void ParseFrom(const string& filename);
  126.   int RemoveLastStrongClassifier(); // returns number of remaining ones
  127.   int RemoveLastWeakClassifier();
  128.   bool empty() const { return m_classifiers.empty(); }
  129.   // member access
  130.   int GetTemplateWidth() const { return m_template_width; }
  131.   int GetTemplateHeight() const { return m_template_height; }
  132.   int GetNumStrongClassifiers(int branch=-1) const;
  133.   double GetTotalFalsePositiveRate() const
  134.     { return m_total_false_positive_rate; }
  135.   double GetFalsePositiveRate(int clsf) const;
  136.   double GetLastDetectionRate() const { return m_last_detection_rate; }
  137.   double GetDetectionRate(int clsf) const;
  138.   double GetImageAreaRatio() const { return m_image_area_ratio; }
  139.   bool GetExhausted() const { return m_trainset_exhausted; }
  140.   CStrongClassifier& GetStrongClassifier(int num)
  141.     { return m_classifiers[num]; }
  142.   const CStrongClassifier& GetStrongClassifier(int num) const
  143.     { return m_classifiers[num]; }
  144.   void SetFalsePositiveRate(int clsf, double fpr);
  145.   void SetDetectionRate(int clsf, double dr);
  146.   void SetExhausted(bool exhausted) { m_trainset_exhausted = exhausted; }
  147.   CStringVector GetNames() const; // return a copy
  148.   ostream& output(ostream& os) const;
  149. protected:
  150.   /*
  151.   void RealParseFrom(istream& is);
  152.   void ParseSomeStrongClassifiers(istream& is, int offset,
  153.                                   CSClsfVector& strongs,
  154.                                   CDoubleVector& fprs,
  155.                                   CDoubleVector& drs);
  156. */
  157.  private:
  158.   string                    m_name;
  159.   CascadeType               m_structure_type;
  160.   CSClsfVector     m_classifiers;
  161.   CSClsfMatrix     m_branch_classifiers;
  162.   CStringVector             m_branch_names;
  163.   int     m_template_width, m_template_height;
  164.   double     m_image_area_ratio; // width over height
  165.   // statistics
  166.   double     m_total_false_positive_rate;
  167.   double     m_last_detection_rate;
  168.   CDoubleVector     m_lyr_false_positive_rates;
  169.   CDoubleVector     m_lyr_detection_rates;
  170.   CDoubleVector     m_branch_false_positive_rates;
  171.   CDoubleVector     m_branch_detection_rates;
  172.   CDoubleMatrix     m_branch_lyr_false_positive_rates;
  173.   CDoubleMatrix     m_branch_lyr_detection_rates;
  174.   bool                      m_trainset_exhausted;
  175.   friend int yyparse();
  176.   
  177. };
  178. typedef vector<CClassifierCascade> CCascadeVector;
  179. ostream& operator<<(ostream& os, const CClassifierCascade& casc);
  180. //}  // namespace cubicles
  181. /////////////////////////////////////////////////////////////////////////////
  182. #endif // !defined(_CASCADE_H__INCLUDED_)