Augmented reality multimarker

Using NyAR4psg FIRST CODE /** example from nyar4psg modified to demonstrate NyARMultiBoard + NyARMultiBoardMarker by Charl P. Botha <http://cpbotha.net/> updated on 20110305 to use the new P3D / OPENGL adaptation I hacked into NyARMultiBoard, and to show framerate in top-left corner. On this machine, P3D is faster. */ // we want to use the gsvideo camera support stack import codeanticode.gsvideo.*; // multiple marker tracking import jp.nyatla.nyar4psg.*; // only necessary if you’re using the OPENGL renderer (see the size() call in setup()) import processing.opengl.*; GSCapture cam; NyARMultiBoard nya; PFont font, font2d; void setup() { // our display is 640×480 size(640,480,P3D); colorMode(RGB, 100); font=createFont(“FFScala”, 32); font2d = createFont(“FFScala”, 10); // I’m using the GSVideo capture stack, we’re capturing at // the same size as the display, which should be 640×480 // on Linux with the Sony PS3 Eye cam=new GSCapture(this,width,height); cam.start(); // array of pattern file names, these have to be in the data subdir of this sketch String[] patts = {“patt.hiro”, “patt.kanji”}; // array of corresponding widths in mm double[] widths = {80,80}; // initialise the NyARMultiBoard // the camera parameter file is also in the data subdir nya=new NyARMultiBoard(this,width,height,”camera_para.dat”,patts,widths); print(nya.VERSION); // marker detection algorithm parameter nya.gsThreshold=120;//(0<n<255) default=110 // a marker has to be detected with a confidence greater than // this threshold for it to be considered a true detection nya.cfThreshold=0.4;//(0.0<n<1.0) default=0.4 } // draw marker corners and also position in text void drawMarkerPos(int[][] pos2d) { textFont(font,10.0); stroke(100,0,0); fill(100,0,0); // draw ellipses at outside corners of marker for(int i=0;i<4;i++){ ellipse(pos2d[i][0], pos2d[i][1],5,5); } fill(0,0,0); for(int i=0;i<4;i++){ text(“(“+pos2d[i][0]+”,”+pos2d[i][1]+”)”,pos2d[i][0],pos2d[i][1]); } } // standard processing event handler that’s called for display updates void draw() { // we only do something when the camera input is available if (cam.available() !=true) { return; } // get an image from the camera cam.read(); // need to put camera image on screen, so temporarily disable depth testing hint(DISABLE_DEPTH_TEST); // put webcam image on screen image(cam,0,0); hint(ENABLE_DEPTH_TEST); // if *any* markers have been detected this will be true if (nya.detect(cam)) { // going to be doing 2D drawing (drawMarkerPos) so temporarily disable depth testing hint(DISABLE_DEPTH_TEST); // for all detected markers, draw corner points for (int i=0; i < nya.markers.length; i++) { if (nya.markers[i].detected) { drawMarkerPos(nya.markers[i].pos2d); } } // depth test back on, we’re going to draw 3D YEAH!! hint(ENABLE_DEPTH_TEST); // for all detected markers: for (int i=0; i < nya.markers.length; i++) { if (nya.markers[i].detected) { // set the model-view transform to that of the marker // this will adapt automatically to P3D or OPENGL renderers nya.markers[i].beginTransform(); translate(0,0,20); // if it’s the hiro marker, draw a 3D cube if (i == 0) { stroke(255,200,0); box(40); } // else draw a sphere else { stroke(0,200,255); sphere(25); } // after drawing marker-relative 3D geometry, we // HAVE to end the transform (so now we’re back in // world space) nya.markers[i].endTransform(); } } } // display frame rate in the top left of the screen // on this Dell E6410 Core i5 laptop: // OPENGL: 45 fps // P3D: 57 fps hint(DISABLE_DEPTH_TEST); textFont(font2d,10.0); textMode(SCREEN); fill(100,100,0); text(“frame rate = ” + frameRate, 10, 10); textMode(MODEL); hint(ENABLE_DEPTH_TEST); } SECOND CODE /** NyARToolkit for proce55ing/0.3.0 (c)2008-2010 nyatla airmail(at)ebony.plala.or.jp */ import jp.nyatla.nyar4psg.*; import processing.opengl.*; import javax.media.opengl.*; import codeanticode.gsvideo.*; GSCapture cam; NyARBoard nya; PFont font;   void setup() { size(640,480,OPENGL); colorMode(RGB, 100); font=createFont(“FFScala”, 32); //キャプチャを作成 cam=new GSCapture(this,width,height); //平面検出クラスを作成 //Left hand projection matrix cam.start(); nya=new NyARBoard(this,width,height,”camera_para.dat”,”patt.hiro”,80); print(nya.VERSION); //Right hand projection matrix //nya=new NyARBoard(this,width,height,”camera_para.dat”,”patt.hiro”,80,NyARBoard.CS_RIGHT); //各種プロパティ設定(必要に応じて設定すること。何もしないとデフォルト値が入力される。) nya.gsThreshold=120;//画像2値化の閾値(0<n<255) default=110 nya.cfThreshold=0.4;//変換行列計算を行うマーカ一致度(0.0<n<1.0) default=0.4 //nya.lostDelay=10;//マーカ消失を無視する回数(0<n) default=10 /* 他に、読み出しプロパティとして以下のものがある。 これらはdetect関数がtrueを返した時に有効になる。 double confidence マーカの一致度。(0<n<1.0) int lostCount マーカ認識後に消失した時に加算されるカウンタ。マーカの遅延消失に使用する。 int pos2d[4][2] 検出したマーカの画面上の頂点座標×4個 PVector angle マーカの軸を中心にした回転角度(x,y,z)単位はラジアン PVector trans マーカの中心を基準とした平行移動量。単位はmm double transmat[12] OpenGLに指定するマーカの変換行列。 行列から値を逆算する時、beginTransformを使用せずに自分で行列操作を行う時に使用してください。 double projection[16] OpenGLに指定するProjection行列。 beginTransformを使用せずに自分で行列操作を行う時に使用してください。 */ } //この関数は、マーカ頂点の情報を描画します。 void drawMarkerPos(int[][] points) { textFont(font,10.0); stroke(100,0,0); fill(100,0,0); for(int i=0;i<4;i++){ ellipse(nya.pos2d[i][0], nya.pos2d[i][1],5,5); } fill(0,0,0); for(int i=0;i<4;i++){ text(“(“+nya.pos2d[i][0]+”,”+nya.pos2d[i][1]+”)”,nya.pos2d[i][0],nya.pos2d[i][1]); } } String angle2text(float a) { int i=(int)degrees(a); i=(i>0?i:i+360); return (i<100?” “:i<10?” “:””)+Integer.toString(i); } String trans2text(float i) { return (i<100?” “:i<10?” “:””)+Integer.toString((int)i); } void draw() { background(255); if (cam.available() !=true) { return; } cam.read(); //背景を描画 hint(DISABLE_DEPTH_TEST); image(cam,0,0); hint(ENABLE_DEPTH_TEST); //マーカの検出。マーカが発見されるとdetectはTRUEを返す。 if(nya.detect(cam)){ hint(DISABLE_DEPTH_TEST); //一致度を書く textFont(font,25.0); fill((int)((1.0-nya.confidence)*100),(int)(nya.confidence*100),0); text((int)(nya.confidence*100)+”%”,width-60,height-20); //マーカの角度、水平位置等 pushMatrix(); textFont(font,10.0); fill(0,100,0,80); translate((nya.pos2d[0][0]+nya.pos2d[1][0]+nya.pos2d[2][0]+nya.pos2d[3][0])/4+50,(nya.pos2d[0][1]+nya.pos2d[1][1]+nya.pos2d[2][1]+nya.pos2d[3][1])/4+50); text(“TRANS “+trans2text(nya.trans.x)+”,”+trans2text(nya.trans.y)+”,”+trans2text(nya.trans.z),0,0); text(“ANGLE “+angle2text(nya.angle.x)+”,”+angle2text(nya.angle.y)+”,”+angle2text(nya.angle.z),0,15); popMatrix(); //マーカの位置を描画 drawMarkerPos(nya.pos2d); hint(ENABLE_DEPTH_TEST); PGraphicsOpenGL pgl = (PGraphicsOpenGL) g; nya.beginTransform(pgl);//マーカ座標系での描画を開始する。 //ここからマーカ座標系 stroke(255,200,0); translate(0,0,20); box(40); nya.endTransform();//マーカ座標系での描画を終了する。(必ず呼んで!) } }  

Leave a Reply

The best way to predict the future is to invent it (Alan Kay)