JD2022-TU1/main/extern/Camcam/LIBS/Trackeur/Interest.cpp

132 lines
3.3 KiB
C++

#include "TRACK.h"
#include "Rrasters.h"
#include "xmmintrin.h"
#define AVERAGE_COLOR_RADIUS 8
#define __55_RADIUS 0
#define __55_RADIUS_BIG 2
#define __55_RADIUS_RATIO 0//<< impair !!
#define __55_RADIUS_RATIO_BIG 4
#define __55_FACTOR_USED (0x0A0)
#define MAX_SURF 1000
#define ERROR_THRESHOLD 4
#define THRESH_R55 1
#define BORDER_LIMIT 10
#define SMALL_SURFACE 1//((((__55_RADIUS)<<1) + 1) * (((__55_RADIUS)<<1) + 1))
#define RSMALL_SURFACE ((((__55_RADIUS_RATIO)<<1) + 1) * (((__55_RADIUS_RATIO)<<1) + 1))
#define BIG_SURFACE ((((__55_RADIUS_BIG)<<1) + 1) * (((__55_RADIUS_BIG)<<1) + 1))
#define ONE_PO2 20
#define BIG_FACTOR ( (1<<ONE_PO2) / BIG_SURFACE )
#define SMALL_FACTOR ( (1<<ONE_PO2) / SMALL_SURFACE )
static float BigX;
static float BigY;
static s32 BigW;
static s32 BigE;
static TRACKEDPOINT *ALLXYW;
static s32 ALLPoints ;
static s32 SOLVXmax,SOLVYmax;
static void RATIO55(MAP *MapSRC,MAP *MapDST)
{
s32 *LAST,*DST,*SRC;
DST = MapDST->BASE;
SRC = MapSRC->BASE;
for (u32 SizeY = 0; SizeY < MapSRC->SY;SizeY ++)
{
LAST = DST + MapSRC->SX;
while (DST < LAST)
{
s32 Local,LocalBig;
Local = *(SRC);
LocalBig = *(DST);
*(DST) = 0;
if ((Local * __55_FACTOR_USED) > LocalBig<<8)
{
*(DST) = 1 | LocalBig;
}
DST++;
SRC++;
}
SRC+=MapSRC->PITCH-MapSRC->SX;
DST+=MapDST->PITCH-MapSRC->SX;
}
}
static void SOLVE(s32 *DST , s32 X, s32 Y,s32 P)
{
BigX += X ;
BigY += Y ;
BigW += 1;
if (BigE < *DST) BigE = *DST;
*DST &= ~1;
if (X <= BORDER_LIMIT) return;
if (Y <= BORDER_LIMIT) return;
if (X >= SOLVXmax - BORDER_LIMIT) return;
if (Y >= SOLVYmax - BORDER_LIMIT) return;
if (*(DST+1)&1) SOLVE(DST + 1 , X + 1, Y,P);
if (*(DST+P)&1) SOLVE(DST + P , X + 0, Y + 1,P);
if (*(DST-1)&1) SOLVE(DST - 1 , X - 1, Y,P);
if (*(DST-P)&1) SOLVE(DST - P , X + 0, Y - 1,P);
}
static void VECTORIZE_POINTS(MAP *MapDST,MAP *MapII,u32 SHIFT)
{
s32 *LAST,*DST;
#define VEC_BORDER (BORDER_LIMIT)
float Mulot;
DST = MapDST->BASE + MapDST->PITCH * VEC_BORDER;
SOLVXmax = MapDST->SX ;
SOLVYmax = MapDST->SY;
Mulot = (float)(1<<SHIFT);
for (u32 SizeY = VEC_BORDER; SizeY < MapDST->SY-VEC_BORDER;SizeY ++)
{
u32 SizeX;
DST += VEC_BORDER;
SizeX = VEC_BORDER;
LAST = DST + MapDST->SX - VEC_BORDER * 2;
while (DST < LAST)
{
if ((*DST & 1) && (*DST > ERROR_THRESHOLD)) // RASTER
{
if (ALLPoints<MAX_POINTS)
{
BigX = BigY = 0.0f;
BigW = BigE = 0;
SOLVE(DST , SizeX, SizeY ,MapDST->PITCH );
//if ((BigE > ERROR_THRESHOLD) /*&& (BigW < MAX_SURF)*/)
{
memset(&ALLXYW[ALLPoints],0,sizeof(TRACKEDPOINT));
BigX /= (float)BigW;
BigY /= (float)BigW;
BigX *= Mulot;
BigY *= Mulot;
ALLXYW[ALLPoints].BigE = BigE;
ALLXYW[ALLPoints].X = BigX;
ALLXYW[ALLPoints].Y = BigY;
BigE>>=2;
BigW<<=4;
if (BigW > 0xff) BigW = 0xff;
if (ALLXYW[ALLPoints].X < 0) ALLXYW[ALLPoints].X = 0;
if (ALLXYW[ALLPoints].Y < 0) ALLXYW[ALLPoints].Y = 0;
ALLXYW[ALLPoints].PreviousIndex = 0xffffffff;
ALLXYW[ALLPoints].NextIndex = 0xffffffff;
s32 *SRC;
SRC = MapII->BASE + (u32)ALLXYW[ALLPoints].X - (AVERAGE_COLOR_RADIUS>>1) - 1 + (u32)(ALLXYW[ALLPoints].Y-(AVERAGE_COLOR_RADIUS>>1) - 1) * MapII->PITCH;
ALLPoints++;
}
}
}
DST++;
SizeX++;
}
DST+=MapDST->PITCH-MapDST->SX;
DST+=VEC_BORDER;
}
}