cvdirectcascade.h:
cvdirectcascade.cpp:
#include
"
cv.h
"
struct TWeakClassifier
{
CvRect Rectangles[2];
} ;
struct PtrWeakClassifier
{
long *tl0, *tr0, *bl0, *br0;
long *tl1, *tr1, *bl1, *br1;
int offset, size0, size1;
int Threshold;
} ;
struct ListObjectType
{
int x, y, width, height;
int w;
bool use;
ListObjectType *next;
} ;
struct TLearnedObject
{
TWeakClassifier *Classifiers;
PtrWeakClassifier *ScaleClassifiers;
int ObjectWidth, ObjectHeight;
int NClassifiers;
} ;
struct TDetectSettings
{
double ScaleRatio, OffsetX, OffsetY;
int Ignore, MinW;
int StartSubWindow, EndSubWindow;
} ;
bool LoadDefaultSetting( char * FileName, TDetectSettings & DS);
void LearnClassifiers(unsigned char * IptImage, TLearnedObject & target, int IptWidth, int IptHeight);
int DetectObject(TLearnedObject & target, unsigned char * FrameImage, int Width, int Height, TDetectSettings & DS, CvRect *& Objects);
struct TWeakClassifier
{
CvRect Rectangles[2];
} ;
struct PtrWeakClassifier
{
long *tl0, *tr0, *bl0, *br0;
long *tl1, *tr1, *bl1, *br1;
int offset, size0, size1;
int Threshold;
} ;
struct ListObjectType
{
int x, y, width, height;
int w;
bool use;
ListObjectType *next;
} ;
struct TLearnedObject
{
TWeakClassifier *Classifiers;
PtrWeakClassifier *ScaleClassifiers;
int ObjectWidth, ObjectHeight;
int NClassifiers;
} ;
struct TDetectSettings
{
double ScaleRatio, OffsetX, OffsetY;
int Ignore, MinW;
int StartSubWindow, EndSubWindow;
} ;
bool LoadDefaultSetting( char * FileName, TDetectSettings & DS);
void LearnClassifiers(unsigned char * IptImage, TLearnedObject & target, int IptWidth, int IptHeight);
int DetectObject(TLearnedObject & target, unsigned char * FrameImage, int Width, int Height, TDetectSettings & DS, CvRect *& Objects);
cvdirectcascade.cpp:
#include
<
iostream.h
>
#include < stdio.h >
#include < math.h >
#include < string .h >
#include < ctype.h >
#include < stdlib.h >
#include " cv.h "
#include " cvdirectcascade.h "
bool Overlapped(ListObjectType * obj1, ListObjectType * obj2)
{
int cx = obj1->x + obj1->width / 2;
int cy = obj1->y + obj1->height / 2;
if ((cx > obj2->x) && (cx < obj2->x + obj2->width) && (cy > obj2->y) && (cy < obj2->y + obj2->height))
return true;
cx = obj2->x + obj2->width / 2;
cy = obj2->y + obj2->height / 2;
if ((cx > obj1->x) && (cx < obj1->x + obj1->width) && (cy > obj1->y) && (cy < obj1->y + obj1->height))
return true;
return false;
}
void RestoreImage(unsigned char * IptImage, long *& IntegralImage, int IptWidth, int IptHeight)
{
IntegralImage = new long [(IptWidth + 1) * (IptHeight + 1)];
long *pic = IntegralImage;
for (int i = 0; i < IptWidth + 1; i++)
{
*pic = 0; pic++;
}
for (int j = 0; j < IptHeight; j++)
{
*pic = 0; pic+=IptWidth + 1;
}
unsigned char *pc = IptImage;
long *picx, *picy, *picxy;
picxy = IntegralImage;
pic = picxy + IptWidth + 2;
picx = picxy + IptWidth + 1;
picy = picxy + 1;
for (i = 0; i < IptHeight; i++)
{
for (j = 0; j < IptWidth; j++)
{
*pic = *pc + *picx + *picy - *picxy;
pic++; picx++; picy++; picxy++;
pc++;
}
pic++; picx++; picy++; picxy++;
}
}
int CalculateXBoundary(unsigned char * IptImage, int IptWidth, int IptHeight, int x, int y, int width, int height)
{
int T, NewT = width / 2, C1 = 0, C2 = 0, D1 = 0, D2 =
#include < stdio.h >
#include < math.h >
#include < string .h >
#include < ctype.h >
#include < stdlib.h >
#include " cv.h "
#include " cvdirectcascade.h "
bool Overlapped(ListObjectType * obj1, ListObjectType * obj2)
{
int cx = obj1->x + obj1->width / 2;
int cy = obj1->y + obj1->height / 2;
if ((cx > obj2->x) && (cx < obj2->x + obj2->width) && (cy > obj2->y) && (cy < obj2->y + obj2->height))
return true;
cx = obj2->x + obj2->width / 2;
cy = obj2->y + obj2->height / 2;
if ((cx > obj1->x) && (cx < obj1->x + obj1->width) && (cy > obj1->y) && (cy < obj1->y + obj1->height))
return true;
return false;
}
void RestoreImage(unsigned char * IptImage, long *& IntegralImage, int IptWidth, int IptHeight)
{
IntegralImage = new long [(IptWidth + 1) * (IptHeight + 1)];
long *pic = IntegralImage;
for (int i = 0; i < IptWidth + 1; i++)
{
*pic = 0; pic++;
}
for (int j = 0; j < IptHeight; j++)
{
*pic = 0; pic+=IptWidth + 1;
}
unsigned char *pc = IptImage;
long *picx, *picy, *picxy;
picxy = IntegralImage;
pic = picxy + IptWidth + 2;
picx = picxy + IptWidth + 1;
picy = picxy + 1;
for (i = 0; i < IptHeight; i++)
{
for (j = 0; j < IptWidth; j++)
{
*pic = *pc + *picx + *picy - *picxy;
pic++; picx++; picy++; picxy++;
pc++;
}
pic++; picx++; picy++; picxy++;
}
}
int CalculateXBoundary(unsigned char * IptImage, int IptWidth, int IptHeight, int x, int y, int width, int height)
{
int T, NewT = width / 2, C1 = 0, C2 = 0, D1 = 0, D2 =