8
8
#include < vector>
9
9
#include < unordered_map>
10
10
#include < AR/config.h>
11
+ #include < AR/arFilterTransMat.h>
12
+ #include < AR2/tracking.h>
13
+ #include < KPM/kpm.h>
11
14
12
15
struct multi_marker {
13
16
int id;
@@ -31,6 +34,12 @@ struct arController {
31
34
ARMultiMarkerInfoT *arMultiMarkerHandle = NULL ;
32
35
AR3DHandle* ar3DHandle;
33
36
37
+ KpmHandle* kpmHandle;
38
+ AR2HandleT* ar2Handle;
39
+
40
+ int surfaceSetCount = 0 ; // Running NFT marker id
41
+ std::unordered_map<int , AR2SurfaceSetT*> surfaceSets;
42
+
34
43
ARdouble nearPlane = 0.0001 ;
35
44
ARdouble farPlane = 1000.0 ;
36
45
@@ -63,6 +72,212 @@ static ARMarkerInfo gMarkerInfo;
63
72
64
73
extern " C" {
65
74
75
+ /* *
76
+ NFT API bindings
77
+ */
78
+
79
+ int getNFTMarkerInfo (int id, int markerIndex) {
80
+ if (arControllers.find (id) == arControllers.end ()) { return ARCONTROLLER_NOT_FOUND; }
81
+ arController *arc = &(arControllers[id]);
82
+
83
+ if (arc->surfaceSetCount <= markerIndex) {
84
+ return MARKER_INDEX_OUT_OF_BOUNDS;
85
+ }
86
+
87
+ KpmResult *kpmResult = NULL ;
88
+ int kpmResultNum = -1 ;
89
+
90
+ kpmGetResult ( arc->kpmHandle , &kpmResult, &kpmResultNum );
91
+
92
+ int i, j, k;
93
+ int flag = -1 ;
94
+ float err = -1 ;
95
+ float trans[3 ][4 ];
96
+ for ( i = 0 ; i < kpmResultNum; i++ ) {
97
+ if (kpmResult[i].pageNo == markerIndex && kpmResult[i].camPoseF == 0 ) {
98
+ if ( flag == -1 || err > kpmResult[i].error ) { // Take the first or best result.
99
+ flag = i;
100
+ err = kpmResult[i].error ;
101
+ }
102
+ }
103
+ }
104
+
105
+ if (flag > -1 ) {
106
+ for (j = 0 ; j < 3 ; j++) {
107
+ for (k = 0 ; k < 4 ; k++) {
108
+ trans[j][k] = kpmResult[flag].camPose [j][k];
109
+ }
110
+ }
111
+ EM_ASM_ ({
112
+ var $a = arguments;
113
+ var i = 0 ;
114
+ if (!artoolkit[" NFTMarkerInfo" ]) {
115
+ artoolkit[" NFTMarkerInfo" ] = ({
116
+ id: 0 ,
117
+ error: -1 ,
118
+ found: 0 ,
119
+ pose: [0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ]
120
+ });
121
+ }
122
+ var markerInfo = artoolkit[" NFTMarkerInfo" ];
123
+ markerInfo[" id" ] = $a[i++];
124
+ markerInfo[" error" ] = $a[i++];
125
+ markerInfo[" found" ] = 1 ;
126
+ markerInfo[" pose" ][0 ] = $a[i++];
127
+ markerInfo[" pose" ][1 ] = $a[i++];
128
+ markerInfo[" pose" ][2 ] = $a[i++];
129
+ markerInfo[" pose" ][3 ] = $a[i++];
130
+ markerInfo[" pose" ][4 ] = $a[i++];
131
+ markerInfo[" pose" ][5 ] = $a[i++];
132
+ markerInfo[" pose" ][6 ] = $a[i++];
133
+ markerInfo[" pose" ][7 ] = $a[i++];
134
+ markerInfo[" pose" ][8 ] = $a[i++];
135
+ markerInfo[" pose" ][9 ] = $a[i++];
136
+ markerInfo[" pose" ][10 ] = $a[i++];
137
+ markerInfo[" pose" ][11 ] = $a[i++];
138
+ },
139
+ markerIndex,
140
+ err,
141
+
142
+ trans[0 ][0 ],
143
+ trans[0 ][1 ],
144
+ trans[0 ][2 ],
145
+ trans[0 ][3 ],
146
+
147
+ trans[1 ][0 ],
148
+ trans[1 ][1 ],
149
+ trans[1 ][2 ],
150
+ trans[1 ][3 ],
151
+
152
+ trans[2 ][0 ],
153
+ trans[2 ][1 ],
154
+ trans[2 ][2 ],
155
+ trans[2 ][3 ]
156
+ );
157
+ } else {
158
+ EM_ASM_ ({
159
+ var $a = arguments;
160
+ var i = 0 ;
161
+ if (!artoolkit[" NFTMarkerInfo" ]) {
162
+ artoolkit[" NFTMarkerInfo" ] = ({
163
+ id: 0 ,
164
+ error: -1 ,
165
+ found: 0 ,
166
+ pose: [0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 , 0 ,0 ,0 ,0 ]
167
+ });
168
+ }
169
+ var markerInfo = artoolkit[" NFTMarkerInfo" ];
170
+ markerInfo[" id" ] = $a[i++];
171
+ markerInfo[" error" ] = -1 ;
172
+ markerInfo[" found" ] = 0 ;
173
+ markerInfo[" pose" ][0 ] = 0 ;
174
+ markerInfo[" pose" ][1 ] = 0 ;
175
+ markerInfo[" pose" ][2 ] = 0 ;
176
+ markerInfo[" pose" ][3 ] = 0 ;
177
+ markerInfo[" pose" ][4 ] = 0 ;
178
+ markerInfo[" pose" ][5 ] = 0 ;
179
+ markerInfo[" pose" ][6 ] = 0 ;
180
+ markerInfo[" pose" ][7 ] = 0 ;
181
+ markerInfo[" pose" ][8 ] = 0 ;
182
+ markerInfo[" pose" ][9 ] = 0 ;
183
+ markerInfo[" pose" ][10 ] = 0 ;
184
+ markerInfo[" pose" ][11 ] = 0 ;
185
+ },
186
+ markerIndex
187
+ );
188
+ }
189
+
190
+ return 0 ;
191
+ }
192
+
193
+ int detectNFTMarker (int id) {
194
+ if (arControllers.find (id) == arControllers.end ()) { return -1 ; }
195
+ arController *arc = &(arControllers[id]);
196
+
197
+ KpmResult *kpmResult = NULL ;
198
+ int kpmResultNum = -1 ;
199
+
200
+ kpmMatching ( arc->kpmHandle , arc->videoFrame );
201
+ kpmGetResult ( arc->kpmHandle , &kpmResult, &kpmResultNum );
202
+ return kpmResultNum;
203
+ }
204
+
205
+ KpmHandle *createKpmHandle (ARParamLT *cparamLT) {
206
+ KpmHandle *kpmHandle;
207
+ kpmHandle = kpmCreateHandle (cparamLT, AR_PIXEL_FORMAT_RGBA);
208
+ return kpmHandle;
209
+ }
210
+
211
+ int getKpmImageWidth (KpmHandle *kpmHandle) {
212
+ return kpmHandleGetXSize (kpmHandle);
213
+ }
214
+
215
+ int getKpmImageHeight (KpmHandle *kpmHandle) {
216
+ return kpmHandleGetYSize (kpmHandle);
217
+ }
218
+
219
+ int getKpmPixelSize (KpmHandle *kpmHandle) {
220
+ return arUtilGetPixelSize (kpmHandleGetPixelFormat (kpmHandle));
221
+ }
222
+
223
+ int setupAR2 (int id) {
224
+ if (arControllers.find (id) == arControllers.end ()) { return -1 ; }
225
+ arController *arc = &(arControllers[id]);
226
+
227
+ arc->kpmHandle = createKpmHandle (arc->paramLT );
228
+
229
+ return 0 ;
230
+ }
231
+
232
+ int loadNFTMarker (arController *arc, int surfaceSetCount, const char * datasetPathname) {
233
+ int i, pageNo;
234
+ AR2SurfaceSetT *surfaceSet;
235
+ KpmRefDataSet *refDataSet;
236
+
237
+ KpmHandle *kpmHandle = arc->kpmHandle ;
238
+
239
+ refDataSet = NULL ;
240
+
241
+ // Load KPM data.
242
+ KpmRefDataSet *refDataSet2;
243
+ ARLOGi (" Reading %s.fset3\n " , datasetPathname);
244
+ if (kpmLoadRefDataSet (datasetPathname, " fset3" , &refDataSet2) < 0 ) {
245
+ ARLOGe (" Error reading KPM data from %s.fset3\n " , datasetPathname);
246
+ pageNo = -1 ;
247
+ return (FALSE );
248
+ }
249
+ pageNo = surfaceSetCount;
250
+ ARLOGi (" Assigned page no. %d.\n " , surfaceSetCount);
251
+ if (kpmChangePageNoOfRefDataSet (refDataSet2, KpmChangePageNoAllPages, surfaceSetCount) < 0 ) {
252
+ ARLOGe (" Error: kpmChangePageNoOfRefDataSet\n " );
253
+ return (FALSE );
254
+ }
255
+ if (kpmMergeRefDataSet (&refDataSet, &refDataSet2) < 0 ) {
256
+ ARLOGe (" Error: kpmMergeRefDataSet\n " );
257
+ return (FALSE );
258
+ }
259
+ ARLOGi (" Done.\n " );
260
+
261
+ // Load AR2 data.
262
+ ARLOGi (" Reading %s.fset\n " , datasetPathname);
263
+
264
+ if ((surfaceSet = ar2ReadSurfaceSet (datasetPathname, " fset" , NULL )) == NULL ) {
265
+ ARLOGe (" Error reading data from %s.fset\n " , datasetPathname);
266
+ }
267
+ ARLOGi (" Done.\n " );
268
+
269
+ arc->surfaceSets [surfaceSetCount] = surfaceSet;
270
+
271
+ if (kpmSetRefDataSet (kpmHandle, refDataSet) < 0 ) {
272
+ ARLOGe (" Error: kpmSetRefDataSet\n " );
273
+ return (FALSE );
274
+ }
275
+ kpmDeleteRefDataSet (&refDataSet);
276
+
277
+ ARLOGi (" Loading of NFT data complete.\n " );
278
+ return (TRUE );
279
+ }
280
+
66
281
/* **************
67
282
* Set Log Level
68
283
****************/
@@ -186,6 +401,8 @@ extern "C" {
186
401
187
402
arglCameraFrustum (&((arc->paramLT )->param ), arc->nearPlane , arc->farPlane , arc->cameraLens );
188
403
404
+ arc->kpmHandle = createKpmHandle (arc->paramLT );
405
+
189
406
return 0 ;
190
407
}
191
408
@@ -240,6 +457,22 @@ extern "C" {
240
457
return arc->patt_id ;
241
458
}
242
459
460
+ int addNFTMarker (int id, std::string datasetPathname) {
461
+ if (arControllers.find (id) == arControllers.end ()) { return -1 ; }
462
+ arController *arc = &(arControllers[id]);
463
+
464
+ // Load marker(s).
465
+ int patt_id = arc->surfaceSetCount ;
466
+ if (!loadNFTMarker (arc, patt_id, datasetPathname.c_str ())) {
467
+ ARLOGe (" ARToolKitJS(): Unable to set up NFT marker.\n " );
468
+ return -1 ;
469
+ }
470
+
471
+ arc->surfaceSetCount ++;
472
+
473
+ return patt_id;
474
+ }
475
+
243
476
int addMultiMarker (int id, std::string patt_name) {
244
477
if (arControllers.find (id) == arControllers.end ()) { return -1 ; }
245
478
arController *arc = &(arControllers[id]);
0 commit comments