PDA

Visualizza la versione completa : [C++] Elaborazione frame videocamera ad alta risoluzione


Pirelli72
29-06-2010, 15:41
Il seguente codice elabora i frame di una videocamera ad alta risoluzione.
C'è qualcuno che mi spiega riga per riga il codice:



__declspec(dllexport) void pcBuildProfiles(unsigned char * pImage,int iWidth, int iHeight,int iWidthStep, int iLaserOrientation,int threshold, float * fvCentroids,float * fvWeights,int iVectorDim)
{
unsigned int *ivCentr;
unsigned int *ivWeight;
unsigned int *ivCentrRun;
unsigned int *ivWeightRun;

CleanVector(fvCentroids,iVectorDim);
CleanVector(fvWeights,iVectorDim);
ivCentr =(unsigned int *)malloc(iVectorDim*sizeof(unsigned int));
ivWeight =(unsigned int *)malloc(iVectorDim*sizeof(float));
memset(ivCentr,0,iVectorDim*sizeof(unsigned int));
memset(ivWeight,0,iVectorDim*sizeof(unsigned int));


int x;
int y;
unsigned char * pPixel;
unsigned char Pixel;

ivCentrRun=ivCentr;
ivWeightRun=ivWeight;

for (y = 0; y < iHeight; y++)
{
pPixel= pImage;
pPixel +=iWidthStep* y;
for (x = 0; x < iWidth; x++, pPixel++)
{
Pixel = *pPixel;
if (Pixel > threshold)
{
Pixel -= threshold;
*ivCentrRun += (Pixel * x);
*ivWeightRun += Pixel;
}
}
if (ivWeightRun > 0)
{
fvCentroids[y] = (float)*ivCentrRun/ *ivWeightRun;
fvWeights[y] = (float)*ivWeightRun;
}
ivCentrRun++;
ivWeightRun++;
}
}
free(ivCentr);
free(ivWeight);
}


:messner:

Pirelli72
29-06-2010, 18:34
ok per gradi:

questa è una variabile di tipo 'Char'



unsigned char Pixel;


questa assegnazione ?



unsigned char * pPixel;

oregon
29-06-2010, 18:35
La prima è una variabile di tipo unsigned char ...

Il secondo è un puntatore ad unsigned char ...

Pirelli72
29-06-2010, 18:47
Originariamente inviato da oregon
La prima è una variabile di tipo unsigned char ...


ok infatti è un valore da 0 a 255 che mi identifica il colore del pixel.

Infatti ho:



if (Pixel > threshold)


in cui threshold è la soglia di colore. Ma non capisco dove assegna il colore del pixel x,y alla variabile Pixel.

oregon
29-06-2010, 18:49
Qui

Pixel = *pPixel;

Pirelli72
29-06-2010, 19:08
Originariamente inviato da oregon
Qui

Pixel = *pPixel;

Non ho capito come ma fa lo stesso......
Ora qui fa questi calcoli:



if (Pixel > threshold)
{
Pixel -= threshold;
*ivCentrRun += (Pixel * y);
*ivWeightRun += Pixel;
}
}
if (ivWeightRun > 0)
{
fvCentroids[y] = (float)*ivCentrRun/ *ivWeightRun;
fvWeights[y] = (float)*ivWeightRun;


Ovvero se il colore del pixel x,y è maggiore della soglia impostata allora:
-sottrae alla variabile Pixel la soglia
-aggiunge a ivCentrRun il prodotto di Pixel per la coordinata x del pixel stesso
-aggiunte a ivWeightRun il colore del pixel - la soglia

Ora qual'è il senso di popolare le due matrici, con i valore sopra menzionati, in quel modo?



fvCentroids[y] = (float)*ivCentrRun/ *ivWeightRun;
fvWeights[y] = (float)*ivWeightRun;

MItaly
29-06-2010, 21:22
Originariamente inviato da Pirelli72
Non ho capito come ma fa lo stesso......
Sta semplicemente dereferenziando il puntatore in questione...


Ora qui fa questi calcoli:



if (Pixel > threshold)
{
Pixel -= threshold;
*ivCentrRun += (Pixel * y);
*ivWeightRun += Pixel;
}
}
if (ivWeightRun > 0)
{
fvCentroids[y] = (float)*ivCentrRun/ *ivWeightRun;
fvWeights[y] = (float)*ivWeightRun;


Ovvero se il colore del pixel x,y è maggiore della soglia impostata allora:
-sottrae alla variabile Pixel la soglia
-aggiunge a ivCentrRun il prodotto di Pixel per la coordinata x del pixel stesso
-aggiunte a ivWeightRun il colore del pixel - la soglia

Ora qual'è il senso di popolare le due matrici, con i valore sopra menzionati, in quel modo?



fvCentroids[y] = (float)*ivCentrRun/ *ivWeightRun;
fvWeights[y] = (float)*ivWeightRun;

Così ad occhio direi che sta facendo un qualche genere di media pesata.

XWolverineX
29-06-2010, 22:15
Ci serve un stralcio di aiuto per aiutarti...che algoritmo è, cosa sta facendo...

oregon
29-06-2010, 22:18
Originariamente inviato da XWolverineX
... stralcio ...

E' meglio uno "straccio" di uno "stralcio" ... :)

MItaly
29-06-2010, 22:57
Già, col primo ci si può anche può anche pulire per terra. :zizi:



... ma il mocio è più comodo! :spy:

Loading