videodiff.C

Go to the documentation of this file.
00001 /*!@file Media/videodiff.C compute average difference between video frames */
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: Laurent Itti <itti@usc.edu>
00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/Media/videodiff.C $
00035 // $Id: videodiff.C 5311 2005-08-12 18:29:27Z rjpeters $
00036 //
00037 
00038 #include "Component/ModelManager.H"
00039 #include "Image/ColorOps.H"
00040 #include "Image/Image.H"
00041 #include "Image/MathOps.H"  // for absDiff()
00042 #include "Image/Pixels.H"
00043 #include "Media/MPEGStream.H"
00044 #include "Media/MediaOpts.H"
00045 #include "Util/Types.H"
00046 
00047 #include <iostream>
00048 
00049 int main(const int argc, const char **argv)
00050 {
00051   MYLOGVERB = LOG_INFO;  // suppress debug messages
00052 
00053   // Instantiate a ModelManager:
00054   ModelManager manager("Video Diff");
00055 
00056   // Instantiate our various ModelComponents:
00057   nub::soft_ref<InputMPEGStream>
00058     ims(new InputMPEGStream(manager, "Input MPEG Stream", "InputMPEGStream"));
00059   manager.addSubComponent(ims);
00060 
00061   // Parse command-line:
00062   if (manager.parseCommandLine(argc, argv, "<input.mpg>", 1, 1) == false)
00063     return(1);
00064 
00065   // NOTE: this could now be controlled by a command-line option
00066   // --preload-mpeg=true
00067   manager.setOptionValString(&OPT_InputMPEGStreamPreload, "true");
00068 
00069   // do post-command-line configs:
00070   ims->setFileName(manager.getExtraArg(0));
00071 
00072   // let's get all our ModelComponent instances started:
00073   manager.start();
00074 
00075   // main loop:
00076   int frame = 0; Image<byte> prev; double sum = 0.0, sumsq = 0.0;
00077   while(1)
00078     {
00079       if ((frame % 50) == 0) LINFO("Processing frame %d...", frame);
00080 
00081       // load new frame:
00082       Image< PixRGB<byte> > input = ims->readRGB();
00083       if (input.initialized() == false) break;  // end of movie
00084 
00085       // compute difference:
00086       Image<byte> current = luminance(input);
00087       if (prev.initialized())
00088         {
00089           Image<byte> diff = absDiff(prev, current);
00090           double meandiff = mean(diff);
00091           sum += meandiff; sumsq += meandiff * meandiff;
00092         }
00093 
00094       // ready for next frame:
00095       prev = current; frame ++;
00096     }
00097 
00098   // compute average and std: we use the standard trick E[(X-E[X])^2]
00099   // = E[X^2] - E[X]^2, and apply the small-sample correction to the
00100   // variance (divide by n-1 instead of n):
00101   double n = double(frame) - 1.0; // number of differences taken
00102   double avg = sum / n;
00103   double stdev = sqrt((sumsq - sum * sum / n) / (n - 1.0));
00104 
00105   std::cout<<manager.getExtraArg(0)<<": "<<frame<<" frames, diff = "<<avg
00106            <<" +/- "<<stdev<<std::endl;
00107 
00108   // stop all our ModelComponents
00109   manager.stop();
00110 
00111   // all done!
00112   return 0;
00113 }
00114 
00115 // ######################################################################
00116 /* So things look consistent in everyone's emacs... */
00117 /* Local Variables: */
00118 /* indent-tabs-mode: nil */
00119 /* End: */
Generated on Sun May 8 08:05:20 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3