mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
8.1 KiB
224 lines
8.1 KiB
// 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();
|
|
};
|