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
00018
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
00053 mTable = new Feature::FeatureTable(String("avg-int-grad"), 500, mFeatureDim);
00054 }
00055
00056 void
00057 ComputeGradient(Array2dScalarReal64*& magnitude,
00058
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
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
00080
00081 delete Lx;
00082 delete Ly;
00083 }
00084
00085 virtual void
00086 HandleNewFrame(VideoSet* vs, int fileId, Stream::RgbDataSrc* src)
00087 {
00088
00089 Array::Array2dVec3UInt8* im = Array::ArrayCreate<Array::Array2dVec3UInt8>
00090 (src->FrameWidth(), src->FrameHeight(), 0, 0, src->DataPtr(), true);
00091
00092
00093 if (!im) {
00094 ILOG_ERROR("No image: fileId=" << fileId);
00095 return;
00096 }
00097
00098 Quid quid = vs->GetQuidFrame(fileId, src->FrameNr());
00099
00100
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
00112 ComputeGradient(magnitude, imIntensity, sigma);
00113
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
00125
00126 codebookVector.Elem(2) = (Real64)0.001;
00127 mTable->Add(quid, codebookVector);
00128
00129 delete magnitude;
00130 delete imIntensity;
00131
00132
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
00154 int mFeatureDim;
00155
00156 ILOG_VAR_DEC;
00157 };
00158
00159 ILOG_VAR_INIT(BlackFrameDetect, Core.VideoSet);
00160
00161 }
00162 }
00163 }
00164
00165 #endif