keyword_t findkeyword(const char *s) { const char **sp; keyword_t ret; if (!_strcmpl(s, "describe")) return K_DISPLAY; ret = searchDirections(s); if (ret != -1) { return ret; } sp = (const char **)bsearch(&s, keywords, MAXKEYWORDS, sizeof s, strpcmp); if (sp == 0) return -1; return sp - keywords; }
vector<chain_code*> extractChainCodesLevel(const Mat& src,int level){ vector<chain_code*> chainCodes; Mat I; threshold(src, I, THRESHOLDVALUE, 255, CV_THRESH_BINARY); Mat PNH=Mat(3,3, CV_8UC(1),Scalar(BACKGROUND)); chain_segment* actchain_ptr=NULL; bool actchain_isLeft=true; node* frame=new node(NULL,NULL,NULL,"frame"); node* CurrentHole=frame; node* CurrentObject=NULL; int isMinPoint = 0; int currentCoordinateI; int currentCoordinateJ; vector<coordinates*> savedCoordinates; if(level==-1) level=INT_MAX; for (int i=0; i<I.rows; i++) { for (int j=0; j<I.cols; j++) { currentCoordinateI=i; currentCoordinateJ=j; for( int di = 0; di < 3; di++) { for(int dj = 0; dj < 3; dj ++ ) { PNH.at<uchar>(di, dj) = getPixel(I, i + di - 1, j + dj - 1); } } if (!isInvalid(PNH)) { if(getPixel(PNH, 1, 1)==BACKGROUND) continue; if(isMin0(PNH)&&isMax0(PNH)){ chain_code* ch=new chain_code(i,j); chainCodes.push_back(ch); continue; } searchDirections(PNH,actchain_isLeft,actchain_ptr,CurrentHole,CurrentObject,isMinPoint); searchMinPoints(PNH,actchain_isLeft,actchain_ptr,CurrentHole,CurrentObject,isMinPoint,currentCoordinateI,currentCoordinateJ,savedCoordinates); searchMaxPoints(PNH,actchain_isLeft,actchain_ptr,CurrentHole,CurrentObject,currentCoordinateI,currentCoordinateJ); } } } int parentSize=1, childSize=0,le=0; node * temp; queue<node *> q; q.push(frame); do { temp = q.front(); if(temp!=frame&&temp->coord!=NULL){ coordinates* c = temp->coord; chain_code* newChain=new chain_code(c->x,c->y); chain_segment* moveChain; if(c->typeMin) moveChain=c->whichNode->right; else moveChain=c->whichNode->left; chain_segment* copyFirst=moveChain; while(true){ vector<int>& vecs=moveChain->chainCodes->nodes; if(moveChain->isLeft) reverse(vecs.begin(), vecs.end()); for (int m=0; m<vecs.size(); m++) { newChain->nodes.push_back(vecs[m]); } chain_segment* tobeDeleted = moveChain; moveChain=moveChain->connectNext; delete tobeDeleted->chainCodes; delete tobeDeleted; if(moveChain==copyFirst) break; } delete c; chainCodes.push_back(newChain); } q.pop(); for(int i=0; i<temp->children.size(); i++){ if(temp->children[i]) q.push(temp->children[i]); childSize ++; } delete temp; parentSize--; if(parentSize == 0){ parentSize = childSize; childSize = 0; le++; } } while(!q.empty()&&le<level); return chainCodes; }
vector<chain_code*> extractChainCodes(const Mat& src){ vector<chain_code*> chainCodes; Mat I; threshold(src, I, THRESHOLDVALUE, 255, CV_THRESH_BINARY); Mat PNH=Mat(3,3, CV_8UC(1),Scalar(BACKGROUND)); chain_segment* actchain_ptr=NULL; bool actchain_isLeft=true; node* frame=new node(NULL,NULL,NULL,"frame"); node* CurrentHole=frame; node* CurrentObject=NULL; int isMinPoint=0; int currentCoordinateI; int currentCoordinateJ; vector<coordinates*> savedCoordinates; for (int i=0; i<I.rows; i++) { for (int j=0; j<I.cols; j++) { currentCoordinateI=i; currentCoordinateJ=j; for( int di = 0; di < 3; di++) { for(int dj = 0; dj < 3; dj ++ ) { PNH.at<uchar>(di, dj) = getPixel(I, i + di - 1, j + dj - 1); } } if (!isInvalid(PNH)) { if(getPixel(PNH, 1, 1)==BACKGROUND) continue; if(isMin0(PNH)&&isMax0(PNH)){ chain_code* ch=new chain_code(i,j); chainCodes.push_back(ch); continue; } searchDirections(PNH,actchain_isLeft,actchain_ptr,CurrentHole,CurrentObject,isMinPoint); searchMinPoints(PNH,actchain_isLeft,actchain_ptr,CurrentHole,CurrentObject,isMinPoint,currentCoordinateI,currentCoordinateJ,savedCoordinates); searchMaxPoints(PNH,actchain_isLeft,actchain_ptr,CurrentHole,CurrentObject,currentCoordinateI,currentCoordinateJ); } } } for(int n=0;n<savedCoordinates.size();n++){ coordinates* c = savedCoordinates[n]; chain_code* newChain=new chain_code(c->x,c->y); chain_segment* moveChain; if(c->typeMin) moveChain=c->whichNode->right; else moveChain=c->whichNode->left; chain_segment* copyFirst=moveChain; while(true){ vector<int>& vecs=moveChain->chainCodes->nodes; if(moveChain->isLeft) reverse(vecs.begin(), vecs.end()); for (int m=0; m<vecs.size(); m++) { newChain->nodes.push_back(vecs[m]); } chain_segment* tobeDeleted = moveChain; moveChain=moveChain->connectNext; delete tobeDeleted->chainCodes; delete tobeDeleted; if(moveChain==copyFirst) break; //if(moveChain==NULL) break; } delete c->whichNode; delete c; chainCodes.push_back(newChain); } delete frame; return chainCodes; }