cvdirectcascade.h:
#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);
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 = 0;
unsigned char *ptr, *oldptr;
oldptr = IptImage + IptWidth * y + x;
int step = IptWidth - width;
do{
T = NewT;
C1 = 0









































cvdirectcascade.cpp:































































