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 #include "Component/ModelManager.H"
00039 #include "Devices/FrameGrabberConfigurator.H"
00040 #include "Devices/DeviceOpts.H"
00041 #include "GUI/XWindow.H"
00042 #include "Image/Image.H"
00043 #include "Image/Pixels.H"
00044 #include "Raster/Raster.H"
00045 #include "Transport/FrameIstream.H"
00046 #include "Util/Timer.H"
00047 #include "Util/Types.H"
00048 #include "Util/log.H"
00049 #include "Image/MathOps.H"
00050 #include "Image/ColorOps.H"
00051 #include "Image/Convolver.H"
00052 #include "Image/DrawOps.H"
00053 #include "Media/FrameSeries.H"
00054 #include "Media/MediaOpts.H"
00055 #include "Raster/GenericFrame.H"
00056
00057
00058 #include <cstdio>
00059 #include <cstdlib>
00060 #include <cstring>
00061
00062 int main(int argc, const char **argv)
00063 {
00064
00065 ModelManager *mgr = new ModelManager("locust model frame series style");
00066
00067 nub::ref<InputFrameSeries> ifs(new InputFrameSeries(*mgr));
00068 mgr->addSubComponent(ifs);
00069
00070 mgr->setOptionValString(&OPT_FrameGrabberMode, "RGB24");
00071 mgr->setOptionValString(&OPT_FrameGrabberDims, "320x240");
00072 mgr->setOptionValString(&OPT_FrameGrabberFPS, "30");
00073
00074 mgr->exportOptions(MC_RECURSE);
00075
00076
00077 if (mgr->parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00078
00079
00080
00081
00082 Dims layer_screen(1150,490);
00083 XWindow layers(layer_screen, 0, 0, "layers");
00084
00085
00086 mgr->start();
00087
00088
00089
00090 Image<float> p_layer_image[4];
00091 Image<float> i_layer_image[3];
00092 Image<float> s_layer_image[2];
00093
00094 int maxHistory = 50;
00095 std::vector<float> lgmdPotential(1);
00096 float total_s_layer = 0;
00097 int framecnt=1;
00098 std::vector<Image< PixRGB <byte> > > frames(5);
00099
00100 const FrameState is = ifs->updateNext();
00101 if(is == FRAME_COMPLETE)
00102 LFATAL("frames completed!");
00103
00104
00105 frames[framecnt] = ifs->readRGB();
00106 if(!frames[framecnt].initialized())
00107 LFATAL("frame killed");
00108
00109
00110 Image<PixRGB<byte> > temp_p, temp_i, temp_s;
00111 Image<float>::iterator aptr;
00112 int potentialCnt = 1;
00113
00114
00115 while(1){
00116
00117 if(framecnt!=1)
00118 frames[1] = frames[4];
00119
00120 framecnt=2;
00121
00122
00123 while(framecnt<=4)
00124 {
00125
00126 const FrameState is = ifs->updateNext();
00127 if(is == FRAME_COMPLETE)
00128 break;
00129
00130
00131 frames[framecnt] = ifs->readRGB();
00132 if(!frames[framecnt].initialized())
00133 break;
00134
00135
00136
00137 layers.drawImage(frames[framecnt],0,0);
00138 framecnt++;
00139 }
00140 framecnt--;
00141
00142
00143
00144
00145 p_layer_image[1] = absDiff(luminance(frames[framecnt-2]),luminance(frames[framecnt-3]));
00146 p_layer_image[2] = absDiff(luminance(frames[framecnt-1]),luminance(frames[framecnt-2]));
00147 p_layer_image[3] = absDiff(luminance(frames[framecnt]),luminance(frames[framecnt-1]));
00148
00149 temp_p = p_layer_image[1];
00150 writeText(temp_p,Point2D<int>(2,0),"P-layer",
00151 PixRGB<byte>(255,0,0),PixRGB<byte>(0,0,0), SimpleFont::FIXED(9));
00152 layers.drawImage(temp_p,321,0);
00153
00154
00155
00156
00157
00158 Image<float> kernel(3,3,NO_INIT);
00159 std::fill(kernel.beginw(),kernel.endw(),1.0F/9.0F);
00160
00161
00162 i_layer_image[1] = ((p_layer_image[1]) + (p_layer_image[2]))*0.25;
00163 Convolver c1(kernel,i_layer_image[1].getDims());
00164 i_layer_image[1] = c1.spatialConvolve(i_layer_image[1]);
00165
00166 i_layer_image[2] = ((p_layer_image[2]) + (p_layer_image[3]))*0.25;
00167 Convolver c2(kernel,i_layer_image[2].getDims());
00168 i_layer_image[2] = c2.spatialConvolve(i_layer_image[2]);
00169
00170 temp_i = i_layer_image[1];
00171 writeText(temp_i,Point2D<int>(2,0),"I-layer",
00172 PixRGB<byte>(255,0,0),PixRGB<byte>(0,0,0), SimpleFont::FIXED(9));
00173 layers.drawImage(temp_i,0,241);
00174
00175
00176
00177 s_layer_image[1] = p_layer_image[3] - ((i_layer_image[1])*2);
00178 temp_s = s_layer_image[1];
00179 writeText(temp_s,Point2D<int>(2,0),"S-layer",
00180 PixRGB<byte>(255,0,0),PixRGB<byte>(0,0,0), SimpleFont::FIXED(9));
00181 layers.drawImage(temp_s, 321,241 );
00182
00183
00184 aptr = s_layer_image[1].beginw();
00185
00186 for (int w = 0; w < s_layer_image[1].getDims().w(); w++)
00187 for(int h = 0; h < s_layer_image[1].getDims().h(); h++)
00188 total_s_layer += *aptr++;
00189
00190 LINFO("%f", total_s_layer);
00191
00192 float tempPot = 1/(1 + exp(-total_s_layer/(320*240)));
00193
00194 if(potentialCnt < maxHistory)
00195 {
00196 lgmdPotential.push_back(tempPot);
00197 potentialCnt++;
00198 }
00199 else
00200 {
00201 lgmdPotential.erase(lgmdPotential.begin(), lgmdPotential.begin()+1);
00202 lgmdPotential.push_back(tempPot);
00203 potentialCnt++;
00204 }
00205
00206 Image<PixRGB<byte> > temp_grid = linePlot(lgmdPotential, 400, 400,
00207 0.0f, 5.0f, "time");
00208 char str[256];
00209 sprintf(str, "lgmd potential = %f", tempPot);
00210
00211 writeText(temp_grid,Point2D<int>(2,0),str,
00212 PixRGB<byte>(255,0,0),PixRGB<byte>(0,0,0), SimpleFont::FIXED(9));
00213 layers.drawImage(temp_grid, 675, 25);
00214
00215 }
00216
00217
00218
00219 mgr->stop();
00220
00221 return 0;
00222 }
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233