00001 /*!@file Channels/OrientationChannel.H */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2000-2005 // 00005 // by the 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: 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Channels/OrientationChannel.H $ 00035 // $Id: OrientationChannel.H 10794 2009-02-08 06:21:09Z itti $ 00036 // 00037 00038 #ifndef ORIENTATIONCHANNEL_H_DEFINED 00039 #define ORIENTATIONCHANNEL_H_DEFINED 00040 00041 #include "Channels/ComplexChannel.H" 00042 #include "rutz/shared_ptr.h" 00043 00044 class GaborChannel; 00045 00046 //###################################################################### 00047 //! A composite channel containing a set of orientation-tuned gabor channels. 00048 /*! This is an example of a homogeneous complex channel. Thus, the 00049 JetSpec representation will have an index for the subchannel number, 00050 and further indices for the various Jet components (which are 00051 identical for all subchannels). */ 00052 class OrientationChannel : public ComplexChannel 00053 { 00054 public: 00055 //! Construct with standard params 00056 OrientationChannel(OptionManager& mgr); 00057 00058 //! Construct with standard params and tag override 00059 OrientationChannel(OptionManager& mgr, const char* tag, const char* desc, const char* gabortag); 00060 00061 //! Destructor 00062 virtual ~OrientationChannel(); 00063 00064 //! Wraps ComplexChannel's subChan() and casts the result to GaborChannel. 00065 virtual GaborChannel& gabor(const uint idx) const; 00066 00067 //! Overload so that we can reconfigure when our params get changed 00068 virtual void paramChanged(ModelParamBase* const param, 00069 const bool valueChanged, 00070 ParamClient::ChangeStatus* status); 00071 00072 //! the possible interaction types between orientations 00073 enum InteractType { NONE = 0, SUB_MEAN = 1, CUSTOM = 2 }; 00074 00075 //! returns the currently set interaction type between the orientation 00076 InteractType getInteractType(); 00077 00078 //! sets the interaction type between the orientations 00079 void setInteractType(InteractType type); 00080 00081 //! returns the coefficients vector for interactions between orientations 00082 std::vector<float> getInteractCoeffs(); 00083 00084 //! sets the coefficients vector for the interactions between orientations 00085 void setInteractCoeffs(std::vector<float>& coeffs); 00086 00087 //! compute interactions, then call ComplexChannel::getOutput() 00088 virtual Image<float> getOutput(); 00089 00090 protected: 00091 //! trigger the interaction computation between the gabor filters 00092 void doInteractions(); 00093 00094 OModelParam<uint> itsNumOrients; //!< number of Gabor subchannels 00095 00096 //! (re-)build our subchannels 00097 virtual void buildSubChans(); 00098 00099 //! parse the string for the interaction type between orientations 00100 virtual void parseInteractString(const std::string& value); 00101 00102 //! OrientationChannel requires only luminance input. 00103 virtual void doInput(const InputFrame& inframe); 00104 00105 //! type of interaction mode between orientations 00106 OModelParam<std::string> itsInteractString; 00107 00108 private: 00109 InteractType itsInteractType; 00110 std::vector<float> itsInteractCoeffs; 00111 bool itsDidInteractions; 00112 bool itsOverideTagName; 00113 std::string itsGaborOverideTag; 00114 }; 00115 00116 // ###################################################################### 00117 /* So things look consistent in everyone's emacs... */ 00118 /* Local Variables: */ 00119 /* indent-tabs-mode: nil */ 00120 /* End: */ 00121 00122 #endif // ORIENTATIONCHANNEL_H_DEFINED