00001 /*!@file RCBot/Motion/MotionEnergy.H detect motion in an image stream */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2001 by the // 00005 // University of Southern California (USC) and the iLab at USC. // 00006 // See http://iLab.usc.edu for information about this project. // 00007 // //////////////////////////////////////////////////////////////////// // 00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00010 // in Visual Environments, and Applications'' by Christof Koch and // 00011 // Laurent Itti, California Institute of Technology, 2001 (patent // 00012 // pending; application number 09/912,225 filed July 23, 2001; see // 00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00014 // //////////////////////////////////////////////////////////////////// // 00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00016 // // 00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00018 // redistribute it and/or modify it under the terms of the GNU General // 00019 // Public License as published by the Free Software Foundation; either // 00020 // version 2 of the License, or (at your option) any later version. // 00021 // // 00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00025 // PURPOSE. See the GNU General Public License for more details. // 00026 // // 00027 // You should have received a copy of the GNU General Public License // 00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00030 // Boston, MA 02111-1307 USA. // 00031 // //////////////////////////////////////////////////////////////////// // 00032 // 00033 // Primary maintainer for this file: Lior Elazary <lelazary@yahoo.com> 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/RCBot/Motion/MotionEnergy.H $ 00035 // $Id: MotionEnergy.H 8429 2007-05-25 18:29:40Z rjpeters $ 00036 // 00037 00038 #ifndef MotionEnergy_H 00039 #define MotionEnergy_H 00040 00041 #include "Image/PyramidOps.H" 00042 #include "Image/Image.H" 00043 #include "Image/ImageSet.H" 00044 #include "Image/DrawOps.H" 00045 #include "Image/PyramidTypes.H" 00046 #include "Image/PyrBuilder.H" 00047 #include "Image/MathOps.H" 00048 00049 #include <math.h> 00050 00051 // ###################################################################### 00052 //! This class implements Spatiotemporal Energy motion detections 00053 /*! The class uses the filter results of pyramids of other types 00054 to implement Spatiotemporal Energy motion detection. The motion is extracted 00055 by finding edge orientations in the time and space domain. The edge 00056 orientation are computed using sobel edge dectors. */ 00057 00058 template <class T> 00059 class MotionEnergyPyrBuilder : public PyrBuilder<T> 00060 { 00061 public: 00062 // ###################################################################### 00063 // #### Constructors 00064 // ###################################################################### 00065 MotionEnergyPyrBuilder(const PyramidType typ, 00066 const float gabor_theta = 0.0F, 00067 const float intens = 10.0F, 00068 const int timeDomainSize = 5, 00069 const float magThreshold = 1500); 00070 00071 //! default copy constructor and assignment are okay 00072 //! std::vector and std::deque handle the copying of the individual images 00073 00074 //! cloning constructor 00075 virtual MotionEnergyPyrBuilder<T>* clone() const; 00076 00077 //! Builds a Motion Energy pyramid based on a image 00078 virtual ImageSet<T> build(const Image<T>& image, 00079 const int firstlevel, 00080 const int depth, 00081 PyramidCache<T>* cache = 0); 00082 00083 void updateMotion(const Image<T>& image, const int depth); 00084 00085 Image<float> buildHorizontalMotionLevel(int lev); 00086 Image<float> buildVerticalMotionLevel(int lev); 00087 00088 ImageSet<float> buildHorizontalMotion(); 00089 ImageSet<float> buildVerticalMotion(); 00090 00091 //! reset the stored queues - overrides PyrBuilder<T>::reset() 00092 virtual void reset(); 00093 00094 //! show the motion image as vectors (use for debuging) 00095 //! return the average motion 00096 float DrawVectors(Image<T> &img, Image<float> &motion); 00097 00098 private: 00099 00100 //! get the motion from the image by using sobel grad detector 00101 //! to detect edge orientations in the space and time 00102 void getMotion(const Image<T> &img, Image<float> &motion, int y_pos); 00103 00104 std::deque< ImageSet<T> > imgPyrQ; // hold the time domain pyramid 00105 PyramidType itsPtype; // Gaussian, Laplacian, Gabor, etc. 00106 float itsGaborAngle; // orientation tuning for Gabor pyr 00107 float itsGaborIntens; // filter strength for Gabor pyr 00108 unsigned int itsTimeDomainSize; // the number of frames to hold in imgPyrQ 00109 float itsMagThreshold; // only accept mag over this threshold 00110 }; 00111 00112 #endif 00113 00114 // ###################################################################### 00115 /* So things look consistent in everyone's emacs... */ 00116 /* Local Variables: */ 00117 /* indent-tabs-mode: nil */ 00118 /* End: */