1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
Scalar meanpixel(Mat matrx)
{
Scalar meanpix;
for(int i=0;i<matrx.rows;i++)
{
for(int j=0;j<matrx.cols;j++)
{
meanpix[0]=meanpix[0]+double(matrx.at<Vec3b>(i,j)[0]);
meanpix[1]=meanpix[1]+double(matrx.at<Vec3b>(i,j)[1]);
meanpix[2]=meanpix[2]+double(matrx.at<Vec3b>(i,j)[2]);
}
}
meanpix[0]=floor((meanpix[0]/(matrx.rows*matrx.cols))+0.5);
meanpix[1]=floor((meanpix[1]/(matrx.rows*matrx.cols))+0.5);
meanpix[2]=floor((meanpix[2]/(matrx.rows*matrx.cols))+0.5);
return meanpix;
}
Mat covarmatrixcal(Mat matrx1, Scalar meanscal)
{
double rr=0,rg=0,rb=0,gr=0,gg=0,gb=0,br=0,bg=0,bb=0;
int k=0;
k=(matrx1.rows*matrx1.cols);
Vec3b temp1;
for(int i = 0; i < matrx1.rows;i++)
{
for(int j=0;j<matrx1.cols;j++)
{
temp1=matrx1.at<Vec3b>(i,j);
rr=rr+((double(temp1[0])-meanscal[0])*(double(temp1[0])-meanscal[0]));
rg=rg+((double(temp1[0])-meanscal[0])*(double(temp1[1])-meanscal[1]));
rb=rb+((double(temp1[0])-meanscal[0])*(double(temp1[2])-meanscal[2]));
gg=gg+((double(temp1[1])-meanscal[1])*(double(temp1[1])-meanscal[1]));
gb=gb+((double(temp1[1])-meanscal[1])*(double(temp1[2])-meanscal[2]));
bb=bb+((double(temp1[2])-meanscal[2])*(double(temp1[2])-meanscal[2]));
}
}
rr=rr/(k-1);
rg=rg/(k-1);
rb=rb/(k-1);
gr=rg;
gg=gg/(k-1);
gb=gb/(k-1);
br=rb;
bg=gb;
bb=bb/(k-1);
double m[3][3]={{rr,rg,rb},{gr,gg,gb},{br,bg,bb}};
Mat covmatrix(3,3,CV_64F,m);
return covmatrix.clone();
}
double mahadistance(Mat invcov, Scalar meanvec, Vec3b patternvec)
{
double distmeasure=0;
Scalar x1,x2;
//mahalanobis distance is equal to (x-mean)^T*inv(cov)*(x-mean)
x1[0]=(patternvec[0]-meanvec[0]);
x1[1]=(patternvec[1]-meanvec[1]);
x1[2]=(patternvec[2]-meanvec[2]);
for(int k = 0; k < 3;k++)
{
x2[0]=x2[0]+(x1[k]*invcov.at<double>(k,0));
x2[1]=x2[1]+(x1[k]*invcov.at<double>(k,1)); //-1.#QNAN is element of inverse covariance matrix
x2[2]=x2[2]+(x1[k]*invcov.at<double>(k,2));
}
//x2[0]=(x1[0]*invcov.at<double>(1,1)+x1[1]*invcov.at<double>(2,1)+x1[2]*invcov.at<double>(3,1));
//x2[1]=(x1[0]*invcov.at<double>(1,2)+x1[1]*invcov.at<double>(2,2)+x1[2]*invcov.at<double>(3,2));
//x2[2]=(x1[0]*invcov.at<double>(1,3)+x1[1]*invcov.at<double>(2,3)+x1[2]*invcov.at<double>(3,3));
distmeasure=((x2[0]*x1[0])+(x2[1]*x1[1])+(x2[2]*x1[2]));
return distmeasure;
}
Mat inversemat(Mat matrx)
{
double determ;
determ = (matrx.at<double>(0,0)*((matrx.at<double>(1,1)*matrx.at<double>(2,2))-(matrx.at<double>(1,2)*matrx.at<double>(2,1))))-(matrx.at<double>(0,1)*((matrx.at<double>(1,0)*matrx.at<double>(2,2))-(matrx.at<double>(2,0)*matrx.at<double>(1,2))))+(matrx.at<double>(0,2)*((matrx.at<double>(1,0)*matrx.at<double>(2,1))-(matrx.at<double>(1,1)*matrx.at<double>(2,0))));
Mat mt=matrx.t();
double m11,m12,m13,m21,m22,m23,m31,m32,m33;
m11=(mt.at<double>(1,1)*mt.at<double>(2,2))-(mt.at<double>(2,1)*mt.at<double>(1,2));
m12=(mt.at<double>(1,0)*mt.at<double>(2,2))-(mt.at<double>(2,0)*mt.at<double>(1,2));
m13=(mt.at<double>(1,0)*mt.at<double>(2,1))-(mt.at<double>(2,0)*mt.at<double>(1,1));
m21=(mt.at<double>(0,1)*mt.at<double>(2,2))-(mt.at<double>(2,1)*mt.at<double>(0,2));
m22=(mt.at<double>(0,0)*mt.at<double>(2,2))-(mt.at<double>(2,0)*mt.at<double>(0,2));
m23=(mt.at<double>(0,0)*mt.at<double>(2,1))-(mt.at<double>(2,0)*mt.at<double>(0,1));
m31=(mt.at<double>(0,1)*mt.at<double>(1,2))-(mt.at<double>(1,1)*mt.at<double>(0,2));
m32=(mt.at<double>(0,0)*mt.at<double>(1,2))-(mt.at<double>(1,0)*mt.at<double>(0,2));
m33=(mt.at<double>(0,0)*mt.at<double>(1,1))-(mt.at<double>(1,0)*mt.at<double>(0,1));
double imat[3][3]={{(m11/determ),(-m12/determ),(m13/determ)},{(-m21/determ),(m22/determ),(-m23/determ)},{(m31/determ),(-m32/determ),(m33/determ)}};
Mat invmat(3,3,CV_64F,imat);
return invmat.clone(); //as only the address to where the data is stored is passed to the function the object is destroyed so an empty matrix is returned with initial values -9.23842e+61
}
|