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

BlackFrameProc.h

Go to the documentation of this file.
00001 #ifndef Impala_Core_VideoSet_BlackFrameProc_h
00002 #define Impala_Core_VideoSet_BlackFrameProc_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 namespace Impala
00017 {
00018 namespace Core
00019 {
00020 namespace VideoSet
00021 {
00022 
00023 
00024 class BlackFrameProc : public Listener
00025 {
00026 public:
00027     typedef Array::Array2dScalarReal64 Array2dScalarReal64;
00028 
00029     BlackFrameProc(Reporter* reporter, CmdOptions& options)
00030     {
00031         mTable = 0;
00032         mStripBorder = options.GetInt("borderWidth");   
00033     }
00034 
00035     virtual void
00036     HandleNewWalk(VideoSet* vs, String walkType)
00037     {
00038         mWalkType = walkType;
00039     }
00040 
00041     virtual void
00042     HandleNewFile(VideoSet* vs, int fileId, Stream::RgbDataSrc* src)
00043     {
00044         mTable = new Feature::FeatureTable(String("avg-int-grad"), 500, 2);
00045     }
00046     
00047     void
00048     ComputeGradient(Array2dScalarReal64*& magnitude, 
00049 //                    Array2dScalarReal64*& direction, 
00050                     Array2dScalarReal64* im,
00051                     Real64 sigma)
00052     {
00053         Real64 precision = 3.0;
00054     
00055         Array2dScalarReal64* Lx = 0;
00056         Array2dScalarReal64* Ly = 0;
00057         RecGauss(Lx, im, sigma, sigma, 1, 0, precision);
00058         RecGauss(Ly, im, sigma, sigma, 0, 1, precision);
00059     
00060         // compute gradient magnitude
00061         Array2dScalarReal64* Lx2 = 0;
00062         Array2dScalarReal64* Ly2 = 0;
00063         Mul(Lx2, Lx, Lx);
00064         Mul(Ly2, Ly, Ly);
00065         Add(magnitude, Lx2, Ly2);
00066         Sqrt(magnitude, magnitude);
00067         delete Lx2;
00068         delete Ly2;
00069         
00070         // compute gradient direction
00071         //Atan2(direction, Ly, Lx);
00072         delete Lx;
00073         delete Ly;
00074     }
00075 
00076     virtual void
00077     HandleNewFrame(VideoSet* vs, int fileId, Stream::RgbDataSrc* src)
00078     {
00079         /* get frame */
00080         Array::Array2dVec3UInt8* im = Array::ArrayCreate<Array::Array2dVec3UInt8>
00081             (src->FrameWidth(), src->FrameHeight(), 0, 0, src->DataPtr(), true);
00082 
00083         /* verify image is not null */
00084         if (!im) {
00085             ILOG_ERROR("No image: fileId=" << fileId);
00086             return;
00087         }
00088         
00089         Quid quid = vs->GetQuidFrame(fileId, src->FrameNr());
00090 
00091         // remove the border, if requested
00092         Geometry::Rectangle rect(mStripBorder, mStripBorder, im->CW() - mStripBorder - 1, im->CH() - mStripBorder - 1, true);
00093         Array::Array2dVec3UInt8* imNoBorder = MakeRoi(im, rect);
00094         delete im;
00095 
00096         Array2dScalarReal64* imIntensity = 0;
00097         RGB2Intensity(imIntensity, imNoBorder);
00098         delete imNoBorder;
00099         
00100         Real64 sigma = 2.0;
00101         Array2dScalarReal64* magnitude = 0;
00102         //Array2dScalarReal64* direction = 0;
00103         ComputeGradient(magnitude, imIntensity, sigma);
00104         //delete direction;
00105         
00106         int n = (imIntensity->CW() * imIntensity->CH());
00107         Real64 avgMagnitude = PixSum(magnitude) / n;
00108         Real64 avgIntensity = PixSum(imIntensity) / n;
00109         
00110         Vector::VectorTem<Real64> codebookVector = Vector::VectorTem<Real64>(2);
00111         codebookVector.Elem(0) = avgIntensity;
00112         codebookVector.Elem(1) = avgMagnitude;
00113         mTable->Add(quid, codebookVector);
00114 
00115         delete magnitude;
00116         delete imIntensity;
00117     }
00118 
00119     virtual void
00120     HandleDoneFile(VideoSet* vs, int fileId, Stream::RgbDataSrc* src)
00121     {
00122         typedef Persistency::FeatureLocator FeatureLocator;
00123         FeatureLocator loc(vs->GetLocator(), false, false, mWalkType,
00124                            "avg-int-grad", vs->GetContainerFile(fileId));
00125         Persistency::FeatureTableRepository().Add(loc, mTable);
00126         delete mTable;
00127         mTable = 0;
00128         ILOG_DEBUG("HandleDoneFile: " << fileId);
00129     }
00130 
00131 private:
00132 
00133     int                mStripBorder;
00134     Feature::FeatureTable*      mTable;
00135     String             mWalkType;
00136 
00137     ILOG_VAR_DEC;
00138 };
00139 
00140 ILOG_VAR_INIT(BlackFrameProc, Core.VideoSet);
00141 
00142 } // namespace VideoSet
00143 } // namespace Core
00144 } // namespace Impala
00145 
00146 #endif

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