示例#1
0
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;
}
示例#2
0
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;
}
示例#3
0
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);
}
示例#4
0
// 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.
}