|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
[C++] Traduzione di funzione da matlab a c++
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 Codice:
%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++: Codice:
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?
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. Ultima modifica di DomusP45 : 17-12-2013 alle 17:04. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
Perchè io matlab non ce l'ho installato, io sto lavorando con visual c++...la funzione di origine era in matlab e devo riportarla in c++ perchè mi serve...
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Non so se sia importante nel tuo caso o se tu l'abbia già considerato, ma occhio che il cast a int effettua un troncamento e non un arrotondamento.
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Grazie...no, nel mio caso non mi interessa un arrotondamento, va bene pure se tronca...quello che mi interessa e che effettivamente sia quello che la funzione matlab fa ..
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Whiterun
Messaggi: 580
|
Quote:
EDIT: Posso chiedervi una cosa? Ma quando in matlab ci sta l'istruzione (come nel pezzo della funzione matlab Codice:
(prodotti e somme varie) * pn' + dx
__________________
Come la chiami la chiami, la cocozza sempre cocozza è. Ultima modifica di DomusP45 : 17-12-2013 alle 17:06. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:41.












il tuo codice matlab a meno che non glielo specifichi altrimenti assume tutti numeri floating point a doppia precisione








