static void *surfSubGetDescriptorsSub( THREAD_HANDLE_T *threadHandle ) { SurfSubGetDescriptorsParam *arg; int startNum; int endNum; int i; arg = (SurfSubGetDescriptorsParam *)threadGetArg(threadHandle); for(;;) { if( threadStartWait(threadHandle) < 0 ) break; startNum = arg->startNum; endNum = arg->endNum; for( i = startNum; i <= endNum; i++ ) { if( getOrientation(&(arg->iPoint[i]), arg->image, arg->width, arg->height, arg->border) < 0 ) { arg->flag[i] = 0; continue; } if( getDescriptor(&(arg->iPoint[i]), arg->image, arg->width, arg->height, arg->border) < 0 ) { arg->flag[i] = 0; continue; } arg->flag[i] = 1; } threadEndSignal(threadHandle); } return NULL; }
void *ar2Tracking2d( THREAD_HANDLE_T *threadHandle ) { AR2Tracking2DParamT *arg; int ID; arg = (AR2Tracking2DParamT *)threadGetArg(threadHandle); ID = threadGetID(threadHandle); ARLOGi("Start tracking_thread #%d.\n", ID); for(;;) { if( threadStartWait(threadHandle) < 0 ) break; #if AR2_CAPABLE_ADAPTIVE_TEMPLATE arg->ret = ar2Tracking2dSub( arg->ar2Handle, arg->surfaceSet, arg->candidate, arg->dataPtr, arg->mfImage, &(arg->templ), &(arg->templ2), &(arg->result) ); #else arg->ret = ar2Tracking2dSub( arg->ar2Handle, arg->surfaceSet, arg->candidate, arg->dataPtr, arg->mfImage, &(arg->templ), &(arg->result) ); #endif threadEndSignal(threadHandle); } ARLOGi("End tracking_thread #%d.\n", ID); return NULL; }
static void *trackingInitMain( THREAD_HANDLE_T *threadHandle ) { TrackingInitHandle *trackingInitHandle; KpmHandle *kpmHandle; KpmResult *kpmResult = NULL; int kpmResultNum; ARUint8 *imagePtr; float err; int i, j, k; if (!threadHandle) { ARLOGe("Error starting tracking thread: empty THREAD_HANDLE_T.\n"); return (NULL); } trackingInitHandle = (TrackingInitHandle *)threadGetArg(threadHandle); if (!threadHandle) { ARLOGe("Error starting tracking thread: empty trackingInitHandle.\n"); return (NULL); } kpmHandle = trackingInitHandle->kpmHandle; imagePtr = trackingInitHandle->imagePtr; if (!kpmHandle || !imagePtr) { ARLOGe("Error starting tracking thread: empty kpmHandle/imagePtr.\n"); return (NULL); } ARLOGi("Start tracking thread.\n"); kpmGetResult( kpmHandle, &kpmResult, &kpmResultNum ); for(;;) { if( threadStartWait(threadHandle) < 0 ) break; kpmMatching(kpmHandle, imagePtr); trackingInitHandle->flag = 0; for( i = 0; i < kpmResultNum; i++ ) { if( kpmResult[i].camPoseF != 0 ) continue; ARLOGd("kpmGetPose OK.\n"); if( trackingInitHandle->flag == 0 || err > kpmResult[i].error ) { // Take the first or best result. trackingInitHandle->flag = 1; trackingInitHandle->page = kpmResult[i].pageNo; for (j = 0; j < 3; j++) for (k = 0; k < 4; k++) trackingInitHandle->trans[j][k] = kpmResult[i].camPose[j][k]; err = kpmResult[i].error; } } threadEndSignal(threadHandle); } ARLOGi("End tracking thread.\n"); return (NULL); }
// References globals: markersNFTCount // Modifies globals: trackingThreadHandle, surfaceSet[], surfaceSetCount, markersNFT[], markersNFTCount static void *loadNFTDataAsync(THREAD_HANDLE_T *threadHandle) { int i, j; KpmRefDataSet *refDataSet; while (threadStartWait(threadHandle) == 0) { #ifdef DEBUG LOGE("Loading NFT data.\n"); #endif // If data was already loaded, stop KPM tracking thread and unload previously loaded data. if (trackingThreadHandle) { LOGE("NFT2 tracking thread is running. Stopping it first.\n"); trackingInitQuit(&trackingThreadHandle); detectedPage = -2; } j = 0; for (i = 0; i < surfaceSetCount; i++) { if (j == 0) LOGE("Unloading NFT tracking surfaces."); ar2FreeSurfaceSet(&surfaceSet[i]); // Also sets surfaceSet[i] to NULL. j++; } if (j > 0) LOGE("Unloaded %d NFT tracking surfaces.\n", j); surfaceSetCount = 0; refDataSet = NULL; for (i = 0; i < markersNFTCount; i++) { // Load KPM data. KpmRefDataSet *refDataSet2; LOGI("Reading %s.fset3\n", markersNFT[i].datasetPathname); if (kpmLoadRefDataSet(markersNFT[i].datasetPathname, "fset3", &refDataSet2) < 0 ) { LOGE("Error reading KPM data from %s.fset3\n", markersNFT[i].datasetPathname); markersNFT[i].pageNo = -1; continue; } markersNFT[i].pageNo = surfaceSetCount; LOGI(" Assigned page no. %d.\n", surfaceSetCount); if (kpmChangePageNoOfRefDataSet(refDataSet2, KpmChangePageNoAllPages, surfaceSetCount) < 0) { LOGE("Error: kpmChangePageNoOfRefDataSet\n"); exit(-1); } if (kpmMergeRefDataSet(&refDataSet, &refDataSet2) < 0) { LOGE("Error: kpmMergeRefDataSet\n"); exit(-1); } LOGI(" Done.\n"); // Load AR2 data. LOGI("Reading %s.fset\n", markersNFT[i].datasetPathname); if ((surfaceSet[surfaceSetCount] = ar2ReadSurfaceSet(markersNFT[i].datasetPathname, "fset", NULL)) == NULL ) { LOGE("Error reading data from %s.fset\n", markersNFT[i].datasetPathname); } LOGI(" Done.\n"); surfaceSetCount++; if (surfaceSetCount == PAGES_MAX) break; } if (kpmSetRefDataSet(kpmHandle, refDataSet) < 0) { LOGE("Error: kpmSetRefDataSet"); exit(-1); } kpmDeleteRefDataSet(&refDataSet); // Start the KPM tracking thread. trackingThreadHandle = trackingInitInit(kpmHandle); if (!trackingThreadHandle) exit(-1); #ifdef DEBUG LOGI("Loading of NFT data complete."); #endif threadEndSignal(threadHandle); // Signal that we're done. } return (NULL); // Exit this thread. }