Home || Visual Search || Applications || Architecture || Important Messages || OGL || Src

BlackFrameDetect.h

Go to the documentation of this file.
00001 #ifndef Impala_Core_VideoSet_BlackFrameDetect_h
00002 #define Impala_Core_VideoSet_BlackFrameDetect_h
00003 
00004 #include "Core/VideoSet/Reporter.h"
00005 #include "Core/VideoSet/Keyframes.h"
00006 #include "Core/Array/MakeRoi.h"
00007 #include "Core/Array/RGB2Gray.h"
00008 #include "Core/Array/PixSum.h"
00009 #include "Core/Array/RecGauss.h"
00010 #include "Core/Array/Mul.h"
00011 #include "Core/Array/Add.h"
00012 #include "Core/Array/RGB2Intensity.h"
00013 #include "Core/Array/Sqrt.h"
00014 #include "Persistency/FeatureTableRepository.h"
00015 
00016 //
00017 // by Jun Wu, created on 2009-10-26
00018 // based on BlackFrameProc.h by Koen
00019 // 
00020 
00021 namespace Impala
00022 {
00023 namespace Core
00024 {
00025 namespace VideoSet
00026 {
00027 
00028 
00029 class BlackFrameDetect : public Listener
00030 {
00031 public:
00032     typedef Array::Array2dScalarReal64 Array2dScalarReal64;
00033 
00034     BlackFrameDetect(Reporter* reporter, CmdOptions& options)
00035     {
00036         mKeyframes = 0;
00037         mTable = 0;
00038         mStripBorder = options.GetInt("borderWidth");  
00039 
00040         mFeatureDim = 3;
00041     }
00042 
00043     virtual void
00044     HandleNewWalk(VideoSet* vs, Keyframes* keyframes, bool* keyframeMask)
00045     {
00046         mKeyframes = keyframes;
00047     }
00048 
00049     virtual void
00050     HandleNewFile(VideoSet* vs, int fileId, Stream::RgbDataSrc* src)
00051     {
00052         //"intensity-magnitude-hist0"
00053         mTable = new Feature::FeatureTable(String("avg-int-grad"), 500, mFeatureDim);   
00054     }
00055     
00056     void
00057     ComputeGradient(Array2dScalarReal64*& magnitude, 
00058 //                    Array2dScalarReal64*& direction, 
00059                     Array2dScalarReal64* im,
00060                     Real64 sigma)
00061     {
00062         Real64 precision = 3.0;
00063     
00064         Array2dScalarReal64* Lx = 0;
00065         Array2dScalarReal64* Ly = 0;
00066         RecGauss(Lx, im, sigma, sigma, 1, 0, precision);
00067         RecGauss(Ly, im, sigma, sigma, 0, 1, precision);
00068     
00069         // compute gradient magnitude
00070         Array2dScalarReal64* Lx2 = 0;
00071         Array2dScalarReal64* Ly2 = 0;
00072         Mul(Lx2, Lx, Lx);
00073         Mul(Ly2, Ly, Ly);
00074         Add(magnitude, Lx2, Ly2);
00075         Sqrt(magnitude, magnitude);
00076         delete Lx2;
00077         delete Ly2;
00078         
00079         // compute gradient direction
00080         //Atan2(direction, Ly, Lx);
00081         delete Lx;
00082         delete Ly;
00083     }
00084 
00085     virtual void
00086     HandleNewFrame(VideoSet* vs, int fileId, Stream::RgbDataSrc* src)
00087     {
00088         /* get frame */
00089         Array::Array2dVec3UInt8* im = Array::ArrayCreate<Array::Array2dVec3UInt8>
00090             (src->FrameWidth(), src->FrameHeight(), 0, 0, src->DataPtr(), true);
00091 
00092         /* verify image is not null */
00093         if (!im) {
00094             ILOG_ERROR("No image: fileId=" << fileId);
00095             return;
00096         }
00097         
00098         Quid quid = vs->GetQuidFrame(fileId, src->FrameNr());
00099 
00100         // remove the border, if requested
00101         Geometry::Rectangle rect(mStripBorder, mStripBorder, im->CW() - mStripBorder - 1, im->CH() - mStripBorder - 1, true);
00102         Array::Array2dVec3UInt8* imNoBorder = MakeRoi(im, rect);
00103         delete im;
00104 
00105         Array2dScalarReal64* imIntensity = 0;
00106         Array::RGB2Intensity(imIntensity, imNoBorder);
00107         delete imNoBorder;
00108         
00109         Real64 sigma = 2.0;
00110         Array2dScalarReal64* magnitude = 0;
00111         //Array2dScalarReal64* direction = 0;
00112         ComputeGradient(magnitude, imIntensity, sigma);
00113         //delete direction;
00114         
00115         int n = (imIntensity->CW() * imIntensity->CH());
00116         Real64 avgMagnitude = Array::PixSum(magnitude) / n;
00117         Real64 avgIntensity = Array::PixSum(imIntensity) / n;
00118         
00119         Vector::VectorTem<Real64> codebookVector =
00120             Vector::VectorTem<Real64>(mFeatureDim);
00121         codebookVector.Elem(0) = avgIntensity;
00122         codebookVector.Elem(1) = avgMagnitude;
00123 
00124         // added by Jun Wu
00125                 // bin 0 for color historgram from gray image
00126         codebookVector.Elem(2) = (Real64)0.001;
00127         mTable->Add(quid, codebookVector);
00128 
00129         delete magnitude;
00130         delete imIntensity;
00131 
00132         //ILOG_INFO("DoneFrame: " << fileId << src);
00133     }
00134 
00135     virtual void
00136     HandleDoneFile(VideoSet* vs, int fileId, Stream::RgbDataSrc* src)
00137     {
00138         typedef Persistency::FeatureLocator FeatureLocator;
00139         FeatureLocator loc(vs->GetLocator(), false, false, "Keyframes",
00140                            "avg-int-grad", vs->GetContainerFile(fileId));
00141         Persistency::FeatureTableRepository().Add(loc, mTable);
00142         delete mTable;
00143         mTable = 0;
00144         ILOG_INFO("HandleDoneFile: " << fileId);
00145     }
00146 
00147 private:
00148 
00149     Keyframes*         mKeyframes;
00150     int                mStripBorder;
00151     Feature::FeatureTable*      mTable;
00152 
00153     // added by Jun Wu 27/10/2009
00154     int                mFeatureDim;
00155 
00156     ILOG_VAR_DEC;
00157 };
00158 
00159 ILOG_VAR_INIT(BlackFrameDetect, Core.VideoSet);
00160 
00161 } // namespace VideoSet
00162 } // namespace Core
00163 } // namespace Impala
00164 
00165 #endif

Generated on Thu Jan 13 09:04:45 2011 for ImpalaSrc by  doxygen 1.5.1