Input value of the function is 2D vector.
Ouput is struct that include 6 elements is consisted by 2x1 means and 2x2 covariance.
struct mean_cov{
float mean11;
float mean21;
float cov11;
float cov12;
float cov21;
float cov22;
};
mean_cov Get_M_C(vector< pair > &vecMC ){
mean_cov smc;
memset(&smc, 0, sizeof(float) * 6 );
//mean first, second
float sum_1=0;
float sum_2=0;
float sum_3=0;
//mean
int i;
for(i=0; i < vecMC.size(); ++i)
{
sum_1 = sum_1 + vecMC[i].first;
sum_2 = sum_2 + vecMC[i].second;
}
smc.mean11 = sum_1 / vecMC.size();
smc.mean21 = sum_2 / vecMC.size();
sum_1 = 0;
sum_2 = 0;
sum_3 = 0;
for(i=0; i < vecMC.size(); ++i)
{
sum_1 = sum_1 + ( (vecMC[i].first - smc.mean11) * (vecMC[i].first - smc.mean11) );
sum_3 = sum_3 + ( (vecMC[i].second - smc.mean21) * (vecMC[i].second - smc.mean21) );
sum_2 = sum_2 + ( (vecMC[i].first - smc.mean11) * (vecMC[i].second - smc.mean21) );
}
smc.cov11 = sum_1 / (vecMC.size()-1);
smc.cov22 = sum_3 / (vecMC.size()-1);
smc.cov21 = sum_2 / (vecMC.size()-1);
smc.cov12 = sum_2 / (vecMC.size()-1);
//cov 11
//cov 12
//cov 22
//cov 21 is same with cov 12
printf("mean11 = %lf \n", smc.mean11 );
printf("mean21 = %lf \n", smc.mean21 );
printf("cov11 = %lf \n", smc.cov11 );
printf("cov12 = %lf \n", smc.cov12 );
printf("cov21 = %lf \n", smc.cov21 );
printf("cov22 = %lf \n", smc.cov22 );
return smc;
}
This source code is example for using the function Get_M_C
vector< pair < float, float > > m;
mean_cov SampleMC;
for(int h=0; h< img1->height; ++h)
{
for(int w=0; w< img1->width; ++w)
{
unsigned char R,G,B;
B = (unsigned char)img1->imageData[h*img1->widthStep+w*3+0];
G = (unsigned char)img1->imageData[h*img1->widthStep+w*3+1];
R = (unsigned char)img1->imageData[h*img1->widthStep+w*3+2];
float Cb,Cr;
GetCbCrFromRGB(R, G, B, &Cb, &Cr);
m.push_back( make_pair(Cb, Cr) );
}
}
SampleMC = Get_M_C( m );
No comments:
Post a Comment