5 package jp.nyatla.nyartoolkit.dev;
9 import javax.media.util.BufferToImage;
10 import javax.media.format.*;
12 import jp.nyatla.nyartoolkit.NyARException;
13 import jp.nyatla.nyartoolkit.jmf.utils.*;
14 import jp.nyatla.nyartoolkit.core.*;
15 import jp.nyatla.nyartoolkit.toys.x2.NyARLabeling_ARToolKit_X2;
16 import jp.nyatla.nyartoolkit.toys.x2.NyARTransMat_X2;
20 import jp.nyatla.nyartoolkit.core.INyARSquareDetector;
21 import jp.nyatla.nyartoolkit.core.labeling.*;
22 import jp.nyatla.nyartoolkit.core.match.*;
23 import jp.nyatla.nyartoolkit.core.param.*;
24 import jp.nyatla.nyartoolkit.core.pickup.*;
25 import jp.nyatla.nyartoolkit.core.raster.*;
26 import jp.nyatla.nyartoolkit.core.raster.rgb.INyARRgbRaster;
27 import jp.nyatla.nyartoolkit.core.rasterfilter.*;
28 import jp.nyatla.nyartoolkit.core2.rasteranalyzer.*;
29 import jp.nyatla.nyartoolkit.core2.rasteranalyzer.threshold.*;
30 import jp.nyatla.nyartoolkit.core2.rasterfilter.gs2bin.*;
31 import jp.nyatla.nyartoolkit.core2.rasterfilter.rgb2gs.NyARRasterFilter_RgbAve;
32 import jp.nyatla.utils.NyObjectStack;
33 import jp.nyatla.utils.j2se.LabelingBufferdImage;
34 import jp.nyatla.nyartoolkit.core.rasterfilter.rgb2bin.*;
35 import jp.nyatla.nyartoolkit.core.transmat.*;
36 import jp.nyatla.nyartoolkit.core.types.*;
39 class NyARMkVertexStack extends NyObjectStack
41 public NyARMkVertexStack(int i_length)
43 super(new NyARIntPoint[i_length][]);
47 protected void onReservRequest(int i_start, int i_end, Object[] i_buffer)
49 for (int i = i_start; i < i_end; i++) {
50 i_buffer[i] = NyARIntPoint.createArray(4);
55 * QRコードのシンボルを結びつける偉いクラス
58 class NyQrCodeSymbolBinder
60 LabelingBufferdImage bimg;
62 NyARIntPoint[][] _sqare;
70 public static void getMinimumTriangleVertex(NyARIntPoint[][] i_sqare,int[] o_vertex_id)
78 for(int i2=0;i2<4;i2++)
80 for(int i3=0;i3<4;i3++){
81 x=i_sqare[0][i].x-i_sqare[2][i3].x;
82 y=i_sqare[0][i].y-i_sqare[2][i3].y;
84 x=i_sqare[1][i2].x-i_sqare[2][i3].x;
85 y=i_sqare[1][i2].y-i_sqare[2][i3].y;
87 x=i_sqare[1][i2].x-i_sqare[0][i].x;
88 y=i_sqare[1][i2].y-i_sqare[0][i].y;
106 public static void getMinimumLineVertex(NyARIntPoint[] i_sqare0,NyARIntPoint[] i_sqare1,int[] o_vertex_id)
108 //辺の長さが最小になる頂点の組合せを探す
114 for(int i2=0;i2<4;i2++)
116 x=i_sqare1[i2].x-i_sqare0[i].x;
117 y=i_sqare1[i2].y-i_sqare0[i].y;
136 public static int getKeySymble(NyARIntPoint[][] i_sqare,int[] i_vertex_id)
143 final NyARIntPoint[] sq_ptr=i_sqare[i];
155 //前段で探した頂点候補のうち、最も重心に近いものが中心シンボルの内対角点
156 int key_symble_idx=0;
157 int x=i_sqare[0][i_vertex_id[0]].x-cx;
158 int y=i_sqare[0][i_vertex_id[0]].y-cy;
160 for(int i=1;i<3;i++){
161 x=i_sqare[i][i_vertex_id[i]].x-cx;
162 y=i_sqare[i][i_vertex_id[i]].y-cy;
169 return key_symble_idx;
171 public void getLineFromVertex(NyARIntPoint i_v1,NyARIntPoint i_v2)
173 double sx=i_v1.x-i_v2.x;
174 double sy=i_v1.y-i_v2.y;
176 double b=i_v2.y-k*i_v2.x;
177 Graphics g=this.bimg.getGraphics();
178 g.setColor(Color.red);
179 g.drawLine(0,(int)b,320,(int)(k*320+b));
188 public boolean margeEdge(NyARIntPoint[][] i_sq,NyARSquare o_sq)
190 int[] minimum_triangle_vertex=new int[3];
191 int[] minimum_line_vertex=new int[2];
193 //辺の長さが最小になる頂点の組合せを探す
194 getMinimumTriangleVertex(i_sq,minimum_triangle_vertex);
197 int key_simble_idx=getKeySymble(i_sq,minimum_triangle_vertex);
199 //エッジシンボルのインデックス番号を決める
200 int symbol_e1_idx=(key_simble_idx+1)%3;
201 int symbol_e2_idx=(key_simble_idx+2)%3;
203 //エッジシンボル間で最短距離を取る頂点ペアを取る
204 //(角度を低くするとエラーが出やすい。対角線との類似性を確認する方法のほうがいい。多分)
205 getMinimumLineVertex(i_sq[symbol_e1_idx],i_sq[symbol_e2_idx],minimum_line_vertex);
208 int lv1=(minimum_line_vertex[0]+2)%4;
209 int lv2=(minimum_line_vertex[1]+2)%4;
210 int kv =(minimum_triangle_vertex[key_simble_idx]+2)%4;
212 getLineFromVertex(i_sq[symbol_e1_idx][(lv1+1)%4],i_sq[symbol_e1_idx][lv1]);
213 getLineFromVertex(i_sq[symbol_e1_idx][(lv1+3)%4],i_sq[symbol_e1_idx][lv1]);
214 getLineFromVertex(i_sq[symbol_e2_idx][(lv2+1)%4],i_sq[symbol_e2_idx][lv2]);
215 getLineFromVertex(i_sq[symbol_e2_idx][(lv2+3)%4],i_sq[symbol_e2_idx][lv2]);
216 getLineFromVertex(i_sq[key_simble_idx][(kv+2)%4],i_sq[key_simble_idx][kv]);
219 Graphics g=this.bimg.getGraphics();
221 g.setColor(Color.green);
222 g.fillRect(i_sq[key_simble_idx][minimum_triangle_vertex[key_simble_idx]].x-2,i_sq[key_simble_idx][minimum_triangle_vertex[key_simble_idx]].y-2,4,4);
223 g.fillRect(i_sq[symbol_e1_idx][minimum_line_vertex[0]].x-2,i_sq[symbol_e1_idx][minimum_line_vertex[0]].y-2,4,4);
224 g.fillRect(i_sq[symbol_e2_idx][minimum_line_vertex[1]].x-2,i_sq[symbol_e2_idx][minimum_line_vertex[1]].y-2,4,4);
233 // this.bimg.getGraphics().fillRect(i_sq[edge1_id][vid1_id].x,i_sq[edge1_id][vid1_id].y,5,5);
235 for (int i = 0; i <3; i++) {
238 for(int i2=0;i2<4;i2++){
239 xp[i2]=i_sq[i][i2].x;
240 yp[i2]=i_sq[i][i2].y;
242 this.bimg.getGraphics().setColor(Color.RED);
243 this.bimg.getGraphics().drawPolygon(xp, yp,4);
263 * 矩形座標をPCAではなく、頂点座標そのものからSquare位置を計算するクラス
266 class NyARQRCodeDetector implements INyARSquareDetector
268 LabelingBufferdImage bimg;
269 private static final double VERTEX_FACTOR = 2.0;// 線検出のファクタ
271 private static final int AR_AREA_MAX = 100000;// #define AR_AREA_MAX 100000
273 private static final int AR_AREA_MIN = 70;// #define AR_AREA_MIN 70
275 private final int _width;
277 private final int _height;
279 private final NyARLabeling_ARToolKit_X2 _labeling;
281 private final NyARLabelingImage _limage;
283 private final NyARCameraDistortionFactor _dist_factor_ref;
286 * 最大i_squre_max個のマーカーを検出するクラスを作成する。
290 public NyARQRCodeDetector(NyARCameraDistortionFactor i_dist_factor_ref, NyARIntSize i_size) throws NyARException
292 this._width = i_size.w;
293 this._height = i_size.h;
294 this._dist_factor_ref = i_dist_factor_ref;
295 this._labeling = new NyARLabeling_ARToolKit_X2();
296 this._limage = new NyARLabelingImage(this._width, this._height);
297 this._labeling.attachDestination(this._limage);
299 // 輪郭の最大長は画面に映りうる最大の長方形サイズ。
300 int number_of_coord = (this._width + this._height) * 2;
302 // 輪郭バッファは頂点変換をするので、輪郭バッファの2倍取る。
303 this._max_coord = number_of_coord;
304 this._xcoord = new int[number_of_coord * 2];
305 this._ycoord = new int[number_of_coord * 2];
308 private final int _max_coord;
310 private final int[] _xcoord;
312 private final int[] _ycoord;
314 private void normalizeCoord(int[] i_coord_x, int[] i_coord_y, int i_index, int i_coord_num)
316 // vertex1を境界にして、後方に配列を連結
317 System.arraycopy(i_coord_x, 1, i_coord_x, i_coord_num, i_index);
318 System.arraycopy(i_coord_y, 1, i_coord_y, i_coord_num, i_index);
321 private final int[] __detectMarker_mkvertex = new int[5];
324 * ARMarkerInfo2 *arDetectMarker2( ARInt16 *limage, int label_num, int *label_ref,int *warea, double *wpos, int *wclip,int area_max, int area_min, double
325 * factor, int *marker_num ) 関数の代替品 ラベリング情報からマーカー一覧を作成してo_marker_listを更新します。 関数はo_marker_listに重なりを除外したマーカーリストを作成します。
328 * 解析する2値ラスタイメージを指定します。
329 * @param o_square_stack
331 * @throws NyARException
333 public final void detectMarker(NyARBinRaster i_raster, NyARSquareStack o_square_stack) throws NyARException
335 final INyARLabeling labeling_proc = this._labeling;
336 final NyARLabelingImage limage = this._limage;
341 o_square_stack.clear();
344 labeling_proc.labeling(i_raster);
347 final int label_num = limage.getLabelStack().getLength();
352 final NyARLabelingLabelStack stack = limage.getLabelStack();
353 final NyARLabelingLabel[] labels = (NyARLabelingLabel[]) stack.getArray();
360 for (i = 0; i < label_num; i++) {
361 // 検査対象内のラベルサイズになるまで無視
362 if (labels[i].area <= AR_AREA_MAX) {
367 final int xsize = this._width;
368 final int ysize = this._height;
369 final int[] xcoord = this._xcoord;
370 final int[] ycoord = this._ycoord;
371 final int coord_max = this._max_coord;
372 final int[] mkvertex = this.__detectMarker_mkvertex;
373 final int[][] buf = (int[][]) limage.getBufferReader().getBuffer();
374 final int[] indextable = limage.getIndexArray();
377 NyARLabelingLabel label_pt;
378 NyARMkVertexStack vertex_stack=new NyARMkVertexStack(100);
380 for (; i < label_num; i++) {
381 label_pt = labels[i];
382 label_area = label_pt.area;
383 // 検査対象サイズよりも小さくなったら終了
384 if (label_area < AR_AREA_MIN) {
387 // クリップ領域が画面の枠に接していれば除外
388 if (label_pt.clip_l == 1 || label_pt.clip_r == xsize - 2) {// if(wclip[i*4+0] == 1 || wclip[i*4+1] ==xsize-2){
391 if (label_pt.clip_t == 1 || label_pt.clip_b == ysize - 2) {// if( wclip[i*4+2] == 1 || wclip[i*4+3] ==ysize-2){
395 if (!hasQrEdgeFeature(buf, indextable, label_pt)) {
400 coord_num = limage.getContour(i, coord_max, xcoord, ycoord);
401 if (coord_num == coord_max) {
406 final int vertex1 = scanVertex(xcoord, ycoord, coord_num);
408 // 頂点候補(vertex1)を先頭に並べなおした配列を作成する。
409 normalizeCoord(xcoord, ycoord, vertex1, coord_num);
413 if (!getSquareVertex(xcoord, ycoord, vertex1, coord_num, label_area, mkvertex)) {
414 // o_square_stack.pop();// 頂点の取得が出来なかったので破棄
418 NyARIntPoint[] vertex_ptr = (NyARIntPoint[]) vertex_stack.prePush();
419 vertex_ptr[0].x=xcoord[mkvertex[0]];
420 vertex_ptr[0].y=ycoord[mkvertex[0]];
421 vertex_ptr[1].x=xcoord[mkvertex[1]];
422 vertex_ptr[1].y=ycoord[mkvertex[1]];
423 vertex_ptr[2].x=xcoord[mkvertex[2]];
424 vertex_ptr[2].y=ycoord[mkvertex[2]];
425 vertex_ptr[3].x=xcoord[mkvertex[3]];
426 vertex_ptr[3].y=ycoord[mkvertex[3]];
428 // // 頂点情報からライン情報を作っちゃう
429 // getSquare(mkvertex, xcoord, ycoord, vertex_ptr);
431 bindQrcodeEdge(vertex_stack);
442 public boolean margeEdge(NyARIntPoint[][] i_sq,NyARSquare o_sq)
444 NyQrCodeSymbolBinder binder=new NyQrCodeSymbolBinder();
445 binder.bimg=this.bimg;
446 binder.margeEdge(i_sq, o_sq);
456 * @param i_square_stack
458 public void bindQrcodeEdge(NyARMkVertexStack i_square_stack)
461 NyARIntPoint[] sq_ptr1,sq_ptr2,sq_ptr3;
462 int number_of_edge=i_square_stack.getLength();
463 if(number_of_edge<3){
466 NyARIntPoint[][] sa=(NyARIntPoint[][])i_square_stack.getArray();
467 for(int i=0;i<number_of_edge;i++)
469 for(int i2=i+1;i2<number_of_edge;i2++)
472 for(int i3=i2+1;i3<number_of_edge;i3++){
482 * 2つの頂点座標を結ぶ直線から、NyARLinearを計算する。
488 final private void getLine(NyARDoublePoint2d i_v1, NyARDoublePoint2d i_v2, NyARLinear o_line)
490 final double x = i_v1.x - i_v2.x;
491 final double y = i_v1.y - i_v2.y;
492 final double x2 = x * x;
493 final double y2 = y * y;
494 final double rise_ = Math.sqrt(x2 / (x2 + y2));
496 o_line.run = Math.sqrt(y2 / (x2 + y2));
499 o_line.rise = -o_line.rise;
501 o_line.rise = -o_line.rise;
502 o_line.run = -o_line.run;
506 o_line.rise = -o_line.rise;
507 o_line.run = -o_line.run;
509 o_line.rise = -o_line.rise;
512 o_line.intercept = (i_v1.y + (o_line.run / o_line.rise) * (i_v1.x)) * rise_;
516 private void getSquare(int[] i_mkvertex, int[] i_xcoord, int[] i_ycoord, NyARSquare o_square)
518 final NyARCameraDistortionFactor dist_factor = this._dist_factor_ref;
519 final NyARDoublePoint2d[] vertex = o_square.sqvertex;
521 NyARIntPoint[] imvertex_ptr=o_square.imvertex;
522 NyARIntPoint wk_vertex;
524 for (int i = 0; i < 4; i++) {
525 final int idx = i_mkvertex[i];
526 imvertex_ptr[i].x = i_xcoord[idx];
527 imvertex_ptr[i].y = i_ycoord[idx];
530 for (int i = 0; i < 4; i++) {
531 dist_factor.observ2Ideal(imvertex_ptr[i].x,imvertex_ptr[i].y, vertex[i]);
534 getLine(vertex[1], vertex[0], o_square.line[0]);
535 getLine(vertex[2], vertex[1], o_square.line[1]);
536 getLine(vertex[3], vertex[2], o_square.line[2]);
537 getLine(vertex[0], vertex[3], o_square.line[3]);
542 * 辺からの対角線が最長になる点を対角線候補として返す。
549 private int scanVertex(int[] i_xcoord, int[] i_ycoord, int i_coord_num)
551 final int sx = i_xcoord[0];
552 final int sy = i_ycoord[0];
556 for (int i = 1; i < i_coord_num; i++) {
557 x = i_xcoord[i] - sx;
558 y = i_ycoord[i] - sy;
564 // ここでうまく終了条件入れられないかな。
569 private final NyARVertexCounter __getSquareVertex_wv1 = new NyARVertexCounter();
571 private final NyARVertexCounter __getSquareVertex_wv2 = new NyARVertexCounter();
574 * static int arDetectMarker2_check_square( int area, ARMarkerInfo2 *marker_info2, double factor ) 関数の代替関数 OPTIMIZED STEP [450->415] o_squareに頂点情報をセットします。
578 * @param i_vertex1_index
585 private boolean getSquareVertex(int[] i_x_coord, int[] i_y_coord, int i_vertex1_index, int i_coord_num, int i_area, int[] o_vertex)
587 final NyARVertexCounter wv1 = this.__getSquareVertex_wv1;
588 final NyARVertexCounter wv2 = this.__getSquareVertex_wv2;
589 final int end_of_coord = i_vertex1_index + i_coord_num - 1;
590 final int sx = i_x_coord[i_vertex1_index];// sx = marker_info2->x_coord[0];
591 final int sy = i_y_coord[i_vertex1_index];// sy = marker_info2->y_coord[0];
593 int v1 = i_vertex1_index;
594 for (int i = 1 + i_vertex1_index; i < end_of_coord; i++) {// for(i=1;i<marker_info2->coord_num-1;i++)
596 final int d = (i_x_coord[i] - sx) * (i_x_coord[i] - sx) + (i_y_coord[i] - sy) * (i_y_coord[i] - sy);
602 final double thresh = (i_area / 0.75) * 0.01 * VERTEX_FACTOR;
604 o_vertex[0] = i_vertex1_index;
606 if (!wv1.getVertex(i_x_coord, i_y_coord, i_vertex1_index, v1, thresh)) { // if(get_vertex(marker_info2->x_coord,marker_info2->y_coord,0,v1,thresh,wv1,&wvnum1)<
610 if (!wv2.getVertex(i_x_coord, i_y_coord, v1, end_of_coord, thresh)) {// if(get_vertex(marker_info2->x_coord,marker_info2->y_coord,v1,marker_info2->coord_num-1,thresh,wv2,&wvnum2)
616 if (wv1.number_of_vertex == 1 && wv2.number_of_vertex == 1) {// if(wvnum1 == 1 && wvnum2== 1) {
617 o_vertex[1] = wv1.vertex[0];
619 o_vertex[3] = wv2.vertex[0];
620 } else if (wv1.number_of_vertex > 1 && wv2.number_of_vertex == 0) {// }else if( wvnum1 > 1 && wvnum2== 0) {
621 // 頂点位置を、起点から対角点の間の1/2にあると予想して、検索する。
622 v2 = (v1 - i_vertex1_index) / 2 + i_vertex1_index;
623 if (!wv1.getVertex(i_x_coord, i_y_coord, i_vertex1_index, v2, thresh)) {
626 if (!wv2.getVertex(i_x_coord, i_y_coord, v2, v1, thresh)) {
629 if (wv1.number_of_vertex == 1 && wv2.number_of_vertex == 1) {
630 o_vertex[1] = wv1.vertex[0];
631 o_vertex[2] = wv2.vertex[0];
636 } else if (wv1.number_of_vertex == 0 && wv2.number_of_vertex > 1) {
637 // v2 = (v1-i_vertex1_index+ end_of_coord-i_vertex1_index) / 2+i_vertex1_index;
638 v2 = (v1 + end_of_coord) / 2;
640 if (!wv1.getVertex(i_x_coord, i_y_coord, v1, v2, thresh)) {
643 if (!wv2.getVertex(i_x_coord, i_y_coord, v2, end_of_coord, thresh)) {
646 if (wv1.number_of_vertex == 1 && wv2.number_of_vertex == 1) {
648 o_vertex[2] = wv1.vertex[0];
649 o_vertex[3] = wv2.vertex[0];
656 o_vertex[4] = end_of_coord;
660 * QRコードのエッジ特徴を持つラベルであるかを調べる
666 private boolean hasQrEdgeFeature(int buf[][], int[] index_table, NyARLabelingLabel i_label)
670 int i_label_id = i_label.id;
672 final int clip_l = i_label.clip_l;
673 final int clip_b = i_label.clip_b;
674 final int clip_r = i_label.clip_r;
675 final int clip_t = i_label.clip_t;
679 limage_j = buf[clip_t];
680 for (int i = clip_l; i <= clip_r; i++) {// for( i = clip[0]; i <=clip[1]; i++, p1++ ) {
682 if (w > 0 && index_table[w - 1] == i_label_id) {
688 limage_j = buf[clip_b];
689 for (int i = clip_r; i >= clip_l; i--) {// for( i = clip[0]; i <=clip[1]; i++, p1++ ) {
691 if (w > 0 && index_table[w - 1] == i_label_id) {
696 final int cx = (clip_l + clip_r) / 2;
697 final int cy = (clip_t + clip_b) / 2;
698 // 横断チェック(中心から線を引いて、101になるかしらべる)
699 if (!checkDiagonalLine(buf, cx, cy, bx, clip_b)) {
702 if (!checkDiagonalLine(buf, tx, clip_t, cx, cy)) {
718 private boolean checkDiagonalLine(int[][] buf, int i_px1, int i_py1, int i_px2, int i_py2)
720 int sub_y = i_py2 - i_py1;
721 int sub_x = i_px2 - i_px1;
724 for (; i < sub_y; i++) {
726 int xp = i_px1 + i * sub_x / sub_y;
727 if (buf[yp][xp] == 0 && buf[yp][xp-1] == 0 && buf[yp][xp+1] == 0) {
736 for (; i < sub_y; i++) {
738 int xp = i_px1 + i * sub_x / sub_y;
739 if (buf[yp][xp] != 0 && buf[yp][xp-1] != 0 && buf[yp][xp+1] != 0) {
748 for (; i < sub_y; i++) {
750 int xp = i_px1 + i * sub_x / sub_y;
751 if (buf[yp][xp] == 0 && buf[yp][xp-1] == 0 && buf[yp][xp+1] == 0) {
766 public class CopyOfLabelingCamera extends Frame implements JmfCaptureListener
768 private final String camera_file = "../Data/camera_para.dat";
770 private JmfNyARRaster_RGB _raster;
772 private JmfCameraCapture capture;
773 private NyARParam ap;
774 public CopyOfLabelingCamera() throws NyARException, NyARException
776 setBounds(0, 0, 640 + 64, 720 + 64);
778 capture = new JmfCameraCapture(320, 240, 30f, JmfCameraCapture.PIXEL_FORMAT_RGB);
779 capture.setCaptureListener(this);
782 this._raster = new JmfNyARRaster_RGB(320, 240);
784 // AR用カメラパラメタファイルをロード
785 ap = new NyARParam();
786 ap.loadARParamFromFile(camera_file);
787 ap.changeScreenSize(320, 240);
794 private NyARBinRaster _binraster1 = new NyARBinRaster(320, 240);
796 private NyARGlayscaleRaster _gsraster1 = new NyARGlayscaleRaster(320, 240);
798 private NyARLabelingImage _limage = new NyARLabelingImage(320, 240);
800 private LabelingBufferdImage _bimg = new LabelingBufferdImage(320, 240);
802 private NyARRasterFilter_ARToolkitThreshold filter_gs2bin;
804 public void onUpdateBuffer(Buffer i_buffer)
806 NyARRasterFilter_AreaAverage gs2bin=new NyARRasterFilter_AreaAverage();
809 // キャプチャしたバッファをラスタにセット
810 _raster.setBuffer(i_buffer);
812 Graphics g = getGraphics();
814 BufferToImage b2i = new BufferToImage((VideoFormat) i_buffer.getFormat());
815 Image img = b2i.createImage(i_buffer);
816 this.getGraphics().drawImage(img, 32, 32, this);
819 INyARRasterFilter_RgbToGs filter_rgb2gs = new NyARRasterFilter_RgbAve();
820 filter_rgb2gs.doFilter(_raster, _gsraster1);
821 this._bimg.drawImage(this._gsraster1);
822 this.getGraphics().drawImage(this._bimg, 32 + 320, 32, 320 + 320 + 32, 240 + 32, 0, 240, 320, 0, this);
826 gs2bin.doFilter(_gsraster1, _binraster1);
827 this._bimg.drawImage(_binraster1);
828 this.getGraphics().drawImage(this._bimg, 32, 32 + 240, 320 + 32, 240 + 32 + 240, 0, 240, 320, 0, this);
831 NyARLabelingImage limage = new NyARLabelingImage(320, 240);
832 NyARLabeling_ARToolKit labeling = new NyARLabeling_ARToolKit();
833 labeling.attachDestination(limage);
834 labeling.labeling(_binraster1);
835 this._bimg.drawImage(this._gsraster1);
836 NyARLabelingLabel[] labels = (NyARLabelingLabel[]) limage.getLabelStack().getArray();
838 NyARSquareStack stack = new NyARSquareStack(100);
839 NyARQRCodeDetector detect = new NyARQRCodeDetector(ap.getDistortionFactor(), new NyARIntSize(320,240));
840 detect.bimg=this._bimg;
842 detect.detectMarker(_binraster1, stack);
843 for (int i = 0; i < stack.getLength(); i++) {
844 NyARSquare[] square_ptr = (NyARSquare[]) stack.getArray();
847 for(int i2=0;i2<4;i2++){
848 xp[i2]=square_ptr[i].imvertex[i2].x;
849 yp[i2]=square_ptr[i].imvertex[i2].y;
851 this._bimg.getGraphics().setColor(Color.RED);
852 this._bimg.getGraphics().drawPolygon(xp, yp,2);
854 this.getGraphics().drawImage(this._bimg, 32 + 320, 32 + 240, 320 + 32 + 320, 240 + 32 + 240, 0, 240, 320, 0, this);
857 // threshold.debugDrawHistgramMap(_workraster, _workraster2);
858 // this._bimg2.setImage(this._workraster2);
859 // this.getGraphics().drawImage(this._bimg2, 32+320, 32+240,320+32+320,240+32+240,0,240,320,0, this);
862 // NyARRasterThresholdAnalyzer_SlidePTile threshold=new NyARRasterThresholdAnalyzer_SlidePTile(15);
863 // threshold.analyzeRaster(_gsraster1);
864 // filter_gs2bin=new NyARRasterFilter_AreaAverage();
865 // filter_gs2bin.doFilter(_gsraster1, _binraster1);
866 // this._bimg.drawImage(_binraster1);
868 // NyARRasterDetector_QrCodeEdge detector=new NyARRasterDetector_QrCodeEdge(10000);
869 // detector.analyzeRaster(_binraster1);
871 // this._bimg.overlayData(detector.geResult());
873 // this.getGraphics().drawImage(this._bimg, 32, 32+480,320+32,480+32+240,0,240,320,0, this);
877 * threshold2.debugDrawHistgramMap(_workraster, _workraster2); this._bimg2.drawImage(this._workraster2); this.getGraphics().drawImage(this._bimg2,
878 * 32+320, 32+480,320+32+320,480+32+240,0,240,320,0, this);
881 // this.getGraphics().drawImage(this._bimg, 32, 32, this);
883 } catch (Exception e) {
889 private INyARLabeling labelingFactory(int i_idx)
892 // case 0:{NyARLabeling_ARToolKit l=new NyARLabeling_ARToolKit();l.setThresh(4);return l;}
893 // case 1:{return new NyLineLabeling();}
899 private void startCapture()
903 } catch (Exception e) {
908 public static void main(String[] args)
911 CopyOfLabelingCamera mainwin = new CopyOfLabelingCamera();
912 mainwin.setVisible(true);
913 mainwin.startCapture();
914 } catch (Exception e) {