|
|
// RegionDetector.h: interface for the CRegionDetector class.
//
//////////////////////////////////////////////////////////////////////
#include "32BitDib.h"
struct CRegionList { private: CRegionList( const CRegionList & ); CRegionList &operator=( const CRegionList & ); public: CRegionList(int num); virtual ~CRegionList() { delete m_pRects; delete m_pixelsFilled; delete m_valid; delete m_type; delete m_totalColored; delete m_totalIntensity; delete m_totalEdge; delete m_backgroundColorPixels; }
// public... number of valid rects
int Size(int r) { return (m_pRects[r].right-m_pRects[r].left)*(m_pRects[r].bottom-m_pRects[r].top); }
// public
RECT operator[](int num) { return nthRegion(num); }
// public
int UnionIntersectingRegions();
// public
RECT unionAll();
// private
RECT nthRegion(int num);
int RegionType(int region);
bool largeRegion(int region);
double ClassifyRegion(int region); // determine if the region is a text or a graphics region
bool checkIfValidRegion(int region, int border = 0); // syncs whether a region is valid or not
bool ValidRegion(int region, int border = 0); // determines if a region is likely a worthless speck of dust or shadow or if we should care about the region
bool InsideRegion(int region, int x, int y, int border=0); // border is the amount of border space to place around the outside of the region
void AddPixel(int region, ULONG pixel,ULONG edge, int x, int y); // unions two regions together... region b is invalidated
bool UnionRegions(int a, int b); RECT UnionRects(RECT a, RECT b); bool MergerIntersectsPhoto(int a, int b); // if we merge these two regions, will we also be merging with a photo region (a taboo)
// see InsideRegion for an explaination of what border is
bool CheckIntersect(int a, int b, int border=0); // do regions a and b intersect?
bool CheckIntersect(RECT r1, RECT r2, int border=0); // do regions a and b intersect?
static RECT Intersect(RECT r1, RECT r2);
static bool InsideRegion(RECT region, int x, int y, int border=0); // border is the amount of border space to place around the outside of the region
// compact down ignores all other info aside from rect location
// leads to faster access
void CompactDown(int size);
// dibs are stored upside down from normal screen coords
// so apps will often want to flip the bitmap first
void FlipVertically();
int m_numRects; int m_validRects; int m_nBitmapWidth; int m_nBitmapHeight; RECT * m_pRects; bool * m_valid; // is the rectangle a valid rectangle or has it been sent to the region graveyard in the sky
int * m_type; // is this region a text region or a photograph? PHOTOGRAPH_REGION TEXT_REGION
// the following indicators are used to determine if a region is a valid region
ULONG * m_pixelsFilled; // how many of the pixels in the region were actually selected?
ULONG * m_totalColored; // accumulated color difference indicator
ULONG * m_totalIntensity; // accumulated intensity indicator
ULONG * m_totalEdge; // accumulated edge values
int *m_backgroundColorPixels; // number of pixels which are very close to the background color (used for determining text region status... particularly useful in cases where part of a text region may have a shadow which could lead the program to think it was a photo region
int m_maxRects; };
class CRegionDetector { private: // Not implemented
CRegionDetector( const CRegionDetector & ); CRegionDetector &operator=( const CRegionDetector & );
public: // will be made private when we are done debugging
C32BitDibWrapper * m_pScan; C32BitDibWrapper * m_pScanBlurred; C32BitDibWrapper * m_pScanDoubleBlurred; C32BitDibWrapper * m_pScanTripleBlurred;
C32BitDibWrapper * m_pScanHorizontalBlurred; C32BitDibWrapper * m_pScanVerticalBlurred; C32BitDibWrapper * m_pScanDoubleHorizontalBlurred; C32BitDibWrapper * m_pScanDoubleVerticalBlurred;
C32BitDibWrapper * m_pScanEdges; C32BitDibWrapper * m_pScanDoubleEdges; C32BitDibWrapper * m_pScanTripleEdges; C32BitDibWrapper * m_pScanHorizontalEdges; C32BitDibWrapper * m_pScanDoubleHorizontalEdges; C32BitDibWrapper * m_pScanVerticalEdges; C32BitDibWrapper * m_pScanDoubleVerticalEdges; C32BitDibWrapper * m_pScanWithShadows;
CRegionList * m_pRegions; int m_resampleFactor; // ratio between imageDimensions and origional image dimensions
int m_intent; // either try to avoid deciding stray dots are images or try to avoid deciding real images aren't images
// not used as yet
public: CRegionDetector(BYTE* dib) { m_pScan = new C32BitDibWrapper(dib); m_pScanBlurred = new C32BitDibWrapper(); // create an empty wrapper
m_pScanDoubleBlurred = new C32BitDibWrapper(); m_pScanTripleBlurred = new C32BitDibWrapper();
m_pScanHorizontalBlurred = new C32BitDibWrapper(); m_pScanVerticalBlurred = new C32BitDibWrapper();
m_pScanDoubleHorizontalBlurred = new C32BitDibWrapper(); m_pScanDoubleVerticalBlurred = new C32BitDibWrapper();
m_pScanEdges = new C32BitDibWrapper(); m_pScanDoubleEdges = new C32BitDibWrapper(); m_pScanTripleEdges = new C32BitDibWrapper();
m_pScanHorizontalEdges = new C32BitDibWrapper(); m_pScanVerticalEdges = new C32BitDibWrapper();
m_pScanDoubleHorizontalEdges = new C32BitDibWrapper(); m_pScanDoubleVerticalEdges = new C32BitDibWrapper();
m_resampleFactor=1; m_pScanWithShadows = NULL; m_pRegions=NULL; m_intent=TRUE; // m_intent isn't yet implemented
}
CRegionDetector(BITMAP pBitmap) { m_pScan = new C32BitDibWrapper(pBitmap); m_pScanBlurred = new C32BitDibWrapper(); // create an empty wrapper
m_pScanDoubleBlurred = new C32BitDibWrapper(); m_pScanTripleBlurred = new C32BitDibWrapper();
m_pScanHorizontalBlurred = new C32BitDibWrapper(); m_pScanVerticalBlurred = new C32BitDibWrapper();
m_pScanDoubleHorizontalBlurred = new C32BitDibWrapper(); m_pScanDoubleVerticalBlurred = new C32BitDibWrapper();
m_pScanEdges = new C32BitDibWrapper(); m_pScanDoubleEdges = new C32BitDibWrapper(); m_pScanTripleEdges = new C32BitDibWrapper();
m_pScanHorizontalEdges = new C32BitDibWrapper(); m_pScanVerticalEdges = new C32BitDibWrapper();
m_pScanDoubleHorizontalEdges = new C32BitDibWrapper(); m_pScanDoubleVerticalEdges = new C32BitDibWrapper();
m_resampleFactor=1; m_pScanWithShadows = NULL; m_pRegions=NULL; m_intent=TRUE; // m_intent isn't yet implemented
}
virtual ~CRegionDetector() { if (m_pScan) delete m_pScan; if (m_pScanBlurred) delete m_pScanBlurred; if (m_pScanDoubleBlurred) delete m_pScanDoubleBlurred; if (m_pScanTripleBlurred) delete m_pScanTripleBlurred;
if (m_pScanHorizontalBlurred) delete m_pScanHorizontalBlurred; if (m_pScanVerticalBlurred) delete m_pScanVerticalBlurred;
if (m_pScanDoubleHorizontalBlurred) delete m_pScanDoubleHorizontalBlurred; if (m_pScanDoubleVerticalBlurred) delete m_pScanDoubleVerticalBlurred;
if (m_pScanEdges) delete m_pScanEdges; if (m_pScanDoubleEdges) delete m_pScanDoubleEdges; if (m_pScanTripleEdges) delete m_pScanTripleEdges;
if (m_pScanHorizontalEdges) delete m_pScanHorizontalEdges; if (m_pScanVerticalEdges) delete m_pScanVerticalEdges;
if (m_pScanDoubleHorizontalEdges) delete m_pScanDoubleHorizontalEdges; if (m_pScanDoubleVerticalEdges) delete m_pScanDoubleVerticalEdges;
if (m_pScanWithShadows) delete m_pScanWithShadows; if(m_pRegions!=NULL) delete m_pRegions; } public: int FindRegions(); bool FindSingleRegion(); bool CollisionDetection(RECT r1, RECT r2, C32BitDibWrapper* pImage); bool ConvertToOrigionalCoordinates(); };
|