import java.awt.image.WritableRaster;\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.nyartoolkit.core.raster.NyARRaster;\r
+import jp.nyatla.nyartoolkit.core.raster.INyARRaster;\r
\r
\r
-public class QtNyARRaster_RGB implements NyARRaster\r
+public class QtNyARRaster_RGB implements INyARRaster\r
{\r
protected byte[] ref_buf;\r
protected int width=0;\r
import javax.media.format.RGBFormat;\r
import java.awt.Dimension;\r
import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.nyartoolkit.core.raster.NyARRaster;\r
+import jp.nyatla.nyartoolkit.core.raster.INyARRaster;\r
\r
\r
-public class JmfNyARRaster_RGB implements NyARRaster\r
+public class JmfNyARRaster_RGB implements INyARRaster\r
{\r
public final static int PIXEL_ORDER_RGB=1;\r
public final static int PIXEL_ORDER_BGR=2;\r
import java.awt.image.WritableRaster;\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.nyartoolkit.core.raster.NyARRaster;\r
+import jp.nyatla.nyartoolkit.core.raster.INyARRaster;\r
\r
\r
-public class QtNyARRaster_RGB implements NyARRaster\r
+public class QtNyARRaster_RGB implements INyARRaster\r
{\r
protected byte[] ref_buf;\r
protected int width=0;\r
*/\r
public int[][][] getPatArray();\r
/**\r
- * ラスタイメージからi_marker部分のカラーパターンを抽出して、保持します。\r
+ * ラスタイメージからi_square部分のカラーパターンを抽出して、保持します。\r
* @param image\r
- * @param i_marker\r
+ * @param i_square\r
* @return\r
* ラスターの取得に成功するとTRUE/失敗するとFALSE\r
* @throws NyARException\r
*/\r
- public boolean pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException;\r
+ public boolean pickFromRaster(INyARRaster image, NyARSquare i_square) throws NyARException;\r
}
\ No newline at end of file
package jp.nyatla.nyartoolkit.core;\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.nyartoolkit.core.raster.NyARRaster;\r
+import jp.nyatla.nyartoolkit.core.raster.INyARRaster;\r
\r
/**\r
* 24ビットカラーのマーカーを保持するために使うクラスです。\r
* 切り出しに失敗した\r
* @throws Exception\r
*/\r
- public boolean pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException\r
+ public boolean pickFromRaster(INyARRaster image, NyARSquare i_square) throws NyARException\r
{\r
double d, xw, yw;\r
int xc, yc;\r
double ydiv2_reciprocal; // [tp]\r
\r
\r
- int[] x_coord=i_marker.x_coord;\r
- int[] y_coord=i_marker.y_coord;\r
- double[][] local=wk_pickFromRaster_local;//double local[4][2]; \r
- int[] vertex=i_marker.mkvertex;\r
+// int[] x_coord=i_marker.x_coord;\r
+// int[] y_coord=i_marker.y_coord;\r
+// int[] vertex=i_marker.mkvertex;\r
+ double[][] local=wk_pickFromRaster_local;//double local[4][2];\r
+ //\r
for(int i = 0; i < 4; i++ ) {\r
- local[i][0] = x_coord[vertex[i]];\r
- local[i][1] = y_coord[vertex[i]];\r
+ local[i][0] = i_square.imvertex[i][0];\r
+ local[i][1] = i_square.imvertex[i][1];\r
}\r
+\r
double[][] world=wk_pickFromRaster_world;\r
/* world[0][0] = 100.0;\r
world[0][1] = 100.0;\r
package jp.nyatla.nyartoolkit.core;\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.nyartoolkit.core.raster.NyARRaster;\r
+import jp.nyatla.nyartoolkit.core.raster.INyARRaster;\r
\r
/**\r
* 24ビットカラーのマーカーを保持するために使うクラスです。\r
* @param i_marker\r
* @throws Exception\r
*/\r
- public boolean pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException\r
+ public boolean pickFromRaster(INyARRaster image, NyARSquare i_square) throws NyARException\r
{\r
NyARMat cpara=this.wk_pickFromRaster_cpara;\r
- //localの計算\r
- int[] x_coord=i_marker.x_coord;\r
- int[] y_coord=i_marker.y_coord;\r
- int[] vertex=i_marker.mkvertex;\r
+ //localの計算 \r
+// int[] x_coord=i_marker.x_coord;\r
+// int[] y_coord=i_marker.y_coord;\r
+// int[] vertex=i_marker.mkvertex;\r
double[] local_0=wk_pickFromRaster_local[0];//double local[4][2]; \r
double[] local_1=wk_pickFromRaster_local[1];//double local[4][2]; \r
+ //\r
for(int i = 0; i < 4; i++ ) {\r
- local_0[i] = x_coord[vertex[i]];\r
- local_1[i] = y_coord[vertex[i]];\r
- }\r
+ local_0[i] = i_square.imvertex[i][0];\r
+ local_1[i] = i_square.imvertex[i][1];\r
+ } \r
+ \r
//xdiv2,ydiv2の計算\r
int xdiv2, ydiv2;\r
int l1,l2;\r
\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.nyartoolkit.core.raster.NyARRaster;\r
+import jp.nyatla.nyartoolkit.core.raster.INyARRaster;\r
\r
/**\r
* 24ビットカラーのマーカーを保持するために使うクラスです。\r
* @param i_marker\r
* @throws Exception\r
*/\r
- public boolean pickFromRaster(NyARRaster image, NyARMarker i_marker) throws NyARException\r
+ public boolean pickFromRaster(INyARRaster image, NyARSquare i_square) throws NyARException\r
{\r
NyARMat cpara=this.wk_pickFromRaster_cpara;\r
//localの計算\r
- int[] x_coord=i_marker.x_coord;\r
- int[] y_coord=i_marker.y_coord;\r
- int[] vertex=i_marker.mkvertex;\r
double[] local_0=wk_pickFromRaster_local[0];//double local[4][2]; \r
double[] local_1=wk_pickFromRaster_local[1];//double local[4][2]; \r
+ //\r
for(int i = 0; i < 4; i++ ) {\r
- local_0[i] = x_coord[vertex[i]];\r
- local_1[i] = y_coord[vertex[i]];\r
+ local_0[i] = i_square.imvertex[i][0];\r
+ local_1[i] = i_square.imvertex[i][1];\r
}\r
//xdiv2,ydiv2の計算\r
int xdiv2, ydiv2;\r
return;\r
}\r
\r
- private void updateExtpat(NyARRaster image,NyARMat i_cpara,int i_xdiv2,int i_ydiv2) throws NyARException\r
+ private void updateExtpat(INyARRaster image,NyARMat i_cpara,int i_xdiv2,int i_ydiv2) throws NyARException\r
{\r
int img_x=image.getWidth();\r
int img_y=image.getHeight();\r
\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
-\r
+import jp.nyatla.nyartoolkit.core.labeling.*;\r
\r
\r
\r
* @param clip\r
* @throws NyARException\r
*/\r
- private final void arGetContour(NyARMarker o_marker,int[][] limage, int[] label_ref,int i_labelnum, NyARLabel i_label) throws NyARException\r
+ private final void arGetContour(NyARMarker o_marker,int[][] limage,int i_labelnum, NyARLabel i_label) throws NyARException\r
{\r
final int[] xcoord=wk_arGetContour_xcoord;\r
final int[] ycoord=wk_arGetContour_ycoord;\r
int i, j,w;\r
\r
int[] limage_j;\r
- j = i_label.clip2;\r
+ j = i_label.clip_t;\r
limage_j=limage[j];\r
- final int clip1=i_label.clip1;\r
+ final int clip1=i_label.clip_r;\r
//p1=ShortPointer.wrap(limage,j*xsize+clip.get());//p1 = &(limage[j*xsize+clip[0]]);\r
- for( i = i_label.clip0; i <= clip1; i++){//for( i = clip[0]; i <= clip[1]; i++, p1++ ) {\r
+ for( i = i_label.clip_l; i <= clip1; i++){//for( i = clip[0]; i <= clip[1]; i++, p1++ ) {\r
w=limage_j[i];\r
- if(w > 0 && label_ref[w-1] == i_labelnum ) {//if( *p1 > 0 && label_ref[(*p1)-1] == label ) {\r
+ if(w > 0 && w == i_labelnum ) {\r
sx = i;\r
sy = j;\r
break;\r
* 抽出したマーカーを格納するリスト\r
* @throws NyARException\r
*/\r
- public final void detectMarker(NyARLabeling i_labeling,double i_factor,NyARMarkerList o_marker_list) throws NyARException\r
+ public final void detectMarker(NyLabelingImage i_labeling,double i_factor,NyARMarkerList o_marker_list) throws NyARException\r
{\r
int label_area;\r
int i;\r
int xsize, ysize;\r
- NyARLabel[] labels=i_labeling.getLabel();\r
+ NyARLabel[] labels=i_labeling.getLabelList().getArray();\r
// int[] warea =i_labeling.getArea();\r
- int label_num =i_labeling.getLabelNum();\r
+ int label_num =i_labeling.getLabelList().getCount();\r
// int[][] wclip =i_labeling.getClip();\r
// double[] wpos =i_labeling.getPos();\r
- int[][] limage=i_labeling.getLabelImg();\r
- int[] label_ref =i_labeling.getLabelRef();\r
+ int[][] limage=i_labeling.getImage();\r
\r
//マーカーホルダをリセット\r
o_marker_list.reset();\r
if(label_area < AR_AREA_MIN || label_area > AR_AREA_MAX ){\r
continue;\r
}\r
- if( label_pt.clip0 == 1 || label_pt.clip1 == xsize-2 ){//if( wclip[i*4+0] == 1 || wclip[i*4+1] == xsize-2 ){\r
+ if( label_pt.clip_l == 1 || label_pt.clip_r == xsize-2 ){//if( wclip[i*4+0] == 1 || wclip[i*4+1] == xsize-2 ){\r
continue;\r
}\r
- if( label_pt.clip2 == 1 || label_pt.clip3 == ysize-2 ){//if( wclip[i*4+2] == 1 || wclip[i*4+3] == ysize-2 ){\r
+ if( label_pt.clip_t == 1 || label_pt.clip_b == ysize-2 ){//if( wclip[i*4+2] == 1 || wclip[i*4+3] == ysize-2 ){\r
continue;\r
}\r
//ret = arGetContour( limage, label_ref, i+1,&(wclip[i*4]), &(marker_info2[marker_num2]));\r
- arGetContour(current_marker,limage, label_ref, i+1,label_pt);\r
+ arGetContour(current_marker,limage, i+1,label_pt);\r
\r
if(!current_marker.checkSquare(label_area,i_factor,label_pt.pos_x,label_pt.pos_y)){\r
//後半で整理するからここはいらない。// marker_holder[marker_num2]=null;\r
*/\r
package jp.nyatla.nyartoolkit.core;\r
\r
-import jp.nyatla.nyartoolkit.NyARException;\r
+import jp.nyatla.nyartoolkit.*;\r
import jp.nyatla.nyartoolkit.core.raster.*;\r
-\r
+import jp.nyatla.nyartoolkit.core.labeling.*;\r
\r
\r
public class NyARDetectSquare\r
{\r
- private final NyARLabeling labeling;\r
- private final NyARDetectMarker detect;\r
- private NyARParam param;\r
-\r
+ private final NyARLabeling_O2 _labeling;\r
+ private final NyARDetectMarker _detecter;\r
+ private final NyLabelingImage _limage;\r
+ private final NyARParam _param;\r
+ private final NyARMarkerList _marker_list;\r
+ \r
/**\r
* マーカー抽出インスタンスを作ります。\r
* @param i_param\r
+ * @param i_max_marker\r
+ * 認識するマーカーの最大個数を指定します。\r
+ * @throws NyARException\r
*/\r
- public NyARDetectSquare(NyARParam i_param)\r
+ public NyARDetectSquare(NyARParam i_param,int i_max_marker) throws NyARException\r
{\r
- param=i_param;\r
+ this._param=i_param;\r
//解析オブジェクトを作る\r
int width=i_param.getX();\r
int height=i_param.getY();\r
+ \r
\r
- labeling=new NyARLabeling_O2(width,height);\r
- detect=new NyARDetectMarker(width,height);\r
+ this._detecter=new NyARDetectMarker(width,height);\r
+ this._labeling=new NyARLabeling_O2();\r
+ this._limage=new NyLabelingImage(width,height);\r
+ this._marker_list=new NyARMarkerList(i_max_marker);\r
+ \r
+ this._labeling.attachDestination(this._limage);\r
}\r
/**\r
* ラスタイメージから矩形を検出して、結果o_square_holderへ格納します。\r
* @param i_square_holder\r
* @throws NyARException\r
*/\r
- public void detectSquare(NyARRaster i_image,int i_thresh,NyARSquareList o_square_holder) throws NyARException\r
+ public void detectSquare(INyARRaster i_image,int i_thresh,NyARSquareList o_square_list) throws NyARException\r
{\r
-// number_of_square=0;\r
- \r
- labeling.labeling(i_image, i_thresh);\r
- if(labeling.getLabelNum()<1){\r
+ this._labeling.setThresh(i_thresh);\r
+ this._labeling.labeling(i_image);\r
+ //ラベル数が0ならマーカー検出をしない。 \r
+ if(this._limage.getLabelList().getCount()<1){\r
return;\r
}\r
//ここでマーカー配列を作成する。\r
- detect.detectMarker(labeling,1.0,o_square_holder);\r
+ this._detecter.detectMarker(this._limage,1.0,this._marker_list);\r
\r
//マーカー情報をフィルタして、スクエア配列を更新する。\r
- o_square_holder.updateSquareArray(param);\r
-\r
-// NyARSquare square;\r
-// int j=0;\r
-// for (int i = 0; i <number_of_marker; i++){\r
-// double[][] line =new double[4][3];\r
-// double[][] vertex =new double[4][2];\r
-// //NyARMarker marker=detect.getMarker(i);\r
-// square=square_holder.getSquare(i);\r
-// //・・・線の検出??\r
-// if (!square.getLine(param))\r
-// {\r
-// continue;\r
-// }\r
-// ここで計算するのは良くないと思うんだ \r
-// marker_infoL[j].id = id.get();\r
-// marker_infoL[j].dir = dir.get();\r
-// marker_infoL[j].cf = cf.get(); \r
-// j++;\r
-// //配列数こえたらドゴォォォンしないようにループを抜ける\r
-// if(j>=marker_info.length){\r
-// break;\r
-// }\r
-// }\r
-// number_of_square=j;\r
+ o_square_list.pickupSquare(this._param, this._marker_list);\r
}\r
}\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.nyartoolkit.core.labeling.*;\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+\r
\r
\r
-interface NyARLabeling{\r
- /**\r
- * 検出したラベルの数を返す\r
- * @return\r
- */\r
- public int getLabelNum();\r
- /**\r
- * \r
- * @return\r
- * @throws NyARException\r
- */\r
- public int[] getLabelRef() throws NyARException;\r
- /**\r
- * 検出したラベル配列\r
- * @return\r
- * @throws NyARException\r
- */\r
- public NyARLabel[] getLabel() throws NyARException;\r
- /**\r
- * ラベリング済みイメージを返す\r
- * @return\r
- * @throws NyARException\r
- */\r
- public int[][] getLabelImg() throws NyARException;\r
- /**\r
- * static ARInt16 *labeling2( ARUint8 *image, int thresh,int *label_num, int **area, double **pos, int **clip,int **label_ref, int LorR )\r
- * 関数の代替品\r
- * ラスタimageをラベリングして、結果を保存します。\r
- * Optimize:STEP[1514->1493]\r
- * @param image\r
- * @param thresh\r
- * @throws NyARException\r
- */\r
- public void labeling(NyARRaster image,int thresh) throws NyARException;\r
-}\r
\r
\r
\r
}\r
}\r
\r
-class NyARLabel\r
-{\r
- public int area;\r
- public int clip0;\r
- public int clip1;\r
- public int clip2;\r
- public int clip3;\r
- public double pos_x;\r
- public double pos_y;\r
-}\r
-\r
-\r
-class NyARLabelHolder\r
-{\r
- private final static int ARRAY_APPEND_STEP=128;\r
- public final NyARLabel[] labels;\r
- private int allocate_size;\r
- /**\r
- * 最大i_holder_size個の動的割り当てバッファを準備する。\r
- * @param i_holder_size\r
- */\r
- public NyARLabelHolder(int i_holder_size)\r
- {\r
- //ポインタだけははじめに確保しておく\r
- this.labels=new NyARLabel[i_holder_size];\r
- this.allocate_size=0;\r
- }\r
- /**\r
- * i_indexで指定した番号までのバッファを準備する。\r
- * @param i_index\r
- */\r
- private final void reserv(int i_index) throws NyARException\r
- {\r
- //アロケート済みなら即リターン\r
- if(this.allocate_size>i_index){\r
- return;\r
- }\r
- //要求されたインデクスは範囲外\r
- if(i_index>=this.labels.length){\r
- throw new NyARException();\r
- } \r
- //追加アロケート範囲を計算\r
- int range=i_index+ARRAY_APPEND_STEP;\r
- if(range>=this.labels.length){\r
- range=this.labels.length;\r
- }\r
- //アロケート\r
- for(int i=this.allocate_size;i<range;i++)\r
- {\r
- this.labels[i]=new NyARLabel();\r
- }\r
- this.allocate_size=range;\r
- }\r
- /**\r
- * i_reserv_sizeまでのバッファを、初期条件i_lxsizeとi_lysizeで初期化する。\r
- * @param i_reserv_size\r
- * @param i_lxsize\r
- * @param i_lysize\r
- * @throws NyARException\r
- */\r
- public final void init(int i_reserv_size,int i_lxsize,int i_lysize) throws NyARException\r
- {\r
- reserv(i_reserv_size);\r
- NyARLabel l;\r
- for(int i=0;i<i_reserv_size;i++){\r
- l=this.labels[i];\r
- l.area=0;\r
- l.pos_x=0;\r
- l.pos_y=0;\r
- l.clip0= i_lxsize;//wclip[i*4+0] = lxsize;\r
- l.clip1= 0;//wclip[i*4+0] = lxsize;\r
- l.clip2= i_lysize;//wclip[i*4+2] = lysize;\r
- l.clip3= 0;//wclip[i*4+3] = 0;\r
- } \r
- }\r
-}\r
-\r
\r
/**\r
* ラベリングクラス。NyARRasterをラベリングして、結果値を保持します。\r
* 構造を維持して最適化をしたバージョン\r
*\r
*/\r
-class NyARLabeling_O2 implements NyARLabeling\r
+class NyARLabeling_O2 implements INyLabeling\r
{\r
private static final int WORK_SIZE=1024*32;//#define WORK_SIZE 1024*32\r
- private final int[][] glabel_img;//static ARInt16 l_imageL[HARDCODED_BUFFER_WIDTH*HARDCODED_BUFFER_HEIGHT];\r
-\r
private final NyARWorkHolder work_holder=new NyARWorkHolder(WORK_SIZE);\r
- private final NyARLabelHolder label_holder=new NyARLabelHolder(WORK_SIZE);\r
-\r
- private int label_num;\r
- //\r
- private final int width;\r
- private final int height;\r
- /**\r
- * @param i_width\r
- * ラベリング画像の幅。解析するラスタの幅より大きいこと。\r
- * @param i_height\r
- * ラベリング画像の高さ。解析するラスタの高さより大きいこと。\r
- */\r
- public NyARLabeling_O2(int i_width,int i_height)\r
+ private int _thresh;\r
+ private TNyIntSize _dest_size;\r
+ private NyLabelingImage _out_image;\r
+ public NyARLabeling_O2()\r
{\r
- width =i_width;\r
- height=i_height;\r
- glabel_img=new int[height][width];\r
- this.wk_reservLineBuffer_buf=new int[width];\r
- label_num=0;\r
-\r
-\r
- //ワークイメージに枠を書く\r
- int[][] label_img=this.glabel_img;\r
- for(int i = 0; i < i_width; i++){\r
- label_img[0][i]=0;\r
- label_img[i_height-1][i]=0;\r
- }\r
- //</Optimize>\r
- for(int i = 0; i < i_height; i++) {\r
- label_img[i][0]=0;\r
- label_img[i][i_width-1]=0; \r
- }\r
- \r
- \r
- \r
- \r
+ this._thresh=110;\r
}\r
- /**\r
- * 検出したラベルの数を返す\r
- * @return\r
- */\r
- public int getLabelNum()\r
+ public void setThresh(int i_thresh)\r
{\r
- return label_num;\r
+ this._thresh=i_thresh; \r
}\r
- /**\r
- * 検出したエリア配列?\r
- * @return\r
- * @throws NyARException\r
- */\r
- public NyARLabel[] getLabel() throws NyARException\r
+ //コンストラクタで作ること\r
+ private int[] wk_reservLineBuffer_buf;\r
+ public void attachDestination(NyLabelingImage i_destination_image) throws NyARException\r
{\r
- if(label_num<1){\r
- throw new NyARException();\r
+ //サイズチェック\r
+ TNyIntSize size=i_destination_image.getSize();\r
+ this._out_image=i_destination_image;\r
+ \r
+ //ラインバッファの準備\r
+ if(this.wk_reservLineBuffer_buf==null){\r
+ this.wk_reservLineBuffer_buf=new int[size.w];\r
+ }else if(this.wk_reservLineBuffer_buf.length<size.w){\r
+ this.wk_reservLineBuffer_buf=new int[size.w]; \r
}\r
- return this.label_holder.labels;\r
- } \r
- /**\r
- * \r
- * @return\r
- * @throws NyARException\r
- */\r
- public int[] getLabelRef() throws NyARException\r
- {\r
- if(label_num<1){\r
- throw new NyARException();\r
+ \r
+ //NyLabelingImageのイメージ初期化(枠書き)\r
+ int[][] img=i_destination_image.getImage();\r
+ for(int i = 0; i < size.w; i++){\r
+ img[0][i] =0;\r
+ img[size.h-1][i]=0;\r
}\r
- return work_holder.work;\r
- }\r
- /**\r
- * ラベリング済みイメージを返す\r
- * @return\r
- * @throws NyARException\r
- */\r
- public int[][] getLabelImg() throws NyARException\r
- {\r
- return glabel_img;\r
+ for(int i = 0; i < size.h; i++) {\r
+ img[i][0] =0;\r
+ img[i][size.w-1]=0; \r
+ }\r
+ \r
+ //サイズ(参照値)を保存\r
+ this._dest_size=size; \r
}\r
- //コンストラクタで作ること\r
- private int[] wk_reservLineBuffer_buf=null;\r
+\r
\r
/**\r
* static ARInt16 *labeling2( ARUint8 *image, int thresh,int *label_num, int **area, double **pos, int **clip,int **label_ref, int LorR )\r
* 関数の代替品\r
* ラスタimageをラベリングして、結果を保存します。\r
* Optimize:STEP[1514->1493]\r
- * @param image\r
+ * @param i_image\r
* @param thresh\r
* @throws NyARException\r
*/\r
- public void labeling(NyARRaster image,int thresh) throws NyARException\r
+ public void labeling(INyARRaster i_input_raster) throws NyARException\r
{\r
int wk_max; /* work */\r
int m,n; /* work */\r
- int lxsize, lysize;\r
- int thresht3 = thresh * 3;\r
+ int thresht3 = this._thresh * 3;\r
int i,j,k;\r
- lxsize=image.getWidth();//lxsize = arUtil_c.arImXsize;\r
- lysize=image.getHeight();//lysize = arUtil_c.arImYsize;\r
- //画素数の一致チェック\r
- if(lxsize!=this.width || lysize!=this.height){\r
- throw new NyARException();\r
- } \r
- //ラベル数を0に初期化\r
- this.label_num=0;\r
-\r
-\r
-\r
- int[][] label_img=this.glabel_img;\r
+ NyLabelingImage out_image=this._out_image; \r
+ \r
+ //サイズチェック\r
+ TNyIntSize in_size=i_input_raster.getSize();\r
+ this._dest_size.isEqualSize(in_size);\r
+ \r
+ int lxsize=in_size.w;//lxsize = arUtil_c.arImXsize;\r
+ int lysize=in_size.h;//lysize = arUtil_c.arImYsize;\r
+ int[][] label_img=out_image.getImage();\r
\r
\r
//枠作成はインスタンスを作った直後にやってしまう。\r
for(j = 1; j < lysize - 1; j++) {//for (int j = 1; j < lysize - 1; j++, pnt += poff*2, pnt2 += 2) {\r
label_img_pt0=label_img[j];\r
label_img_pt1=label_img[j-1];\r
- image.getPixelTotalRowLine(j,line_bufferr);\r
+ i_input_raster.getPixelTotalRowLine(j,line_bufferr);\r
\r
for(i = 1; i < lxsize-1; i++) {//for(int i = 1; i < lxsize-1; i++, pnt+=poff, pnt2++) {\r
- //RGBã\81®å\90\88è¨\88å\80¤ã\81\8cé\96¾å\80¤ã\82\88ã\82\8a大ã\81\8dいかな?\r
+ //RGBã\81®å\90\88è¨\88å\80¤ã\81\8cé\96¾å\80¤ã\82\88ã\82\8aå°\8fã\81\95いかな?\r
if(line_bufferr[i]<=thresht3){\r
//pnt1 = ShortPointer.wrap(pnt2, -lxsize);//pnt1 = &(pnt2[-lxsize]);\r
if(label_img_pt1[i]>0){//if( *pnt1 > 0 ) {\r
}else {\r
label_img_pt0[i]=0;//*pnt2 = 0;\r
}\r
- \r
}\r
}\r
- j = 1;\r
+ //グループ化とラベル数の計算\r
+ int wlabel_num=1;//*label_num = *wlabel_num = j - 1;\r
+ \r
for(i = 0; i < wk_max; i++){//for(int i = 1; i <= wk_max; i++, wk++) {\r
- work[i]=(work[i]==i+1)? j++: work[work[i]-1];//*wk = (*wk==i)? j++: work[(*wk)-1];\r
+ work[i]=(work[i]==i+1)? wlabel_num++: work[work[i]-1];//*wk = (*wk==i)? j++: work[(*wk)-1];\r
}\r
-\r
- int wlabel_num=j - 1;//*label_num = *wlabel_num = j - 1;\r
-\r
+ wlabel_num-=1;//*label_num = *wlabel_num = j - 1;\r
if(wlabel_num==0){//if( *label_num == 0 ) {\r
//発見数0\r
+ out_image.getLabelList().setLength(0);\r
return;\r
}\r
-\r
\r
+ //ラベル衝突の解消\r
+ int[] line;\r
+ int i2,l1;\r
+ l1=lxsize & 0xfffffffc;\r
+ for(i=lysize-1;i>=0;i--)\r
+ {\r
+ line=label_img[i];\r
+ int pix; \r
+ for(i2=0;i2<l1;)\r
+ {\r
+ pix=line[i2];\r
+ if(pix!=0){\r
+ line[i2]=work[pix-1];\r
+ }\r
+ i2++;\r
+ \r
+ pix=line[i2];\r
+ if(pix!=0){\r
+ line[i2]=work[pix-1];\r
+ }\r
+ i2++;\r
+\r
+ pix=line[i2];\r
+ if(pix!=0){\r
+ line[i2]=work[pix-1];\r
+ }\r
+ i2++;\r
+\r
+ pix=line[i2];\r
+ if(pix!=0){\r
+ line[i2]=work[pix-1];\r
+ }\r
+ i2++;\r
+ }\r
+ for(;i2<lxsize;i2++){\r
+ pix=line[i2];\r
+ if(pix==0){\r
+ continue;\r
+ }\r
+ line[i2]=work[pix-1];\r
+ i2++;\r
+ }\r
+ }\r
+\r
\r
- //ラベルバッファを予約&初期化\r
- this.label_holder.init(wlabel_num, lxsize, lysize);\r
-// \r
-// putZero(warea,wlabel_num);//put_zero( (ARUint8 *)warea, *label_num * sizeof(int) );\r
-// for(i=0;i<wlabel_num;i++){\r
-// wpos[i*2+0]=0;\r
-// wpos[i*2+1]=0;\r
-// }\r
-// for(i = 0; i < wlabel_num; i++) {//for(i = 0; i < *label_num; i++) {\r
-// wclip[i][0] = lxsize;//wclip[i*4+0] = lxsize;\r
-// wclip[i][1] = 0;//wclip[i*4+1] = 0;\r
-// wclip[i][2] = lysize;//wclip[i*4+2] = lysize;\r
-// wclip[i][3] = 0;//wclip[i*4+3] = 0;\r
-// }\r
+ //ラベル情報の保存等\r
+ NyARLabelList label_list=out_image.getLabelList();\r
+\r
+ //ラベルバッファを予約\r
+ label_list.reserv(wlabel_num);\r
+\r
+ //エリアと重心、クリップ領域を計算\r
NyARLabel label_pt;\r
- NyARLabel[] labels=this.label_holder.labels;\r
+ NyARLabel[] labels=label_list.getArray();\r
+ for(i=0;i<wlabel_num;i++)\r
+ {\r
+ label_pt=labels[i];\r
+ label_pt.area=0;\r
+ label_pt.pos_x=0;\r
+ label_pt.pos_y=0;\r
+ label_pt.clip_l= lxsize;//wclip[i*4+0] = lxsize;\r
+ label_pt.clip_r= 0;//wclip[i*4+0] = lxsize;\r
+ label_pt.clip_t= lysize;//wclip[i*4+2] = lysize;\r
+ label_pt.clip_b= 0;//wclip[i*4+3] = 0; \r
+ }\r
+\r
\r
for(i = 0; i < wk_max; i++){\r
label_pt=labels[work[i] - 1];\r
label_pt.area += work2_pt[0];\r
label_pt.pos_x += work2_pt[1];\r
label_pt.pos_y += work2_pt[2];\r
- if( label_pt.clip0 > work2_pt[3] ){\r
- label_pt.clip0 = work2_pt[3];\r
+ if( label_pt.clip_l > work2_pt[3] ){\r
+ label_pt.clip_l = work2_pt[3];\r
}\r
- if( label_pt.clip1 < work2_pt[4] ){\r
- label_pt.clip1 = work2_pt[4];\r
+ if( label_pt.clip_r < work2_pt[4] ){\r
+ label_pt.clip_r = work2_pt[4];\r
}\r
- if(label_pt.clip2 > work2_pt[5] ){\r
- label_pt.clip2 = work2_pt[5];\r
+ if(label_pt.clip_t > work2_pt[5] ){\r
+ label_pt.clip_t = work2_pt[5];\r
}\r
- if( label_pt.clip3 < work2_pt[6] ){\r
- label_pt.clip3 = work2_pt[6];\r
+ if( label_pt.clip_b < work2_pt[6] ){\r
+ label_pt.clip_b = work2_pt[6];\r
}\r
}\r
\r
label_pt.pos_x /= label_pt.area;\r
label_pt.pos_y /= label_pt.area;\r
}\r
-\r
- label_num=wlabel_num;\r
+ //ラベル個数を保存する\r
+ label_list.setLength(wlabel_num);\r
return;\r
}\r
}\r
*/\r
package jp.nyatla.nyartoolkit.core;\r
\r
-\r
-\r
-\r
-\r
+import jp.nyatla.nyartoolkit.NyARException;\r
\r
\r
/**\r
pos[1] = i_pos_y;\r
// marker_holder[marker_num2].pos[1] = wpos[i*2+1]; \r
return true;\r
- } \r
+ }\r
+ private final NyARMat wk_getLine_input=new NyARMat(1,2);\r
+ private final NyARMat wk_getLine_evec=new NyARMat(2,2);\r
+ private final NyARVec wk_getLine_ev=new NyARVec(2);\r
+ private final NyARVec wk_getLine_mean=new NyARVec(2);\r
+ /**\r
+ * arGetLine(int x_coord[], int y_coord[], int coord_num,int vertex[], double line[4][3], double v[4][2])\r
+ * arGetLine2(int x_coord[], int y_coord[], int coord_num,int vertex[], double line[4][3], double v[4][2], double *dist_factor)\r
+ * の2関数の合成品です。\r
+ * マーカーのvertex,lineを計算して、結果をo_squareに保管します。\r
+ * Optimize:STEP[424->391]\r
+ * @param i_cparam\r
+ * @return\r
+ * @throws NyARException\r
+ */\r
+ public boolean getLine(NyARParam i_cparam,NyARSquare o_square) throws NyARException\r
+ {\r
+ double w1;\r
+ int st, ed, n;\r
+ int i;\r
+\r
+ final double[][] l_line=o_square.line;\r
+ final int[] l_mkvertex=this.mkvertex;\r
+ final int[] l_x_coord=this.x_coord;\r
+ final int[] l_y_coord=this.y_coord; \r
+ final NyARVec ev = this.wk_getLine_ev; //matrixPCAの戻り値を受け取る\r
+ final NyARVec mean = this.wk_getLine_mean;//matrixPCAの戻り値を受け取る\r
+ final double[] mean_array=mean.getArray();\r
+ double[] l_line_i,l_line_2;\r
+\r
+ NyARMat input=this.wk_getLine_input;//次処理で初期化される。\r
+ NyARMat evec =this.wk_getLine_evec;//アウトパラメータを受け取るから初期化不要//new NyARMat(2,2);\r
+ double[][] evec_array=evec.getArray();\r
+ for( i = 0; i < 4; i++ ) {\r
+ w1 = (double)(l_mkvertex[i+1]-l_mkvertex[i]+1) * 0.05 + 0.5;\r
+ st = (int)(l_mkvertex[i] + w1);\r
+ ed = (int)(l_mkvertex[i+1] - w1);\r
+ n = ed - st + 1;\r
+ if(n<2){\r
+ //nが2以下でmatrix.PCAを計算することはできないので、エラーにしておく。\r
+ return false;//throw new NyARException();\r
+ }\r
+ input.realloc(n,2);\r
+ //バッチ取得\r
+ i_cparam.observ2IdealBatch(l_x_coord,l_y_coord,st,n,input.getArray());\r
+\r
+ input.matrixPCA(evec, ev, mean);\r
+ l_line_i=l_line[i];\r
+ l_line_i[0] = evec_array[0][1];//line[i][0] = evec->m[1];\r
+ l_line_i[1] = -evec_array[0][0];//line[i][1] = -evec->m[0];\r
+ l_line_i[2] = -(l_line_i[0]*mean_array[0] + l_line_i[1]*mean_array[1]);//line[i][2] = -(line[i][0]*mean->v[0] + line[i][1]*mean->v[1]);\r
+ }\r
+ //値の保管\r
+ final double[][] ref_sqvertex=o_square.sqvertex;\r
+ final int[][] ref_imvertex=o_square.imvertex;\r
+ for( i = 0; i < 4; i++ )\r
+ {\r
+ l_line_i=l_line[i];\r
+ l_line_2=l_line[(i+3)%4];\r
+ w1 = l_line_2[0] * l_line_i[1] - l_line_i[0] * l_line_2[1];\r
+ if( w1 == 0.0 ){\r
+ return false;\r
+ }\r
+ //\r
+ ref_sqvertex[i][0] = ( l_line_2[1] * l_line_i[2]- l_line_i[1] * l_line_2[2] ) / w1;\r
+ ref_sqvertex[i][1] = ( l_line_i[0] * l_line_2[2]- l_line_2[0] * l_line_i[2] ) / w1;\r
+\r
+ //imvertexの保管\r
+ ref_imvertex[i][0]=x_coord[l_mkvertex[i]];\r
+ ref_imvertex[i][1]=y_coord[l_mkvertex[i]];\r
+ }\r
+ return true;\r
+ }\r
}\r
\r
\r
*/\r
package jp.nyatla.nyartoolkit.core;\r
\r
-import jp.nyatla.nyartoolkit.NyARException;\r
-import jp.nyatla.util.DoubleValue;\r
+\r
\r
/**\r
* ARMarkerInfoに相当するクラス。\r
* スクエア情報を保持します。\r
*\r
*/\r
-public class NyARSquare extends NyARMarker{\r
+public class NyARSquare{\r
// private NyARMarker marker;\r
// public int area;\r
// public double[] pos;\r
- public double[][] line=new double[4][3]; //double[4][3]\r
- public double[][] sqvertex=new double[4][2];//double[4][2];\r
- public NyARSquare()\r
+ public double[][] line=new double[4][3];\r
+ public double[][] sqvertex=new double[4][2];\r
+ public int[][] imvertex=new int[4][2];\r
+/* public NyARSquare()\r
{\r
super();\r
}\r
private final NyARMat wk_getLine_evec=new NyARMat(2,2);\r
private final NyARVec wk_getLine_ev=new NyARVec(2);\r
private final NyARVec wk_getLine_mean=new NyARVec(2);\r
- /**\r
- * arGetLine(int x_coord[], int y_coord[], int coord_num,int vertex[], double line[4][3], double v[4][2])\r
- * arGetLine2(int x_coord[], int y_coord[], int coord_num,int vertex[], double line[4][3], double v[4][2], double *dist_factor)\r
- * の2関数の合成品です。\r
- * 格納しているマーカー情報に対して、GetLineの計算を行い、結果を返します。\r
- * Optimize:STEP[424->391]\r
- * @param i_cparam\r
- * @return\r
- * @throws NyARException\r
- */\r
+\r
public boolean getLine(NyARParam i_cparam) throws NyARException\r
{\r
double w1;\r
l_sqvertex[i][1] = ( l_line_i[0] * l_line_2[2]- l_line_2[0] * l_line_i[2] ) / w1;\r
}\r
return true;\r
- }\r
+ }*/\r
}\r
\r
import jp.nyatla.nyartoolkit.NyARException;\r
\r
-public class NyARSquareList extends NyARMarkerList\r
+public class NyARSquareList\r
{\r
- private final NyARSquare[] square_array;\r
- private int square_array_num;\r
+ private final NyARSquare[] _square_array;\r
+ private int _square_array_count;\r
public NyARSquareList(int i_number_of_holder)\r
{\r
- super(new NyARSquare[i_number_of_holder]);\r
+ this._square_array=new NyARSquare[i_number_of_holder];\r
+ \r
//マーカーホルダに実体を割り当てる。\r
- for(int i=0;i<this.marker_holder.length;i++){\r
- this.marker_holder[i]=new NyARSquare();\r
+ for(int i=0;i<this._square_array.length;i++){\r
+ this._square_array[i]=new NyARSquare();\r
}\r
- this.square_array=new NyARSquare[i_number_of_holder];\r
- this.square_array_num=0;\r
+ this._square_array_count=0;\r
}\r
/**\r
- * マーカーアレイをフィルタして、square_arrayを更新する。\r
- * [[この関数はマーカー検出処理と密接に関係する関数です。\r
- * NyARDetectSquareクラス以外から呼び出さないで下さい。]]\r
+ * NyARMarkerListを走査して、有効なsquareを取得します。\r
*/\r
- public final void updateSquareArray(NyARParam i_param) throws NyARException\r
+ public final void pickupSquare(NyARParam i_param,NyARMarkerList i_markers) throws NyARException\r
{\r
- NyARSquare square;\r
int j=0;\r
- for (int i = 0; i <this.marker_array_num; i++){\r
-// double[][] line =new double[4][3];\r
-// double[][] vertex =new double[4][2];\r
- //NyARMarker marker=detect.getMarker(i);\r
- square=(NyARSquare)this.marker_array[i];\r
- //・・・線の検出??\r
- if (!square.getLine(i_param))\r
- {\r
- continue;\r
- }\r
- this.square_array[j]=square;\r
-//ここで計算するのは良くないと思うんだ \r
-// marker_infoL[j].id = id.get();\r
-// marker_infoL[j].dir = dir.get();\r
-// marker_infoL[j].cf = cf.get(); \r
- j++;\r
+ for (int i = 0; i <i_markers.getMarkerNum(); i++){\r
+ //マーカーのライン情報を確保する。\r
+ if(!i_markers.getMarker(i).getLine(i_param,this._square_array[j])){\r
+ continue;\r
+ }\r
+ j++;\r
}\r
- this.square_array_num=j;\r
+ //発見したマーカーの個数を保存\r
+ this._square_array_count=j;\r
}\r
/**\r
* スクエア配列に格納されている要素数を返します。\r
* @return\r
*/\r
- public final int getSquareNum()\r
+ public final int getCount()\r
{\r
- return this.square_array_num;\r
+ return this._square_array_count;\r
}\r
/**\r
* スクエア配列の要素を返します。\r
* スクエア配列はマーカーアレイをさらにフィルタした結果です。\r
- * マーカーアレイの部分集合になっている点に注意してください。\r
* @param i_index\r
* @return\r
* @throws NyARException\r
*/\r
public final NyARSquare getSquare(int i_index) throws NyARException\r
{\r
- if(i_index>=this.square_array_num){\r
+ if(i_index>=this._square_array_count){\r
throw new NyARException();\r
}\r
- return this.square_array[i_index];\r
+ return this._square_array[i_index];\r
}\r
}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.labeling;\r
+\r
+import jp.nyatla.nyartoolkit.*;\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+\r
+\r
+public interface INyLabeling\r
+{\r
+ public void attachDestination(NyLabelingImage i_destination_image) throws NyARException;\r
+ public void labeling(INyARRaster i_input_raster) throws NyARException;\r
+}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.labeling;\r
+\r
+public class NyARLabel\r
+{\r
+ public int area;\r
+ public int clip_r;//0\r
+ public int clip_l;//1\r
+ public int clip_b;//2\r
+ public int clip_t;//3\r
+// public int pos_x_sum;\r
+// public int pos_y_sum;\r
+ public double pos_x;\r
+ public double pos_y;\r
+}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.labeling;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+\r
+/**\r
+ * NyLabelの予約型動的配列\r
+ *\r
+ */\r
+public class NyARLabelList\r
+{ \r
+ private final static int ARRAY_APPEND_STEP=128;\r
+ private final static int ARRAY_MAX=1024*16;\r
+ private final NyARLabel[] _labels;\r
+ private int _allocated_size;\r
+ private int _length;\r
+ /**\r
+ * 最大ARRAY_MAX個の動的割り当てバッファを準備する。\r
+ * @param i_holder_size\r
+ */\r
+ public NyARLabelList()\r
+ {\r
+ //ポインタだけははじめに確保しておく\r
+ this._labels=new NyARLabel[ARRAY_MAX];\r
+ //現在アロケート中の個数は0\r
+ this._allocated_size=0;\r
+ this._length=0;\r
+ }\r
+ /**\r
+ * i_indexで指定した番号までのバッファを準備する。\r
+ * @param i_index\r
+ */\r
+ public final void reserv(int i_index) throws NyARException\r
+ {\r
+ //アロケート済みなら即リターン\r
+ if(this._allocated_size>i_index){\r
+ return;\r
+ }\r
+ //要求されたインデクスは範囲外\r
+ if(i_index>=this._labels.length){\r
+ throw new NyARException();\r
+ }\r
+ //追加アロケート範囲を計算\r
+ int range=i_index+ARRAY_APPEND_STEP;\r
+ if(range>=this._labels.length){\r
+ range=this._labels.length;\r
+ }\r
+ //アロケート\r
+ for(int i=this._allocated_size;i<range;i++)\r
+ {\r
+ this._labels[i]=new NyARLabel();\r
+ }\r
+ this._allocated_size=range;\r
+ }\r
+ public final NyARLabel[] getArray()\r
+ {\r
+ return this._labels;\r
+ }\r
+ /**\r
+ * 動的配列の見かけ上の要素数を設定する。\r
+ */\r
+ public final void setLength(int i_length)\r
+ {\r
+ this._length=i_length;\r
+ \r
+ }\r
+ public final int getCount()\r
+ {\r
+ return this._length;\r
+ }\r
+}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.labeling;\r
+\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+\r
+public class NyLabelingImage\r
+{\r
+ private TNyIntSize _size;\r
+ private int[][] _image;\r
+ private NyARLabelList _label_list;\r
+ /**\r
+ * \r
+ * @param i_width\r
+ * @param i_height\r
+ */\r
+ public NyLabelingImage(int i_width,int i_height)\r
+ {\r
+ this._size=new TNyIntSize();\r
+ this._size.w=i_width;\r
+ this._size.h=i_height;\r
+ this._image=new int[i_height][i_width];\r
+ this._label_list=new NyARLabelList();\r
+ }\r
+ public TNyIntSize getSize()\r
+ {\r
+ return this._size;\r
+ }\r
+ public int[][] getImage()\r
+ {\r
+ return this._image;\r
+ }\r
+ public NyARLabelList getLabelList()\r
+ {\r
+ return this._label_list;\r
+ }\r
+}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.labeling;\r
+\r
+import jp.nyatla.nyartoolkit.core.raster.*;\r
+import jp.nyatla.nyartoolkit.*;\r
+/**\r
+ * \r
+ * @author nyatla\r
+ * モノクロ256段階ラスタデータ保持クラス\r
+ */\r
+public class NyLabelingRaster\r
+{\r
+ private INyARRaster _related_raster;\r
+ private int[][] _pixcels;\r
+ private int[] _average;\r
+ private int _width;\r
+ private int _height;\r
+ \r
+ /**\r
+ * 現状の設定でラスタの保持データを初期化する。\r
+ */\r
+ private void initRaster()\r
+ {\r
+ //ワーク領域を確保\r
+ if(this._pixcels==null)\r
+ {\r
+ \r
+ }\r
+ //値を初期化(_averageが)\r
+ \r
+ \r
+ }\r
+ public NyLabelingRaster(int i_width,int i_height)\r
+ {\r
+ this._height=i_height;\r
+ this._width=i_width;\r
+ //指定サイズで初期化をする。\r
+ this._pixcels=new int[i_height][];\r
+\r
+ }\r
+ /**\r
+ * 連携するラスタオブジェクトを指定する。\r
+ * @param i_raster\r
+ */\r
+ public void SetRelatedRaster(INyARRaster i_raster) throws NyARException\r
+ {\r
+ //新しいラスタをセット\r
+ this._related_raster=i_raster;\r
+ //ラスタサイズが一致しているかを確認する。(一致していなければ例外を発生する)\r
+ if(i_raster.getSize().isEqualSize(this._width,this._height))\r
+ {\r
+ throw new NyARException();\r
+ }\r
+ //キャッシュしている情報を無効化\r
+ this._pixcels=new int[this._height][];\r
+ this._average=new int[this._height];\r
+ }\r
+ \r
+ public int[] GetLine(int i_line_no)\r
+ {\r
+ int[] line=this._pixcels[i_line_no];\r
+ if(line==null){\r
+ //ラインを作る。\r
+ line=new int[this._width];\r
+ this._related_raster.getPixelTotalRowLine(i_line_no,line);\r
+ this._pixcels[i_line_no]=line;\r
+ //平均値の計算\r
+ int ave=0;\r
+ for(int i=this._width-1;i>=0;i++){\r
+ ave+=line[i];\r
+ }\r
+ this._average[i_line_no]=ave/this._width;\r
+ }\r
+ return line;\r
+ }\r
+ public int GetLineAverage(int i_line_no)\r
+ {\r
+ if(this._pixcels[i_line_no]==null){\r
+ this.GetLine(i_line_no);\r
+ }\r
+ return this._average[i_line_no];\r
+ }\r
+ \r
+}\r
*/\r
package jp.nyatla.nyartoolkit.core.raster;\r
\r
-public interface NyARRaster{\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+\r
+public interface INyARRaster{\r
//RGBの合計値を返す\r
public int getPixelTotal(int i_x,int i_y);\r
/**\r
* getWidth()の戻り値以上のサイズが必要。\r
*/\r
public void getPixelTotalRowLine(int i_row,int[] o_line);\r
- public int getWidth();\r
- public int getHeight();\r
public void getPixel(int i_x,int i_y,int[] i_rgb);\r
/**\r
* 複数のピクセル値をi_rgbへ返します。\r
* ピクセル値を返すバッファ\r
*/\r
public void getPixelSet(int[] i_x,int i_y[],int i_num,int[] o_rgb);\r
+ public int getWidth();\r
+ public int getHeight();\r
+ public TNyIntSize getSize();\r
}\r
\r
\r
package jp.nyatla.nyartoolkit.core.raster;\r
\r
\r
-public class NyARRaster_BGRA implements NyARRaster\r
+public class NyARRaster_BGRA extends NyARRaster_BasicClass\r
{\r
private byte[] ref_buf;\r
- private int width;\r
- private int height;\r
public static NyARRaster_BGRA wrap(byte[] i_buffer,int i_width,int i_height)\r
{\r
NyARRaster_BGRA new_inst=new NyARRaster_BGRA();\r
new_inst.ref_buf=i_buffer;\r
- new_inst.width =i_width;\r
- new_inst.height =i_height;\r
+ new_inst._size.w=i_width;\r
+ new_inst._size.h=i_height;\r
return new_inst;\r
}\r
//RGBの合計値を返す\r
public int getPixelTotal(int i_x,int i_y)\r
{\r
- int bp=(i_x+i_y*this.width)*4;\r
+ int bp=(i_x+i_y*this._size.w)*4;\r
byte[] ref=this.ref_buf;\r
return (ref[bp] & 0xff)+(ref[bp+1] & 0xff)+(ref[bp+2] & 0xff);\r
}\r
public void getPixelTotalRowLine(int i_row,int[] o_line)\r
{\r
final byte[] ref=this.ref_buf;\r
- int bp=(i_row+1)*this.width*4-4;\r
- for(int i=this.width-1;i>=0;i--){\r
+ int bp=(i_row+1)*this._size.w*4-4;\r
+ for(int i=this._size.w-1;i>=0;i--){\r
o_line[i]=(ref[bp] & 0xff)+(ref[bp+1] & 0xff)+(ref[bp+2] & 0xff);\r
bp-=4;\r
}\r
}\r
- public int getWidth()\r
- {\r
- return width;\r
- }\r
- public int getHeight()\r
- {\r
- return height;\r
- }\r
public void getPixel(int i_x,int i_y,int[] i_rgb)\r
{\r
byte[] ref=this.ref_buf;\r
- int bp=(i_x+i_y*this.width)*4;\r
+ int bp=(i_x+i_y*this._size.w)*4;\r
i_rgb[0]=(ref[bp+2] & 0xff);//R\r
i_rgb[1]=(ref[bp+1] & 0xff);//G\r
i_rgb[2]=(ref[bp+0] & 0xff);//B\r
}\r
public void getPixelSet(int[] i_x,int i_y[],int i_num,int[] o_rgb)\r
{\r
- int width=this.width;\r
+ int width=this._size.w;\r
byte[] ref=this.ref_buf;\r
int bp;\r
for(int i=i_num-1;i>=0;i--){\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.raster;\r
+\r
+import jp.nyatla.nyartoolkit.core.types.*;\r
+/**\r
+ * NyARRasterインタフェイスの基本関数/メンバを実装したクラス\r
+ * \r
+ *\r
+ */\r
+public abstract class NyARRaster_BasicClass implements INyARRaster \r
+{\r
+ final protected TNyIntSize _size=new TNyIntSize();\r
+ final public int getWidth()\r
+ {\r
+ return this._size.w;\r
+ }\r
+ final public int getHeight()\r
+ {\r
+ return this._size.h;\r
+ }\r
+ final public TNyIntSize getSize()\r
+ {\r
+ return this._size;\r
+ }\r
+}\r
* 真っ黒の矩形を定義する。\r
*\r
*/\r
-public class NyARRaster_Blank implements NyARRaster\r
+public class NyARRaster_Blank extends NyARRaster_BasicClass\r
{\r
- private int width;\r
- private int height;\r
public NyARRaster_Blank(int i_width,int i_height)\r
{\r
- width =i_width;\r
- height =i_height;\r
+ this._size.w=i_width;\r
+ this._size.h=i_height;\r
}\r
//RGBの合計値を返す\r
public int getPixelTotal(int i_x,int i_y)\r
}\r
public void getPixelTotalRowLine(int i_row,int[] o_line)\r
{\r
- for(int i=this.width-1;i>=0;i--){\r
+ for(int i=this._size.w-1;i>=0;i--){\r
o_line[i]=0;\r
}\r
} \r
- public int getWidth()\r
- {\r
- return width;\r
- }\r
- public int getHeight()\r
- {\r
- return height;\r
- }\r
public void getPixel(int i_x,int i_y,int[] i_rgb)\r
{\r
i_rgb[0]=0;\r
package jp.nyatla.nyartoolkit.core.raster;\r
\r
\r
-public class NyARRaster_RGB implements NyARRaster\r
+\r
+public class NyARRaster_RGB extends NyARRaster_BasicClass\r
{\r
protected byte[] ref_buf;\r
- protected int width;\r
- protected int height;\r
public static NyARRaster_RGB wrap(byte[] i_buffer,int i_width,int i_height)\r
{\r
NyARRaster_RGB new_inst=new NyARRaster_RGB();\r
new_inst.ref_buf=i_buffer;\r
- new_inst.width =i_width;\r
- new_inst.height =i_height;\r
+ new_inst._size.w=i_width;\r
+ new_inst._size.h=i_height;\r
return new_inst;\r
}\r
//RGBの合計値を返す\r
public int getPixelTotal(int i_x,int i_y)\r
{\r
byte[] ref=this.ref_buf;\r
- int bp=(i_x+i_y*this.width)*3;\r
+ int bp=(i_x+i_y*this._size.w)*3;\r
return (ref[bp] & 0xff)+(ref[bp+1] & 0xff)+(ref[bp+2] & 0xff);\r
}\r
public void getPixelTotalRowLine(int i_row,int[] o_line)\r
{\r
final byte[] ref=this.ref_buf;\r
- int bp=(i_row+1)*this.width*3-3;\r
- for(int i=this.width-1;i>=0;i--){\r
+ int bp=(i_row+1)*this._size.w*3-3;\r
+ for(int i=this._size.w-1;i>=0;i--){\r
o_line[i]=(ref[bp] & 0xff)+(ref[bp+1] & 0xff)+(ref[bp+2] & 0xff);\r
bp-=3;\r
}\r
- } \r
- public int getWidth()\r
- {\r
- return width;\r
- }\r
- public int getHeight()\r
- {\r
- return height;\r
}\r
public void getPixel(int i_x,int i_y,int[] i_rgb)\r
{\r
- int bp=(i_x+i_y*this.width)*3;\r
+ int bp=(i_x+i_y*this._size.w)*3;\r
byte[] ref=this.ref_buf;\r
i_rgb[0]=(ref[bp+0] & 0xff);//R\r
i_rgb[1]=(ref[bp+1] & 0xff);//G\r
}\r
public void getPixelSet(int[] i_x,int i_y[],int i_num,int[] o_rgb)\r
{\r
- int width=this.width;\r
+ int width=this._size.w;\r
byte[] ref=this.ref_buf;\r
int bp;\r
for(int i=i_num-1;i>=0;i--){\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.types;\r
+\r
+public class NySquare\r
+{\r
+ public TNyIntLine[] line=new TNyIntLine[4];\r
+ public TNyIntPoint[] vertex=new TNyIntPoint[4];\r
+\r
+}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.types;\r
+\r
+/**\r
+ * 整数ラインを表現する\r
+ * @author nyatla\r
+ *\r
+ */\r
+public class TNyIntLine\r
+{\r
+ public int x;\r
+ public int y;\r
+ public int v;\r
+}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.types;\r
+\r
+public class TNyIntPoint\r
+{\r
+ public int x;\r
+ public int y;\r
+\r
+}\r
--- /dev/null
+package jp.nyatla.nyartoolkit.core.types;\r
+\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+\r
+public class TNyIntSize\r
+{\r
+ public int h;\r
+ public int w;\r
+ /**\r
+ * サイズが同一であるかを確認する。\r
+ * @param i_width\r
+ * @param i_height\r
+ * @return\r
+ * @throws NyARException\r
+ */\r
+ public boolean isEqualSize(int i_width,int i_height)\r
+ {\r
+ if(i_width==this.w && i_height==this.h)\r
+ {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+ /**\r
+ * サイズが同一であるかを確認する。\r
+ * @param i_width\r
+ * @param i_height\r
+ * @return\r
+ * @throws NyARException\r
+ */ \r
+ public boolean isEqualSize(TNyIntSize i_size)\r
+ {\r
+ if(i_size.w==this.w && i_size.h==this.h)\r
+ {\r
+ return true;\r
+ }\r
+ return false;\r
+\r
+ }\r
+\r
+}\r
public NyARDetectMarker(NyARParam i_param,NyARCode[] i_code,double[] i_marker_width,int i_number_of_code) throws NyARException\r
{\r
//解析オブジェクトを作る\r
- this.square=new NyARDetectSquare(i_param);\r
+ this.square=new NyARDetectSquare(i_param,AR_SQUARE_MAX);\r
this.transmat=new NyARTransMat_O2(i_param);\r
//比較コードを保存\r
this.codes=i_code;\r
* マーカーが見つからない場合は0を返します。\r
* @throws NyARException\r
*/\r
- public int detectMarkerLite(NyARRaster i_image,int i_thresh) throws NyARException\r
+ public int detectMarkerLite(INyARRaster i_image,int i_thresh) throws NyARException\r
{\r
NyARSquareList l_square_list=this.square_list;\r
//スクエアコードを探す\r
- square.detectSquare(i_image, i_thresh,l_square_list);\r
+ square.detectSquare(i_image,i_thresh,l_square_list);\r
\r
- final int number_of_square=l_square_list.getSquareNum();\r
+ final int number_of_square=l_square_list.getCount();\r
//コードは見つかった?\r
if(number_of_square<1){\r
//ないや。おしまい。\r
public NyARSingleDetectMarker(NyARParam i_param,NyARCode i_code,double i_marker_width) throws NyARException\r
{\r
//解析オブジェクトを作る\r
- this.square=new NyARDetectSquare(i_param);\r
+ this.square=new NyARDetectSquare(i_param,AR_SQUARE_MAX*3);\r
this.transmat=new NyARTransMat_O2(i_param);\r
//比較コードを保存\r
this.code=i_code;\r
* マーカーが検出できたかを真偽値で返します。\r
* @throws NyARException\r
*/\r
- public boolean detectMarkerLite(NyARRaster i_image,int i_thresh) throws NyARException\r
+ public boolean detectMarkerLite(INyARRaster i_image,int i_thresh) throws NyARException\r
{\r
detected_square=null;\r
NyARSquareList l_square_list=this.square_list;\r
//スクエアコードを探す\r
square.detectSquare(i_image, i_thresh,l_square_list);\r
\r
- int number_of_square=l_square_list.getSquareNum();\r
+ int number_of_square=l_square_list.getCount();\r
//コードは見つかった?\r
if(number_of_square<1){\r
return false;\r