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; }
// 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); }
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; }