DomusP45
16-12-2013, 18:18
Ciao a tutti, devo tradurre questo pezzo di funzione matlab in c++.
In pratica l'ho fatto, ma ho dei dubbi e quindi vi posto i due pezzi di codice e spero che qualcuno mi confermi la correttezza delle traduzione.
CODICE MATLAB
%Prima di questa parte c'è da fare un prodotto matrice per vettore, la %matrice è TC (indicata dopo) 4x4 ed il vettore è 4x1, che ci restituisce P.
%calcolo di pn
pn = [P(i,1)/P(i,3) P(i,2)/P(i,3)];
%distorsione radiale con il calcolo
xd=[xd(1);xd(2)]=(1+kc(1)*r^2+kc(2)*r^4+kc(5)*r^6)*pn'+dx
r^2=pn(1)^2+pn(2)^2
dx=2*kc(3)*pn(1)*pn(2)+kc(4)*r^2+2*pn(1)^2);kc(3)*r^2+2*pn(2)^2)+2*kc(4)*pn(1)*pn(2)]
%coordinate xp,yp
xp=fc(1)*(xd(1)+alpha_c*xd(2))+cc(1)
yp=fc(2)*xd(2)+cc(2)
Mia parte di codice in C++:
double TC[4][4] = {
{1.0, 0.0, 0.0, 0.15},
{0.0, -1.0, 0.0, 0.15},
{0.0, 0.0, -1.0, 0.45},
{0.0, 0.0, 0.0, 1.0} };
//punto in coordinate spazio
double P1[4] = {P.x,P.y,P.z,1};
//punto in coordinate camera
double Pc[4] = {0,0,0,0};
//calcolo del punto Pc
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
Pc[i] = Pc[i]+TC[i][j]*P1[j];
}
}
//normalizzazione
double PN[2] = {Pc[0]/Pc[2], Pc[1]/Pc[2]};
//calcolo delle componenti
double r2 = pow(PN[0],2) + pow(PN[1],2);
//distorsione tangenziale
double dx[2]={2*KC[2]*PN[0]*PN[1]+KC[3]*r2+(2*pow(PN[0],2)),KC[2]*r2+(2*pow(PN[1],2))+2*KC[3]*PN[0]*PN[1]};
//componenti sul piano
double xd[2]={(1+KC[0]*r2+KC[1]*pow(r2,2)+KC[4]*pow(r2,3))*(PN[0]+dx[0]),(1+KC[0]*r2+KC[1]*pow(r2,2)+KC[4]*pow(r2,3))*(PN[1]+dx[1])};
//calcolo delle coordinate in pixel
int xp = (int)(fc[0]*(xd[0]+alpha*xd[1])+cc[0]);
int yp = (int)(fc[1]*xd[1]+cc[1]);
Al di là di quello che fa la funzione in se, orientativamente guardando solo alle operazioni i prodotti e quant'altro, l'ho tradotta bene?
In pratica l'ho fatto, ma ho dei dubbi e quindi vi posto i due pezzi di codice e spero che qualcuno mi confermi la correttezza delle traduzione.
CODICE MATLAB
%Prima di questa parte c'è da fare un prodotto matrice per vettore, la %matrice è TC (indicata dopo) 4x4 ed il vettore è 4x1, che ci restituisce P.
%calcolo di pn
pn = [P(i,1)/P(i,3) P(i,2)/P(i,3)];
%distorsione radiale con il calcolo
xd=[xd(1);xd(2)]=(1+kc(1)*r^2+kc(2)*r^4+kc(5)*r^6)*pn'+dx
r^2=pn(1)^2+pn(2)^2
dx=2*kc(3)*pn(1)*pn(2)+kc(4)*r^2+2*pn(1)^2);kc(3)*r^2+2*pn(2)^2)+2*kc(4)*pn(1)*pn(2)]
%coordinate xp,yp
xp=fc(1)*(xd(1)+alpha_c*xd(2))+cc(1)
yp=fc(2)*xd(2)+cc(2)
Mia parte di codice in C++:
double TC[4][4] = {
{1.0, 0.0, 0.0, 0.15},
{0.0, -1.0, 0.0, 0.15},
{0.0, 0.0, -1.0, 0.45},
{0.0, 0.0, 0.0, 1.0} };
//punto in coordinate spazio
double P1[4] = {P.x,P.y,P.z,1};
//punto in coordinate camera
double Pc[4] = {0,0,0,0};
//calcolo del punto Pc
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
Pc[i] = Pc[i]+TC[i][j]*P1[j];
}
}
//normalizzazione
double PN[2] = {Pc[0]/Pc[2], Pc[1]/Pc[2]};
//calcolo delle componenti
double r2 = pow(PN[0],2) + pow(PN[1],2);
//distorsione tangenziale
double dx[2]={2*KC[2]*PN[0]*PN[1]+KC[3]*r2+(2*pow(PN[0],2)),KC[2]*r2+(2*pow(PN[1],2))+2*KC[3]*PN[0]*PN[1]};
//componenti sul piano
double xd[2]={(1+KC[0]*r2+KC[1]*pow(r2,2)+KC[4]*pow(r2,3))*(PN[0]+dx[0]),(1+KC[0]*r2+KC[1]*pow(r2,2)+KC[4]*pow(r2,3))*(PN[1]+dx[1])};
//calcolo delle coordinate in pixel
int xp = (int)(fc[0]*(xd[0]+alpha*xd[1])+cc[0]);
int yp = (int)(fc[1]*xd[1]+cc[1]);
Al di là di quello che fa la funzione in se, orientativamente guardando solo alle operazioni i prodotti e quant'altro, l'ho tradotta bene?