とりあえずOpenGL、Directshowを切り離した、マーカー認識関数群(libARのところ)だけをJava化することにした。
やってみてわかったこと。
ポインタが超強敵。
当たり前だけどJavaではポインタがそのまま使えないから、一行づつ安全を確認しながら書き直すことになりそうな。
ちなみに、変換するとこんな感じ。
びふぉあ
static int EV_create( ARMat *input, ARMat *u, ARMat *output, ARVec *ev ) { double *m, *m1, *m2; double sum, work; int row, clm; int i, j, k; row = input->row; clm = input->clm; if( row <= 0 || clm <= 0 ) return(-1); if( u->row != row || u->clm != row ) return(-1); if( output->row != row || output->clm != clm ) return(-1); if( ev->clm != row ) return(-1); m = output->m; for( i = 0; i < row; i++ ) { if( ev->v[i] < VZERO ) break; work = 1 / sqrt(fabs(ev->v[i])); for( j = 0; j < clm; j++ ) { sum = 0.0; m1 = &(u->m[i*row]); m2 = &(input->m[j]); for( k = 0; k < row; k++ ) { sum += *m1 * *m2; m1++; m2 += clm; } *(m++) = sum * work; } } for( ; i < row; i++ ) { ev->v[i] = 0.0; for( j = 0; j < clm; j++ ) *(m++) = 0.0; } return(0); }
あふたー
private int arMatrixPCA_EV_create(ARMat input, ARMat u, ARMat output, ARVec ev) { DoublePointer m, m1, m2; double sum, work; int row, clm; row = input.getRow();//row = input->row; clm = input.getClm();//clm = input->clm; if( row <= 0 || clm <= 0 ){ return(-1); } if( u.getRow() != row || u.getClm() != row ){//if( u->row != row || u->clm != row ){ return(-1); } if( output.getRow() != row || output.getClm() != clm ){//if( output->row != row || output->clm != clm ){ return(-1); } if( ev.getClm()!= row ){//if( ev->clm != row ){ return(-1); } m=output.getPointer();//m = output->m; int i; for(i = 0; i < row; i++ ) { if( ev.get(i)<arMatrixPCA_VZERO ){//if( ev->v[i] < VZERO ){ break; } work = 1 / Math.sqrt(Math.abs(ev.get(i)));//work = 1 / sqrt(fabs(ev->v[i])); for(int j = 0; j < clm; j++ ) { sum = 0.0; m1=u.getPointer(i*row);//m1 = &(u->m[i*row]); m2=input.getPointer(j);//m2 = &(input->m[j]); for(int k = 0; k < row; k++ ) { sum+=m1.get()+m2.get();//sum += *m1 * *m2; m1.incPtr(); //m1++; m2.addPtr(clm);//m2 += clm; } {//*(m++) = sum * work; m.set(sum * work); m.incPtr();} } } for( ; i < row; i++ ) { ev.set(i, 0.0);//ev->v[i] = 0.0; for(int j = 0; j < clm; j++ ){ m.set(0.0);//*(m++) = 0.0; m.incPtr(); } } return(0); }