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

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * HandVu - a library for computer vision-based hand gesture
  3.   * recognition.
  4.   * Copyright (C) 2004 Mathias Kolsch, matz@cs.ucsb.edu
  5.   *
  6.   * This program is free software; you can redistribute it and/or
  7.   * modify it under the terms of the GNU General Public License
  8.   * as published by the Free Software Foundation; either version 2
  9.   * of the License, or (at your option) any later version.
  10.   *
  11.   * This program is distributed in the hope that it will be useful,
  12.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.   * GNU General Public License for more details.
  15.   *
  16.   * You should have received a copy of the GNU General Public License
  17.   * along with this program; if not, write to the Free Software
  18.   * Foundation, Inc., 59 Temple Place - Suite 330, 
  19.   * Boston, MA  02111-1307, USA.
  20.   *
  21.   * $Id: HandVu.hpp,v 1.1 2005/10/30 21:16:04 matz Exp $
  22. **/
  23. // C++ header file for HandVu class
  24. #if !defined(__HANDVU_HPP__INCLUDED_)
  25. #define __HANDVU_HPP__INCLUDED_
  26. #include <cv.h>
  27. #include <string>
  28. #include <deque>
  29. using namespace std;
  30. #include "Exceptions.h"
  31. #include "Quadruple.h"
  32. #include "Rect.h"
  33. #include "Thread.h"
  34. #ifdef USE_MFC
  35. //using namespace std;
  36. // this prompts a bug in VC++ (friends and private member access)
  37. // thus we have to declare all usages individually:
  38. using std::string;
  39. #else // USE_MFC
  40. using namespace std;
  41. #endif // USE_MFC
  42. class CubicleWrapper;
  43. class Segmentation;
  44. class OpticalFlow;
  45. class Skincolor;
  46. class LearnedColor;
  47. class Undistortion;
  48. class VisionConductor;
  49. class CamShift;
  50. class DisplayCallback;
  51. /*
  52. #ifndef CScanMatch_DEFINED
  53. #define CScanMatch_DEFINED
  54. class CScanMatch {
  55. public:
  56.   CScanMatch() 
  57.     : left(-1), top(-1), right(-1), bottom(-1),
  58.     scale(-1), scale_x(-1), scale_y(-1), name("") {};
  59.   CScanMatch(int _left, int _top, int _right, int _bottom,
  60.              double _scale, double _scale_x, double _scale_y, string _name) 
  61.     : left(_left), top(_top), right(_right), bottom(_bottom), 
  62.       scale(_scale), scale_x(_scale_x), scale_y(_scale_y), name(_name) {};
  63.   CRect AsRect() const { return CRect(left, top, right, bottom); }
  64.   int         left, top, right, bottom;
  65.   double      scale, scale_x, scale_y;
  66.   string      name;
  67. };
  68. #endif // CScanMatch_DEFINED
  69. */
  70. class CameraController {
  71.  public:
  72.   virtual double GetCurrentExposure() = 0;        // [0..1]
  73.   // true if change has an effect, false if step is too small
  74.   virtual bool SetExposure(double exposure) = 0;  // [0..1]
  75.   virtual bool SetCameraAutoExposure(bool enable=true) = 0;
  76.   virtual bool CanAdjustExposure() = 0;
  77. };
  78. #ifdef WIN32
  79. typedef __int64 REFERENCE_TIME;
  80. typedef REFERENCE_TIME RefTime;
  81. #else
  82. typedef long long RefTime;
  83. #endif // WIN32
  84. typedef vector<RefTime> RefTimeVector;
  85. #ifdef GetCurrentTime
  86. #undef GetCurrentTime
  87. #endif
  88. // times in micro-seconds (Usec)
  89. class RefClock {
  90. public:
  91.   virtual RefTime GetCurrentTimeUsec() const = 0;
  92. };
  93. class GrabbedImage {
  94.  public:
  95.   GrabbedImage(IplImage* img, RefTime& sample_time, int bufferID) :
  96.     m_img(img), m_sample_time(sample_time), m_bufferID(bufferID) {}
  97.   IplImage* GetImage() { return m_img; }
  98.   RefTime& GetSampleTime() { return m_sample_time; }
  99.   int GetBufferID() { return m_bufferID; }
  100.  protected:
  101.   IplImage* m_img;
  102.   RefTime   m_sample_time;
  103.   int       m_bufferID;
  104. };
  105. /* state for an object such as the right hand
  106. */
  107. class HVState {
  108.  public:
  109.   int        m_obj_id;
  110.   bool       m_tracked;
  111.   bool       m_recognized;
  112.   double     m_center_xpos, m_center_ypos;
  113.   double     m_scale;
  114.   string     m_posture;
  115.   RefTime    m_tstamp;
  116. };
  117. class HandVu {
  118.  public:
  119.   enum HVAction {         // specify recommendations to application:
  120.     HV_INVALID_ACTION = 0,
  121.     HV_PROCESS_FRAME = 1, // fully process and display the frame
  122.     HV_SKIP_FRAME = 2,    // display but do not further process
  123.     HV_DROP_FRAME = 3     // do not display the frame
  124.   };
  125.   enum {
  126.     MAX_OVERLAY_LEVEL = 3
  127.   };
  128.   
  129.  public:
  130.   HandVu();
  131.   ~HandVu();
  132.   void Initialize(int width, int height, RefClock* pClock, 
  133.   CameraController* pCamCon);
  134.   void LoadConductor(const string& filename);
  135.   bool ConductorLoaded() const;
  136.   void StartRecognition(int obj_id=0);
  137.   void StopRecognition(int obj_id=0);
  138.   bool IsActive() const { return m_active; }
  139.   HVAction ProcessFrame(GrabbedImage& inOutImage,
  140.                         const IplImage* rightImage=NULL);
  141.   void AsyncSetup(int num_buffers, DisplayCallback* pDisplayCB);
  142.   void AsyncProcessFrame(int id, RefTime& t);
  143.   void AsyncGetImageBuffer(IplImage** pImg, int* pID);
  144.   void GetState(int obj_id, HVState& state) const;
  145.   void SetDetectionArea(int left, int top, int right, int bottom);
  146.   void GetDetectionArea(CQuadruple& area) const;
  147.   void RecomputeNormalLatency() { m_determine_normal_latency = true; }
  148.   void SetOverlayLevel(int level);
  149.   int GetOverlayLevel();
  150.   void CorrectDistortion(bool enable=true);
  151.   bool IsCorrectingDistortion() const;
  152.   bool CanCorrectDistortion() const;
  153.   
  154.   void SetAdjustExposure(bool enable=true);
  155.   bool CanAdjustExposure() const;
  156.   bool IsAdjustingExposure() const;
  157.   void SaveScannedArea(IplImage* pImg, string& picfile);
  158.   void SaveImageArea(IplImage* pImg, CRect area, string& picfile);
  159.   void SetSaveFilenameRoot(const string& fname_root);
  160.   void SetDoTrack(bool do_track) { m_do_track = do_track; }
  161.   void SetLogfile(const string& filename);
  162.   void GetVersion(string& version, int verbosity) const;
  163.  protected:
  164.   void InitializeTracking();
  165.   bool VerifyColor();
  166.   bool DoDetection();
  167.   bool DoTracking();
  168.   bool DoRecognition();
  169.   HVAction CheckLatency();
  170.   void DrawOverlay();
  171.   void CheckAndCorrectExposure();
  172.   void FindSecondHand();
  173.   void SetScanAreaVerified(const CRect& area);
  174.   void KeepStatistics(HVAction action);
  175.   void SendEvent() const;
  176.   void CalculateDepth(const IplImage* rightImage, const CvRect& area);
  177.   string GetNextSnapshotFilename(const string& base, const string& extension);
  178.   void WriteAreaAsBMP(IplImage* pImg, const CRect& area, const string& picfile);
  179.   void WriteAreaAsPPM_BGR(IplImage* pImg, const CRect& area, const string& picfile);
  180.   void WriteAreaAsPPM_RGB(IplImage* pImg, const CRect& area, const string& picfile);
  181.   void WriteAreaAsPGM_Gray(IplImage* pImg, const CRect& area, const string& picfile);
  182.   void AsyncProcessor();
  183.   friend void* asyncProcessor(void* arg);
  184.   
  185.   
  186.  protected:
  187.   // processing state
  188.   bool                    m_active;
  189.   bool                    m_tracking;
  190.   bool                    m_recognized;
  191.   CubicleWrapper*         m_pCubicle;
  192.   Skincolor*              m_pSkincolor;
  193.   LearnedColor*           m_pLearnedColor;
  194.   OpticalFlow*            m_pOpticalFlow;
  195.   VisionConductor*        m_pConductor;
  196.   CamShift*               m_pCamShift;
  197.   // general
  198.   int                     m_video_width;
  199.   int                     m_video_height;
  200.   string                  m_camera_calib;
  201.   int                     m_alignment_crosses;
  202.   IplImage*               m_rgbImage;
  203.   IplImage*               m_grayImages[2];
  204.   IplImage*               m_depthImage;
  205.   IplImage*               m_rightGrayImage;
  206.   bool                    m_initialized;
  207.   int                     m_img_width;
  208.   int                     m_img_height;
  209.   int                     m_overlay_level;
  210.   CRect                   m_scan_area;
  211.   CuScanMatch             m_last_match;
  212.   string                  m_logfile_name; // currently unused
  213.   string                  m_img_fname_root; // for saving image areas
  214.   // Async (internal buffering)
  215.   deque<GrabbedImage>     m_process_queue;
  216.   vector<IplImage*>       m_ring_buffer;
  217.   vector<bool>            m_ring_buffer_occupied;
  218.   bool                    m_quit_thread;
  219.   DisplayCallback*        m_pDisplayCallback;
  220.   Thread*                 m_pAsyncThread;
  221.   
  222.   // undistortion
  223.   bool                    m_undistort;
  224.   Undistortion*           m_pUndistortion;
  225.   // camera exposure control
  226.   CameraController*       m_pCameraController;
  227.   bool                    m_adjust_exposure;
  228.   RefTime                 m_adjust_exposure_at_time;
  229.   double                  m_exposure_level; //[0-1]
  230.   // latency stuff
  231.   RefTime                 m_sample_time;
  232.   int                     m_num_succ_dropped_frames;
  233.   RefTime                 m_max_normal_latency;
  234.   RefTime                 m_max_abnormal_latency;
  235.   RefTime                 m_t_start_processing;
  236.   bool                    m_determine_normal_latency;
  237.   RefTimeVector           m_last_latencies;
  238.   RefTimeVector           m_frame_times;
  239.   RefTimeVector           m_processed_frame_times;
  240.   RefTimeVector           m_prcs_times;
  241.   RefClock*               m_pClock;
  242.   // detection
  243.   CuScanMatch             m_dt_first_match;
  244.   RefTime                 m_dt_first_match_time;
  245.   // tracking
  246.   bool                    m_do_track;
  247.   int                     m_buf_indx_cycler;
  248.   int                     m_prev_buf_indx;
  249.   int                     m_curr_buf_indx;
  250.   CvPoint2D32f            m_center_pos;
  251.   double                  m_center_depth;
  252.   RefTime                 m_time_to_learn_color;
  253.   RefTime                 m_min_time_between_learning_color;
  254.   // second object (left hand)
  255.   bool                    m_id1_on;
  256.   double                  m_id1_x, m_id1_y;
  257. };
  258. class DisplayCallback {
  259.  public:
  260.   virtual void Display(IplImage* img, HandVu::HVAction action) = 0;
  261. };
  262. #endif // __HANDVU_HPP__INCLUDED_