aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdoc/pdp_artkp-help.pd65
-rwxr-xr-xmodules/pdp_artkp.cpp109
2 files changed, 169 insertions, 5 deletions
diff --git a/doc/pdp_artkp-help.pd b/doc/pdp_artkp-help.pd
new file mode 100755
index 0000000..ac37df6
--- /dev/null
+++ b/doc/pdp_artkp-help.pd
@@ -0,0 +1,65 @@
+#N canvas 387 154 846 664 10;
+#X obj 134 107 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X msg 54 182 loop \$1;
+#X obj 55 160 tgl 15 0 empty empty empty 20 8 0 8 -262144 -1 -1 0 1
+;
+#X msg 169 128 open \$1;
+#X obj 168 104 openpanel;
+#X obj 153 87 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X msg 91 108 stop;
+#X obj 123 178 metro 70;
+#X obj 255 156 metro 70;
+#X obj 300 122 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X msg 257 123 stop;
+#X obj 118 210 pdp_yqt;
+#X obj 720 561 pdp_control;
+#X msg 720 534 thread \$1;
+#X floatatom 720 622 5 0 0 0 - - -;
+#X obj 720 593 route pdp_drop;
+#X obj 246 186 pdp_v4l2;
+#X obj 348 154 metro 70;
+#X obj 393 120 bng 15 250 50 0 empty empty empty 20 8 0 8 -262144 -1
+-1;
+#X msg 350 121 stop;
+#X obj 342 184 pdp_v4l;
+#X text 376 248 pdp_artkp : pdp bindings for ARToolKitPkus( augmented
+reality toolkit : http://studierstube.icg.tu-graz.ac.at/handheld_ar/artoolkitplus.php
+);
+#X text 378 336 written by Yves Degoyon (ydegoyon@free.fr);
+#X text 377 290 to compile it \, you need ARToolKitPlus sources and
+use ./configure --with-artkp=/path-to-sources ....;
+#X obj 152 382 pdp_artkp;
+#X obj 152 576 pdp_xv;
+#X text 378 313 to make it run \, you need to install the files from
+pidip/artkp in /usr/share/ARToolKitPlus....;
+#X floatatom 213 412 5 0 0 0 - - -;
+#X text 254 413 number of markers;
+#X obj 209 502 print marker data :;
+#X obj 216 437 print markers detected :;
+#X connect 0 0 7 0;
+#X connect 1 0 11 0;
+#X connect 2 0 1 0;
+#X connect 3 0 11 0;
+#X connect 4 0 3 0;
+#X connect 5 0 4 0;
+#X connect 6 0 7 0;
+#X connect 7 0 11 0;
+#X connect 8 0 16 0;
+#X connect 9 0 8 0;
+#X connect 10 0 8 0;
+#X connect 11 0 24 0;
+#X connect 12 0 15 0;
+#X connect 13 0 12 0;
+#X connect 15 0 14 0;
+#X connect 16 0 24 0;
+#X connect 17 0 20 0;
+#X connect 18 0 17 0;
+#X connect 19 0 17 0;
+#X connect 20 0 24 0;
+#X connect 24 0 25 0;
+#X connect 24 1 29 0;
+#X connect 24 2 27 0;
+#X connect 24 2 30 0;
diff --git a/modules/pdp_artkp.cpp b/modules/pdp_artkp.cpp
index 6331562..095bbd6 100755
--- a/modules/pdp_artkp.cpp
+++ b/modules/pdp_artkp.cpp
@@ -23,14 +23,26 @@
#include <string.h>
#include <dirent.h>
+#include "ARToolKitPlus/TrackerMultiMarkerImpl.h"
+
#include "pdp.h"
+class PdLogger : public ARToolKitPlus::Logger
+{
+ void artLog(const char* msg)
+ {
+ post("pdp_artkp : %s", msg);
+ }
+};
+
typedef struct pdp_artkp
{
t_object x_obj;
t_float x_f;
t_outlet *x_outlet0;
+ t_outlet *x_outlet1;
+ t_outlet *x_outlet2;
int x_packet0;
int x_packet1;
int x_dropped;
@@ -40,17 +52,77 @@ typedef struct pdp_artkp
int x_height;
int x_size;
+ // ARToolKitPlus data
+ ARToolKitPlus::TrackerMultiMarker *x_tracker; /// the ARToolKitPlus marker tracker
+ PdLogger *x_logger; // tracker logger
+ int x_nummarkers; // number of detected markers
+ t_atom x_mdata[3]; // marker data ( list )
+
} t_pdp_artkp;
+static void pdp_artkp_init(t_pdp_artkp *x)
+{
+ if( (x->x_width>1024) || (x->x_height>1024) )
+ {
+ post( "pdp_artkp : warning : detection might not work well with resolution > 1024");
+ }
+
+ x->x_tracker = new ARToolKitPlus::TrackerMultiMarkerImpl<6,6,6, 1, 16>(x->x_width, x->x_height);
+
+ if( !x->x_tracker )
+ {
+ post( "pdp_artkp : FATAL... could not allocate tracker");
+ exit(-1);
+ }
+
+ x->x_logger = new PdLogger;
+ if( !x->x_logger )
+ {
+ post( "pdp_artkp : FATAL... could not allocate logger");
+ exit(-1);
+ }
+ else
+ {
+ x->x_tracker->setLogger(x->x_logger);
+ }
+
+ // setting pixel format
+ x->x_tracker->setPixelFormat(ARToolKitPlus::PIXEL_FORMAT_RGB);
+
+ if(!x->x_tracker->init("/usr/share/ARToolKitPlus/camera.dat", "/usr/share/ARToolKitPlus/markerboard_480-499.cfg", 1.0f, 1000.0f))
+ {
+ post( "pdp_artkp : FATAL... ARToolKitPlus init() failed.");
+ post( "pdp_artkp : did you install artkp data files in /usr/share/ARToolKitPlus ?");
+ exit(-1);
+ }
+
+ // the marker in the BCH test image has a thiner border...
+ x->x_tracker->setBorderWidth(0.125f);
+
+ // activate automatic thresholding
+ x->x_tracker->activateAutoThreshold(true);
+ // let's use lookup-table undistortion for high-speed
+ // note: LUT only works with images up to 1024x1024
+ x->x_tracker->setUndistortionMode(ARToolKitPlus::UNDIST_LUT);
+
+ // RPP is more robust than ARToolKit's standard pose estimator
+ x->x_tracker->setPoseEstimator(ARToolKitPlus::POSE_ESTIMATOR_RPP);
+
+ // switch to simple ID based markers
+ // use the tool in tools/IdPatGen to generate markers
+ x->x_tracker->setMarkerMode(ARToolKitPlus::MARKER_ID_SIMPLE);
+
+}
static void pdp_artkp_process_rgb(t_pdp_artkp *x)
{
- t_pdp *header = pdp_packet_header(x->x_packet0);
- short int *data = (short int *)pdp_packet_data(x->x_packet0);
- t_pdp *newheader = pdp_packet_header(x->x_packet1);
- short int *newdata = (short int *)pdp_packet_data(x->x_packet1);
- int i;
+ t_pdp *header = pdp_packet_header(x->x_packet0);
+ unsigned char *data = (unsigned char *)pdp_packet_data(x->x_packet0);
+ t_pdp *newheader = pdp_packet_header(x->x_packet1);
+ unsigned char *newdata = (unsigned char *)pdp_packet_data(x->x_packet1);
+ int im;
+ int numDetected;
if ((x->x_width != (t_int)header->info.image.width) ||
(x->x_height != (t_int)header->info.image.height))
@@ -61,13 +133,34 @@ static void pdp_artkp_process_rgb(t_pdp_artkp *x)
x->x_width = header->info.image.width;
x->x_height = header->info.image.height;
x->x_size = x->x_width*x->x_height;
+
+ pdp_artkp_init(x);
}
newheader->info.image.encoding = header->info.image.encoding;
newheader->info.image.width = x->x_width;
newheader->info.image.height = x->x_height;
+ numDetected = x->x_tracker->calc((unsigned char*)data);
+ if ( numDetected != x->x_nummarkers )
+ {
+ x->x_nummarkers = numDetected;
+ outlet_float( x->x_outlet2, x->x_nummarkers );
+ }
+
+ for (im=0; im<numDetected; im++)
+ {
+ ARToolKitPlus::ARMarkerInfo marker = x->x_tracker->getDetectedMarker(im);
+
+ SETFLOAT(&x->x_mdata[0], marker.id);
+ SETFLOAT(&x->x_mdata[1], marker.pos[0]);
+ SETFLOAT(&x->x_mdata[2], marker.pos[1]);
+ outlet_list( x->x_outlet1, 0, 3, x->x_mdata );
+
+ }
+
memcpy( newdata, data, x->x_size*3 );
+
return;
}
@@ -140,6 +233,8 @@ void *pdp_artkp_new(t_floatarg f)
t_pdp_artkp *x = (t_pdp_artkp *)pd_new(pdp_artkp_class);
x->x_outlet0 = outlet_new(&x->x_obj, &s_anything);
+ x->x_outlet1 = outlet_new(&x->x_obj, &s_anything);
+ x->x_outlet2 = outlet_new(&x->x_obj, &s_anything);
x->x_packet0 = -1;
x->x_packet1 = -1;
@@ -149,6 +244,10 @@ void *pdp_artkp_new(t_floatarg f)
x->x_height = 240;
x->x_size = x->x_width * x->x_height;
+ // init the ARToolKitPlus tracker
+ pdp_artkp_init(x);
+ x->x_nummarkers = 0;
+
return (void *)x;
}