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
00039 #ifndef SFS_C_DEFINED
00040 #define SFS_C_DEFINED
00041
00042 #include "plugins/SceneUnderstanding/SFS.H"
00043
00044 #include "Image/DrawOps.H"
00045 #include "Image/MathOps.H"
00046 #include "Image/Layout.H"
00047 #include "Simulation/SimEventQueue.H"
00048 #include "Simulation/SimEvents.H"
00049 #include "Media/MediaSimEvents.H"
00050 #include "Channels/InputFrame.H"
00051 #include "Image/Kernels.H"
00052 #include "Image/FilterOps.H"
00053 #include "Image/Convolutions.H"
00054 #include "GUI/DebugWin.H"
00055 #include <math.h>
00056 #include <fcntl.h>
00057 #include <limits>
00058 #include <string>
00059
00060 const ModelOptionCateg MOC_SFS = {
00061 MOC_SORTPRI_3, "SFS-Related Options" };
00062
00063
00064 const ModelOptionDef OPT_SFSShowDebug =
00065 { MODOPT_ARG(bool), "SFSShowDebug", &MOC_SFS, OPTEXP_CORE,
00066 "Show debug img",
00067 "sfs-debug", '\0', "<true|false>", "false" };
00068
00069
00070
00071 SFS::SFS(OptionManager& mgr, const std::string& descrName,
00072 const std::string& tagName) :
00073 SimModule(mgr, descrName, tagName),
00074 SIMCALLBACK_INIT(SimEventInputFrame),
00075 SIMCALLBACK_INIT(SimEventSaveOutput),
00076 itsShowDebug(&OPT_SFSShowDebug, this),
00077 itsInitialized(false),
00078 itsNumIter(10),
00079 itsPs(52.46),
00080 itsQs(11.73)
00081
00082 {
00083 }
00084
00085
00086 SFS::~SFS()
00087 {
00088
00089 }
00090
00091
00092 void SFS::onSimEventInputFrame(SimEventQueue& q,
00093 rutz::shared_ptr<SimEventInputFrame>& e)
00094 {
00095
00096 }
00097
00098
00099 void SFS::onSimEventSaveOutput(SimEventQueue& q, rutz::shared_ptr<SimEventSaveOutput>& e)
00100 {
00101 if (itsShowDebug.getVal())
00102 {
00103
00104
00105 nub::ref<FrameOstream> ofs =
00106 dynamic_cast<const SimModuleSaveInfo&>(e->sinfo()).ofs;
00107 Layout<PixRGB<byte> > disp = getDebugImage();
00108 ofs->writeRgbLayout(disp, "SFS", FrameInfo("SFS", SRC_POS));
00109 }
00110 }
00111
00112
00113
00114 void SFS::evolve()
00115 {
00116
00117 }
00118
00119
00120 void SFS::evolve(const Image<byte>& img)
00121 {
00122
00123 Image<float> Zn1(img.getDims(), NO_INIT);
00124 Image<float> Si1(img.getDims(), NO_INIT);
00125
00126
00127 for(int i=0;i<img.getWidth();i++)
00128 for(int j=0;j<img.getHeight();j++)
00129 {
00130 Zn1.setVal(i,j,0.0);
00131 Si1.setVal(i,j, 0.01);
00132 }
00133
00134 double Wn=0.0001*0.0001;
00135
00136 for(int iter=0; iter<itsNumIter; iter++)
00137 {
00138 Image<float> Zn(img.getDims(), NO_INIT);
00139 Image<float> Si(img.getDims(), NO_INIT);
00140
00141 for(int i=0;i<img.getWidth();i++)
00142 for(int j=0;j<img.getHeight();j++)
00143 {
00144 double p,q;
00145 if(j-1 < 0 || i-1 < 0)
00146 p = q = 0.0;
00147 else {
00148 p = Zn1.getVal(i,j) - Zn1.getVal(i,j-1);
00149 q = Zn1.getVal(i,j) - Zn1.getVal(i-1,j);
00150 }
00151 double pq = 1.0 + p*p + q*q;
00152 double PQs = 1.0 + itsPs*itsPs + itsQs*itsQs;
00153 double Eij = img.getVal(i,j)/255.0;
00154 double fZ = -1.0*(Eij - std::max(0.0,(1+p*itsPs+q*itsQs)/(sqrt(pq)*sqrt(PQs))));
00155 double dfZ = -1.0*( (itsPs+itsQs)/(sqrt(pq)*sqrt(PQs)) -
00156 (p+q)*(1.0+p*itsPs+q*itsQs) /
00157 (sqrt(pq*pq*pq)*sqrt(PQs)));
00158 double Y = fZ + dfZ*Zn1.getVal(i,j);
00159 double K = Si1.getVal(i,j)*dfZ/(Wn+dfZ*Si1.getVal(i,j)*dfZ);
00160 Si.setVal(i,j, (1.0 - K*dfZ)*Si1.getVal(i,j));
00161 Zn.setVal(i,j, Zn1.getVal(i,j) + K*(Y-dfZ*Zn1.getVal(i,j)));
00162 }
00163
00164 Image<float> height = Zn;
00165 inplaceNormalize(height, 0.0F, 100.0F);
00166 Dims dims;
00167 Image<PixRGB<byte> > dImg = img;
00168 Image<PixRGB<byte> > pImg = warp3D(dImg, height, 70.0, 40.0, 150.0F, dims);
00169 SHOWIMG(pImg);
00170
00171 for(int i=0;i<img.getWidth();i++)
00172 for(int j=0;j<img.getHeight();j++)
00173 {
00174 Zn1.setVal(i,j, Zn.getVal(i,j));
00175 Si1.setVal(i,j, Si.getVal(i,j));
00176 }
00177 }
00178
00179 }
00180
00181 Layout<PixRGB<byte> > SFS::getDebugImage()
00182 {
00183
00184 Layout<PixRGB<byte> > disp;
00185
00186 return disp;
00187
00188 }
00189
00190
00191
00192
00193
00194
00195
00196 #endif
00197