NyARToolKit has been moved to github.
バグフィクスと体感できない程度のソースコード最適化をしました。
バグ修正
1.NyARColorPatt_O3でException
640x480以上の画面サイズの場合に頻繁に発生する不具合です。
NyARColorPatt_O3を修正し、解消しました。
2.JavaSimpleLite
定数値を適応していない場所があったので、書き加えました。
最適化
マーカー認識部の配列アクセス回数を減らしました。(体感できない程度の効果しかありません。)
Index: sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/JavaSimpleLite.java
===================================================================
--- sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/JavaSimpleLite.java (revision 194)
+++ sample/jogl/jp/nyatla/nyartoolkit/jogl/sample/JavaSimpleLite.java (revision 196)
@@ -127,7 +127,7 @@
//NyARToolkitの準備
try{
//キャプチャの準備
- capture=new JmfCameraCapture(320,240,15f,JmfCameraCapture.PIXEL_FORMAT_RGB);
+ capture=new JmfCameraCapture(SCREEN_X,SCREEN_Y,15f,JmfCameraCapture.PIXEL_FORMAT_RGB);
capture.setCaptureListener(this);
//NyARToolkitの準備
ar_param=new GLNyARParam();
Index: src/jp/nyatla/nyartoolkit/core/NyARColorPatt_O3.java
===================================================================
--- src/jp/nyatla/nyartoolkit/core/NyARColorPatt_O3.java (revision 194)
+++ src/jp/nyatla/nyartoolkit/core/NyARColorPatt_O3.java (revision 196)
@@ -232,6 +232,7 @@
private int[] wk_updateExtpat_x_rgb_index;
private int[] wk_updateExtpat_y_rgb_index;
private int[] wk_updateExtpat_i_rgb_index;
+ private int wk_updateExtpat_buffer_size=0;
/**
* ワークバッファを予約する
@@ -239,27 +240,17 @@
*/
private void reservWorkBuffers(int i_xdiv2)
{
- int[] buf=this.wk_updateExtpat_rgb_buf;
- if(this.wk_updateExtpat_rgb_buf==null){
- wk_updateExtpat_para00_xw=new double[i_xdiv2];
- wk_updateExtpat_para10_xw=new double[i_xdiv2];
- wk_updateExtpat_para20_xw=new double[i_xdiv2];
- wk_updateExtpat_rgb_buf=new int[i_xdiv2*3];
- wk_updateExtpat_x_rgb_index=new int[i_xdiv2];
- wk_updateExtpat_y_rgb_index=new int[i_xdiv2];
- wk_updateExtpat_i_rgb_index=new int[i_xdiv2];
- }else{
- if(buf.length<i_xdiv2){
- wk_updateExtpat_para00_xw=new double[i_xdiv2];
- wk_updateExtpat_para10_xw=new double[i_xdiv2];
- wk_updateExtpat_para20_xw=new double[i_xdiv2];
- wk_updateExtpat_rgb_buf=new int[i_xdiv2*3];
- wk_updateExtpat_x_rgb_index=new int[i_xdiv2];
- wk_updateExtpat_y_rgb_index=new int[i_xdiv2];
- wk_updateExtpat_i_rgb_index=new int[i_xdiv2];
- }
- //十分なら何もしない。
- }
+ if(this.wk_updateExtpat_buffer_size<i_xdiv2){
+ wk_updateExtpat_para00_xw=new double[i_xdiv2];
+ wk_updateExtpat_para10_xw=new double[i_xdiv2];
+ wk_updateExtpat_para20_xw=new double[i_xdiv2];
+ wk_updateExtpat_rgb_buf=new int[i_xdiv2*3];
+ wk_updateExtpat_x_rgb_index=new int[i_xdiv2];
+ wk_updateExtpat_y_rgb_index=new int[i_xdiv2];
+ wk_updateExtpat_i_rgb_index=new int[i_xdiv2];
+ this.wk_updateExtpat_buffer_size=i_xdiv2;
+ }
+ //十分なら何もしない。
return;
}
Index: src/jp/nyatla/nyartoolkit/core/NyARDetectMarker.java
===================================================================
--- src/jp/nyatla/nyartoolkit/core/NyARDetectMarker.java (revision 194)
+++ src/jp/nyatla/nyartoolkit/core/NyARDetectMarker.java (revision 196)
@@ -81,7 +81,7 @@
* detectMarker関数から使う関数です。o_markerにlabelとclipで示される1個のマーカーを格納します。
* marker_holder[i_holder_num]にオブジェクトが無ければまず新規に作成し、もし
* 既に存在すればそこにマーカー情報を上書きして記録します。
- * Optimize:STEP[591->543]
+ * Optimize:STEP[369->336]
* @param o_marker
* @param limage
* @param label_ref
@@ -132,10 +132,16 @@
dir = 5;
int r,c;
-
+ c=xcoord[0];
+ r=ycoord[0];
+ dmax=0;
+ //本家はdmaxの作成とxcoordの作成を別のループでやってるけど、非効率なので統合
for(;;){
- r=ycoord[coord_num-1];
- c=xcoord[coord_num-1];
+ //xcoord[1]-xcoord[n]までのデータを作る。
+
+// 1個前のxcoordとycoordはループ後半で格納される。
+// c=xcoord[coord_num-1];
+// r=ycoord[coord_num-1];
//p1 = &(limage[marker_info2->y_coord[marker_info2->coord_num-1] * xsize+ marker_info2->x_coord[marker_info2->coord_num-1]]);
dir = (dir+5)%8;
for(i=0;i<8;i++) {
@@ -148,47 +154,39 @@
System.out.println("??? 2");//printf("??? 2\n");
throw new NyARException();//return(-1);
}
- xcoord[coord_num]= xcoord[coord_num-1] + xdir[dir];//marker_info2->x_coord[marker_info2->coord_num]= marker_info2->x_coord[marker_info2->coord_num-1] + xdir[dir];
- ycoord[coord_num]= ycoord[coord_num-1] + ydir[dir];//marker_info2->y_coord[marker_info2->coord_num]= marker_info2->y_coord[marker_info2->coord_num-1] + ydir[dir];
- if(xcoord[coord_num] == sx && ycoord[coord_num] == sy ){
+// xcoordとycoordをc,rにも保存
+ c= c + xdir[dir];//marker_info2->x_coord[marker_info2->coord_num]= marker_info2->x_coord[marker_info2->coord_num-1] + xdir[dir];
+ r= r + ydir[dir];//marker_info2->y_coord[marker_info2->coord_num]= marker_info2->y_coord[marker_info2->coord_num-1] + ydir[dir];
+ xcoord[coord_num]=c;//marker_info2->x_coord[marker_info2->coord_num]= marker_info2->x_coord[marker_info2->coord_num-1] + xdir[dir];
+ ycoord[coord_num]=r;//marker_info2->y_coord[marker_info2->coord_num]= marker_info2->y_coord[marker_info2->coord_num-1] + ydir[dir];
+ if(c == sx && r == sy ){
break;
}
+ //dmaxの計算
+ d=(c-sx)*(c-sx)+(r-sy)*(r-sy);
+ if( d > dmax ) {
+ dmax = d;
+ v1 = coord_num;
+ }
+ //終了条件判定
coord_num++;
- if(coord_num == xcoord.length-1){//if( marker_info2.coord_num == Config.AR_CHAIN_MAX-1 ){
+ if(coord_num == AR_CHAIN_MAX-1){//if( marker_info2.coord_num == Config.AR_CHAIN_MAX-1 ){
System.out.println("??? 3");//printf("??? 3\n");
throw new NyARException();//return(-1);
}
}
-
- dmax = 0;
- for(i=1;i<coord_num;i++) {// for(i=1;i<marker_info2->coord_num;i++) {
- d = (xcoord[i]-sx)*(xcoord[i]-sx)+ (ycoord[i]-sy)*(ycoord[i]-sy);// d = (marker_info2->x_coord[i]-sx)*(marker_info2->x_coord[i]-sx)+ (marker_info2->y_coord[i]-sy)*(marker_info2->y_coord[i]-sy);
- if( d > dmax ) {
- dmax = d;
- v1 = i;
- }
- }
+//
+// dmax = 0;
+// for(i=1;i<coord_num;i++) {// for(i=1;i<marker_info2->coord_num;i++) {
+// d = (xcoord[i]-sx)*(xcoord[i]-sx)+ (ycoord[i]-sy)*(ycoord[i]-sy);// d = (marker_info2->x_coord[i]-sx)*(marker_info2->x_coord[i]-sx)+ (marker_info2->y_coord[i]-sy)*(marker_info2->y_coord[i]-sy);
+// if( d > dmax ) {
+// dmax = d;
+// v1 = i;
+// }
+// }
//NyARMarkerへcoord情報をセット
//coordの並び替えと保存はNyARMarkerへ移動
o_marker.setCoordXY(v1,coord_num,xcoord,ycoord);
-
-// int[] wx=new int[v1];//new int[Config.AR_CHAIN_MAX];
-// int[] wy=new int[v1]; //new int[Config.AR_CHAIN_MAX];
-// for(i=0;i<v1;i++) {
-// wx[i] = marker_ref.x_coord[i];//wx[i] = marker_info2->x_coord[i];
-// wy[i] = marker_ref.y_coord[i];//wy[i] = marker_info2->y_coord[i];
-// }
-// for(i=0;i<marker_ref.coord_num-v1;i++) {//for(i=v1;i<marker_info2->coord_num;i++) {
-// marker_ref.x_coord[i] = marker_ref.x_coord[i+v1];//marker_info2->x_coord[i-v1] = marker_info2->x_coord[i];
-// marker_ref.y_coord[i] = marker_ref.y_coord[i+v1];//marker_info2->y_coord[i-v1] = marker_info2->y_coord[i];
-// }
-// for(i=0;i<v1;i++) {
-// marker_ref.x_coord[i-v1+marker_ref.coord_num] = wx[i];//marker_info2->x_coord[i-v1+marker_info2->coord_num] = wx[i];
-// marker_ref.y_coord[i-v1+marker_ref.coord_num] = wy[i];//marker_info2->y_coord[i-v1+marker_info2->coord_num] = wy[i];
-// }
-// marker_ref.x_coord[marker_ref.coord_num] = marker_ref.x_coord[0];//marker_info2->x_coord[marker_info2->coord_num] = marker_info2->x_coord[0];
-// marker_ref.y_coord[marker_ref.coord_num] = marker_ref.y_coord[0];//marker_info2->y_coord[marker_info2->coord_num] = marker_info2->y_coord[0];
-// marker_ref.coord_num++;//marker_info2->coord_num++;
return;
}
@@ -208,8 +206,9 @@
*/
public final void detectMarker(NyARLabeling i_labeling,double i_factor,NyARMarkerList o_marker_list) throws NyARException
{
+ int label_area;
int i;
- int xsize, ysize;
+ int xsize, ysize;
NyARLabel[] labels=i_labeling.getLabel();
// int[] warea =i_labeling.getArea();
int label_num =i_labeling.getLabelNum();
@@ -228,7 +227,8 @@
NyARLabel label_pt;
for(i=0; i<label_num; i++ ){
label_pt=labels[i];
- if( label_pt.area < AR_AREA_MIN || label_pt.area > AR_AREA_MAX ){
+ label_area=label_pt.area;
+ if(label_area < AR_AREA_MIN || label_area > AR_AREA_MAX ){
continue;
}
if( label_pt.clip0 == 1 || label_pt.clip1 == xsize-2 ){//if( wclip[i*4+0] == 1 || wclip[i*4+1] == xsize-2 ){
@@ -240,7 +240,7 @@
//ret = arGetContour( limage, label_ref, i+1,&(wclip[i*4]), &(marker_info2[marker_num2]));
arGetContour(current_marker,limage, label_ref, i+1,label_pt);
- if(!current_marker.checkSquare(label_pt.area,i_factor,label_pt.pos_x,label_pt.pos_y)){
+ if(!current_marker.checkSquare(label_area,i_factor,label_pt.pos_x,label_pt.pos_y)){
//後半で整理するからここはいらない。// marker_holder[marker_num2]=null;
continue;
}
Index: src/jp/nyatla/nyartoolkit/core/NyARTransRot.java
===================================================================
--- src/jp/nyatla/nyartoolkit/core/NyARTransRot.java (revision 194)
+++ src/jp/nyatla/nyartoolkit/core/NyARTransRot.java (revision 196)
@@ -1093,9 +1093,13 @@
d_pt=pos2d[2];P2D20=d_pt[0];P2D21=d_pt[1];
d_pt=pos2d[3];P2D30=d_pt[0];P2D31=d_pt[1];
final double cpara[]=cparam.get34Array();
- combo03 = cpara[0] * trans[0]+ cpara[1] * trans[1]+ cpara[2] * trans[2]+ cpara[3];
- combo13 = cpara[4] * trans[0]+ cpara[5] * trans[1]+ cpara[6] * trans[2]+ cpara[7];
- combo23 = cpara[8] * trans[0]+ cpara[9] * trans[1]+ cpara[10] * trans[2]+ cpara[11];
+ final double CP0,CP1,CP2,CP3,CP4,CP5,CP6,CP7,CP8,CP9,CP10;
+ CP0=cpara[0];CP1=cpara[1];CP2=cpara[2];CP3=cpara[3];
+ CP4=cpara[4];CP5=cpara[5];CP6=cpara[6];CP7=cpara[7];
+ CP8=cpara[8];CP9=cpara[9];CP10=cpara[10];
+ combo03 = CP0 * trans[0]+ CP1 * trans[1]+ CP2 * trans[2]+ CP3;
+ combo13 = CP4 * trans[0]+ CP5 * trans[1]+ CP6 * trans[2]+ CP7;
+ combo23 = CP8 * trans[0]+ CP9 * trans[1]+ CP10 * trans[2]+ cpara[11];
double CACA,SASA,SACA,CA,SA;
double CACACB,SACACB,SASACB,CASB,SASB;
double SACASC,SACACBSC,SACACBCC,SACACC;
@@ -1151,9 +1155,9 @@
CASB=CA*wsin;
SASB=SA*wsin;
//comboの計算1
- combo02 = cpara[0] * CASB+ cpara[1] * SASB+ cpara[2] * wcos;
- combo12 = cpara[4] * CASB+ cpara[5] * SASB+ cpara[6] * wcos;
- combo22 = cpara[8] * CASB+ cpara[9] * SASB+ cpara[10] * wcos;
+ combo02 = CP0 * CASB+ CP1 * SASB+ CP2 * wcos;
+ combo12 = CP4 * CASB+ CP5 * SASB+ CP6 * wcos;
+ combo22 = CP8 * CASB+ CP9 * SASB+ CP10 * wcos;
combo02_2 =combo02 * VX02 + combo03;
combo02_5 =combo02 * VX12 + combo03;
@@ -1179,16 +1183,16 @@
rot3 = SACACBCC-SACACC+SASACB*wsin+CACA*wsin;
rot6 = -CASB*wcos-SASB*wsin;
- combo00 = cpara[0] * rot0+ cpara[1] * rot3+ cpara[2] * rot6;
- combo10 = cpara[4] * rot0+ cpara[5] * rot3+ cpara[6] * rot6;
- combo20 = cpara[8] * rot0+ cpara[9] * rot3+ cpara[10] * rot6;
+ combo00 = CP0 * rot0+ CP1 * rot3+ CP2 * rot6;
+ combo10 = CP4 * rot0+ CP5 * rot3+ CP6 * rot6;
+ combo20 = CP8 * rot0+ CP9 * rot3+ CP10 * rot6;
rot1 = -CACACB*wsin-SASA*wsin+SACACBCC-SACACC;
rot4 = -SACACBSC+SACASC+SASACB*wcos+CACA*wcos;
rot7 = CASB*wsin-SASB*wcos;
- combo01 = cpara[0] * rot1+ cpara[1] * rot4+ cpara[2] * rot7;
- combo11 = cpara[4] * rot1+ cpara[5] * rot4+ cpara[6] * rot7;
- combo21 = cpara[8] * rot1+ cpara[9] * rot4+ cpara[10] * rot7;
+ combo01 = CP0 * rot1+ CP1 * rot4+ CP2 * rot7;
+ combo11 = CP4 * rot1+ CP5 * rot4+ CP6 * rot7;
+ combo21 = CP8 * rot1+ CP9 * rot4+ CP10 * rot7;
//
err = 0.0;
h = combo20 * VX00+ combo21 * VX01+ combo22_2;
Index: src/jp/nyatla/nyartoolkit/core/NyARMarker.java
===================================================================
--- src/jp/nyatla/nyartoolkit/core/NyARMarker.java (revision 194)
+++ src/jp/nyatla/nyartoolkit/core/NyARMarker.java (revision 196)
@@ -116,7 +116,7 @@
/**
* static int arDetectMarker2_check_square( int area, ARMarkerInfo2 *marker_info2, double factor )
* 関数の代替関数
- * OPTIMIZED STEP [450->397]
+ * OPTIMIZED STEP [450->415]
* @param i_area
* @param i_factor
* @return
@@ -128,33 +128,33 @@
final int[] l_y_coord=y_coord;
final NyARVertexCounter wv1=wk_checkSquare_wv1;
final NyARVertexCounter wv2=wk_checkSquare_wv2;
- int sx, sy;
- int dmax, d, v1;
+ int sx,sy;
+ int dmax,d,v1;
int v2;// int wvnum1,wvnum2,v2;
- double thresh;
- int i;
+ int i;
+ final int L_coord_num_m1=this.coord_num-1;
dmax = 0;
v1 = 0;
sx = l_x_coord[0];//sx = marker_info2->x_coord[0];
sy = l_y_coord[0];//sy = marker_info2->y_coord[0];
- for(i=1;i<this.coord_num-1;i++){//for(i=1;i<marker_info2->coord_num-1;i++) {
- d = (l_x_coord[i]-sx)*(l_x_coord[i]-sx)+ (l_y_coord[i]-sy)*(l_y_coord[i]-sy);
+ for(i=1;i<L_coord_num_m1;i++){//for(i=1;i<marker_info2->coord_num-1;i++) {
+ d = (l_x_coord[i]-sx)*(l_x_coord[i]-sx)+ (l_y_coord[i]-sy)*(l_y_coord[i]-sy);
if( d > dmax ) {
dmax = d;
v1 = i;
}
}
- thresh = (i_area/0.75) * 0.01 * i_factor;
+ final double thresh = (i_area/0.75) * 0.01 * i_factor;
l_vertex[0] = 0;
if(!wv1.getVertex(l_x_coord,l_y_coord, 0, v1,thresh)){ //if( get_vertex(marker_info2->x_coord, marker_info2->y_coord, 0, v1,thresh, wv1, &wvnum1) < 0 ) {
return false;
}
- if(!wv2.getVertex(l_x_coord,l_y_coord,v1, this.coord_num-1, thresh)) {//if(get_vertex(marker_info2->x_coord, marker_info2->y_coord,v1, marker_info2->coord_num-1, thresh, wv2, &wvnum2) < 0 ) {
+ if(!wv2.getVertex(l_x_coord,l_y_coord,v1,L_coord_num_m1, thresh)) {//if(get_vertex(marker_info2->x_coord, marker_info2->y_coord,v1, marker_info2->coord_num-1, thresh, wv2, &wvnum2) < 0 ) {
return false;
}
@@ -183,7 +183,7 @@
if(!wv1.getVertex(l_x_coord,l_y_coord,v1, v2, thresh)) {
return false;
}
- if(!wv2.getVertex(l_x_coord,l_y_coord,v2, this.coord_num-1, thresh)) {
+ if(!wv2.getVertex(l_x_coord,l_y_coord,v2,L_coord_num_m1, thresh)) {
return false;
}
if( wv1.number_of_vertex==1 && wv2.number_of_vertex==1 ) {
@@ -198,7 +198,7 @@
else {
return false;
}
- l_vertex[4] = this.coord_num-1;//この値使ってるの?
+ l_vertex[4] =L_coord_num_m1;//この値使ってるの?
//
area = i_area;
pos[0] = i_pos_x;
@@ -209,6 +209,7 @@
}
+
/**
* get_vertex関数を切り離すためのクラス
*