00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef GABORCHANNEL_C_DEFINED
00039 #define GABORCHANNEL_C_DEFINED
00040
00041 #include "Channels/GaborChannel.H"
00042
00043 #include "Channels/ChannelOpts.H"
00044 #include "Component/OptionManager.H"
00045 #include "Component/ParamMap.H"
00046 #include "Image/PyramidOps.H"
00047 #include "Util/sformat.H"
00048
00049
00050
00051
00052
00053
00054 GaborChannel::GaborChannel(OptionManager& mgr, const uint oriIndex,
00055 const double ang) :
00056 SingleChannel(mgr, "", "", ORI, rutz::shared_ptr< PyrBuilder<float> >(NULL)),
00057 itsOriIndex("GaborChannelOrientationIndex", this, oriIndex),
00058 itsOrientation("GaborChannelOrientation", this, ang),
00059 itsGaborIntens(&OPT_GaborChannelIntensity, this),
00060 itsOriCompType(&OPT_OrientComputeType, this),
00061 itsUseTrigTab(&OPT_UseTrigTab, this)
00062 {
00063 itsNormalizeOutput.setVal(true);
00064
00065 setDescriptiveName(sformat("Gabor(%d)", int(ang)));
00066 setTagName(sformat("ori_%d", oriIndex));
00067 }
00068
00069
00070 GaborChannel::GaborChannel(OptionManager& mgr, const uint oriIndex,
00071 const double ang, const char* tag, const char* desc) :
00072 SingleChannel(mgr, "", "", ORI, rutz::shared_ptr< PyrBuilder<float> >(NULL)),
00073 itsOriIndex("GaborChannelOrientationIndex", this, oriIndex),
00074 itsOrientation("GaborChannelOrientation", this, ang),
00075 itsGaborIntens(&OPT_GaborChannelIntensity, this),
00076 itsOriCompType(&OPT_OrientComputeType, this),
00077 itsUseTrigTab(&OPT_UseTrigTab, this)
00078 {
00079 itsNormalizeOutput.setVal(true);
00080
00081 setDescriptiveName(sformat("Gabor-%s(%d)", desc, int(ang)));
00082 setTagName(sformat("ori-%s_%d", tag, oriIndex));
00083 }
00084
00085 void GaborChannel::start1()
00086 {
00087 SingleChannel::start1();
00088 resetPyramid();
00089 }
00090
00091
00092 GaborChannel::~GaborChannel()
00093 { }
00094
00095
00096 void GaborChannel::readFrom(const ParamMap& pmap)
00097 {
00098 SingleChannel::readFrom(pmap);
00099 double gi = itsGaborIntens.getVal();
00100 int otype = (int)itsOriCompType.getVal();
00101 bool doPyrReset = false;
00102
00103
00104 if (pmap.queryDoubleParam("gaborIntens", gi) == ParamMap::CHANGED)
00105 {
00106 itsGaborIntens.setVal(gi);
00107 doPyrReset = true;
00108 }
00109
00110 if (pmap.queryIntParam("oriCompType", otype) == ParamMap::CHANGED)
00111 {
00112 itsOriCompType.setVal((OrientComputeType)otype);
00113 doPyrReset = true;
00114 }
00115
00116 if (doPyrReset) resetPyramid();
00117 }
00118
00119
00120 void GaborChannel::writeTo(ParamMap& pmap) const
00121 {
00122 SingleChannel::writeTo(pmap);
00123 pmap.putDoubleParam("gaborIntens", itsGaborIntens.getVal());
00124 pmap.putIntParam("oriCompType", (int)itsOriCompType.getVal());
00125 }
00126
00127
00128 double GaborChannel::angle() const
00129 { return itsOrientation.getVal(); }
00130
00131
00132 void GaborChannel::resetPyramid()
00133 {
00134 switch(itsOriCompType.getVal())
00135 {
00136 case ORISteerable:
00137 setPyramid(rutz::make_shared(new OrientedPyrBuilder<float>
00138 (9, itsOrientation.getVal(),
00139 itsGaborIntens.getVal(),
00140 itsUseTrigTab.getVal())));
00141 break;
00142
00143 case ORIGabor:
00144 setPyramid(rutz::make_shared(new GaborPyrBuilder<float>
00145 (itsOrientation.getVal(),7,1,9,0)));
00146 break;
00147
00148 case ORIGaborEnergyNorm:
00149 setPyramid(rutz::make_shared(new GaborPyrBuilder<float>
00150 (itsOrientation.getVal(),7,1,9,
00151 DO_ENERGY_NORM)));
00152 break;
00153
00154 default:
00155 LFATAL("Unknown OrientComputeType");
00156 }
00157 }
00158
00159
00160
00161
00162
00163
00164
00165
00166 #endif // GABORCHANNEL_C_DEFINED