Exemple #1
0
bool ofxArtool5::initNFT(ARParamLT * cparamLT, AR_PIXEL_FORMAT pixFormat){
    kpmHandle = kpmCreateHandle(cparamLT, pixFormat);
    if (!kpmHandle) {
        ofLogError("ofxArtool5::initNFT","kpmCreateHandle");
        return false;
    }
    
    if((ar2Handle = ar2CreateHandle(cparamLT, pixFormat, AR2_TRACKING_DEFAULT_THREAD_NUM))==NULL){
        ofLogError("ofxArtool5::initNFT","ar2CreateHandle");
        kpmDeleteHandle(&kpmHandle);
        return false;
    }
    
    if(threadGetCPU()<=1){
        ofLogWarning("ofxArtool5::initNFT","Using NFT settings for a single CPU");
        ar2SetTrackingThresh(ar2Handle, 5.0);
        ar2SetSimThresh(ar2Handle, 0.50);
        ar2SetSearchFeatureNum(ar2Handle, 16);
        ar2SetSearchSize(ar2Handle, 6);
        ar2SetTemplateSize1(ar2Handle, 6);
        ar2SetTemplateSize2(ar2Handle, 6);
    }else{
        cout<<"ofxArtool5::initNFT: Using NFT settings for multi CPU"<<endl;
        ar2SetTrackingThresh(ar2Handle, 5.0);
        ar2SetSimThresh(ar2Handle, 0.50);
        ar2SetSearchFeatureNum(ar2Handle, 16);
        ar2SetSearchSize(ar2Handle, 12);
        ar2SetTemplateSize1(ar2Handle, 6);
        ar2SetTemplateSize2(ar2Handle, 6);
    }
    
    return true;
}
Exemple #2
0
// Modifies globals: kpmHandle, ar2Handle.
static int initNFT(ARParamLT *cparamLT, AR_PIXEL_FORMAT pixFormat)
{
#ifdef DEBUG
    LOGE("Initialising NFT.\n");
#endif
    //
    // NFT init.
    //
    
    // KPM init.
    kpmHandle = kpmCreateHandle(cparamLT, pixFormat);
    if (!kpmHandle) {
        LOGE("Error: kpmCreatHandle.\n");
        return (false);
    }
    //kpmSetProcMode( kpmHandle, KpmProcHalfSize );
    
    // AR2 init.
    if( (ar2Handle = ar2CreateHandle(cparamLT, pixFormat, AR2_TRACKING_DEFAULT_THREAD_NUM)) == NULL ) {
        LOGE("Error: ar2CreateHandle.\n");
        kpmDeleteHandle(&kpmHandle);
        return (false);
    }
    if (threadGetCPU() <= 1) {
#ifdef DEBUG
        LOGE("Using NFT tracking settings for a single CPU.\n");
#endif
        ar2SetTrackingThresh( ar2Handle, 5.0 );
        ar2SetSimThresh( ar2Handle, 0.50 );
        ar2SetSearchFeatureNum(ar2Handle, 16);
        ar2SetSearchSize(ar2Handle, 6);
        ar2SetTemplateSize1(ar2Handle, 6);
        ar2SetTemplateSize2(ar2Handle, 6);
    } else {
#ifdef DEBUG
        LOGE("Using NFT tracking settings for more than one CPU.\n");
#endif
        ar2SetTrackingThresh( ar2Handle, 5.0 );
        ar2SetSimThresh( ar2Handle, 0.50 );
        ar2SetSearchFeatureNum(ar2Handle, 16);
        ar2SetSearchSize(ar2Handle, 12);
        ar2SetTemplateSize1(ar2Handle, 6);
        ar2SetTemplateSize2(ar2Handle, 6);
    }
    // NFT dataset loading will happen later.
#ifdef DEBUG
    LOGE("NFT initialised OK.\n");
#endif
    return (true);
}
Exemple #3
0
int surfSubGetDescriptors( SurfSubIPointArrayT *iPointArray, int *image, int width, int height, int border, int maxNum, int threadNum )
{
#if 1
    int  k = 0;
    for(int i = 0; i < iPointArray->num; i++) {
        int     x, y, s;
        x = (int)(iPointArray->iPoint[i].x+0.5);
        y = (int)(iPointArray->iPoint[i].y+0.5);
        s = (int)(iPointArray->iPoint[i].scale+0.5);
        if( x-s*20 < 0 || y-s*20 < 0 || x+s*20 >= width || y+s*20 >= height ) {
            continue;
        }
        if( i != k ) {
            iPointArray->iPoint[k] = iPointArray->iPoint[i];
        }
        k++;
    }
    iPointArray->num = k;
    if( iPointArray->num == 0 ) return 0;
#endif

    if( maxNum > 0 ) {
        if( iPointArray->num > maxNum ) {
            qsort( iPointArray->iPoint, iPointArray->num, sizeof(SurfSubIPointT), compSurfP );
            iPointArray->num = maxNum;
        }
    }

    static int                          initF = 0;
    static int                          threadMax;
    static THREAD_HANDLE_T            **threadHandle;
    static SurfSubGetDescriptorsParam  *arg;
    if( initF == 0 ) {
        threadMax = threadGetCPU();
        threadHandle = (THREAD_HANDLE_T **)malloc(sizeof(THREAD_HANDLE_T*)*threadMax);
        if( threadHandle == NULL ) {ARLOGe("Malloc error: surfSubGetDescriptors.\n"); exit(0);}
        arg = (SurfSubGetDescriptorsParam *)malloc(sizeof(SurfSubGetDescriptorsParam)*threadMax);
        if( arg == NULL ) {ARLOGe("Malloc error: surfSubGetDescriptors.\n"); exit(0);}
        for(int i = 0; i < threadMax; i++ ) {
            threadHandle[i] = threadInit(i, &(arg[i]), surfSubGetDescriptorsSub);
        }
        initF = 1;
    }

    if( threadNum < 0 ) threadNum = threadMax;
    if( threadNum > threadMax ) threadNum = threadMax;
    char *flag = (char *)malloc(iPointArray->num);
    int i = iPointArray->num/threadNum;
    int j = iPointArray->num%threadNum;
    k = 0;
    for(int l = 0; l < j; l++ ) {
        arg[l].iPoint       = iPointArray->iPoint;
        arg[l].flag         = flag;
        arg[l].image        = image;
        arg[l].width        = width;
        arg[l].height       = height;
        arg[l].border       = border;
        arg[l].startNum     = k;
        arg[l].endNum       = k + i;
        threadStartSignal( threadHandle[l] );
        k += (i+1);
    }
    for(int l = j; l < threadNum; l++ ) {
        arg[l].iPoint       = iPointArray->iPoint;
        arg[l].flag         = flag;
        arg[l].image        = image;
        arg[l].width        = width;
        arg[l].height       = height;
        arg[l].border       = border;
        arg[l].startNum     = k;
        arg[l].endNum       = k + i - 1;
        threadStartSignal( threadHandle[l] );
        k += i;
    }
    
    for(int l = 0; l < threadNum; l++ ) {
        threadEndWait( threadHandle[l] );
    }
    
    k = 0;
    for(int i = 0; i < iPointArray->num; i++) {
        if( flag[i] == 0 ) continue;
        if( i != k ) {
            iPointArray->iPoint[k] = iPointArray->iPoint[i];
        }
        k++;
    }
    iPointArray->num = k;
    free(flag);
    
    /*
     for(int i = 0; i < iPointArray->num; i++) {
     if( getOrientation(&(iPointArray->iPoint[i]), image, width, height, border) < 0 ) {
     for( int j = i+1; j < iPointArray->num; j++ ) iPointArray->iPoint[j-1] = iPointArray->iPoint[j];
     iPointArray->num--;
     i--;
     continue;
     }
     
     if( getDescriptor(&(iPointArray->iPoint[i]), image, width, height, border) < 0 ) {
     for( int j = i+1; j < iPointArray->num; j++ ) iPointArray->iPoint[j-1] = iPointArray->iPoint[j];
     iPointArray->num--;
     i--;
     continue;
     }
     }
     */

    return 0;
}