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
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
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
00071
00072 delete Lx;
00073 delete Ly;
00074 }
00075
00076 virtual void
00077 HandleNewFrame(VideoSet* vs, int fileId, Stream::RgbDataSrc* src)
00078 {
00079
00080 Array::Array2dVec3UInt8* im = Array::ArrayCreate<Array::Array2dVec3UInt8>
00081 (src->FrameWidth(), src->FrameHeight(), 0, 0, src->DataPtr(), true);
00082
00083
00084 if (!im) {
00085 ILOG_ERROR("No image: fileId=" << fileId);
00086 return;
00087 }
00088
00089 Quid quid = vs->GetQuidFrame(fileId, src->FrameNr());
00090
00091
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
00103 ComputeGradient(magnitude, imIntensity, sigma);
00104
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 }
00143 }
00144 }
00145
00146 #endif