00001 #include <algorithm>
00002 using namespace std;
00003
00004 #include "ClassicSceneChangeDetector.h"
00005 #include "Histogram.h"
00006
00007 ClassicSceneChangeDetector::ClassicSceneChangeDetector(unsigned int width,
00008 unsigned int height, unsigned int commdetectborder_in,
00009 unsigned int xspacing_in, unsigned int yspacing_in):
00010 SceneChangeDetectorBase(width,height),
00011 frameNumber(0),
00012 previousFrameWasSceneChange(false),
00013 xspacing(xspacing_in),
00014 yspacing(yspacing_in),
00015 commdetectborder(commdetectborder_in)
00016 {
00017 histogram = new Histogram;
00018 previousHistogram = new Histogram;
00019 }
00020
00021 void ClassicSceneChangeDetector::deleteLater(void)
00022 {
00023 delete histogram;
00024 delete previousHistogram;
00025 SceneChangeDetectorBase::deleteLater();
00026 }
00027
00028 void ClassicSceneChangeDetector::processFrame(unsigned char* frame)
00029 {
00030 histogram->generateFromImage(frame, width, height, commdetectborder,
00031 width-commdetectborder, commdetectborder,
00032 height-commdetectborder, xspacing, yspacing);
00033 float similar = histogram->calculateSimilarityWith(*previousHistogram);
00034
00035 bool isSceneChange = (similar < .85 && !previousFrameWasSceneChange);
00036
00037 emit(haveNewInformation(frameNumber,isSceneChange,similar));
00038 previousFrameWasSceneChange = isSceneChange;
00039
00040 std::swap(histogram,previousHistogram);
00041 frameNumber++;
00042 }
00043
00044
00045