Пример #1
0
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;
}