// the function draws all the squares in the image 
void drawSquares( IplImage* img, CvSeq* squares ) {  
	CvSeqReader reader; 
	IplImage* cpy = cvCloneImage( img );
	int i;  
	// initialize reader of the sequence 
	cvStartReadSeq( squares, &reader, 0 );
	// read 4 sequence elements at a time (all vertices of a square)  
	for( i = 0; i < squares->total; i += 4 ){  
		CvPoint* rect = pt;
		int count = 4; 
		// read 4 vertices  
		memcpy( pt, reader.ptr, squares->elem_size );
		CV_NEXT_SEQ_ELEM( squares->elem_size, reader ); 
		memcpy( pt + 1, reader.ptr, squares->elem_size );  
		CV_NEXT_SEQ_ELEM( squares->elem_size, reader );
		memcpy( pt + 2, reader.ptr, squares->elem_size );
		CV_NEXT_SEQ_ELEM( squares->elem_size, reader );  
		memcpy( pt + 3, reader.ptr, squares->elem_size ); 
		CV_NEXT_SEQ_ELEM( squares->elem_size, reader ); 
		// draw the square as a closed polyline 
		cvPolyLine( cpy, &rect, &count, 1, 1, CV_RGB(0,255,0), 3, CV_AA, 0 );
		if(i == 0){
			sort_vertex(rect);    //get the four vertex and sort them
			break;
		}
	}  
	// show the resultant image  
	cvShowImage( wndname, cpy );
	cvReleaseImage( &cpy ); 
} 
Esempio n. 2
0
vector<int> slashBurn(Graph &graph, int K)
{
	//printGraph(graph);
    int p = 0, q = (int)graph.size() - 1;
    vector<int> weightsum(q + 1, 0);
    vector<int> idX(q + 1, 0), xId(q + 1, 0);
    for(int i = 0; i < q + 1; i++){
        idX[i] = xId[i] = i;
    }
    calcWeightSum(weightsum, graph);
    while(q - p + 1 > K){
		if(TKDE){
        /* TKDE: select topK in greedy way */
			for(int i = 0; i < K; i++, p++){
				int maxloc = select_biggest(weightsum, xId, p, q);
				remove_vertex_from_graph(graph, xId[maxloc], weightsum);
				iter_swap(idX.begin() + xId[p], idX.begin() + xId[maxloc]);
				iter_swap(xId.begin() + maxloc, xId.begin() + p);
			}
		}
		else{
		/* ICDM: select topK directly */
			vector<int> maxloc = select_topk(weightsum, xId, p, q, K);
			for(vector<int>::iterator it = maxloc.begin(); it != maxloc.end(); ++it, p++){
				remove_vertex_from_graph(graph, xId[*it], weightsum);
				iter_swap(idX.begin() + xId[p], idX.begin() + xId[*it]);
				iter_swap(xId.begin() + *it, xId.begin() + p);
			}
		}
		//Map or vector, trade-off between space and time
        vector<int> vertexCC(graph.size(), 0);
        vector<pair<int, int> > ccMetric(graph.size());
        find_cc(graph, p, q, xId, idX, vertexCC, ccMetric);
        vector<int> newx2X;
        int Q = sort_vertex(newx2X, vertexCC, ccMetric);
        if(Q == -1){
            break;
        }
        for(int i = Q; i < (int)newx2X.size(); i++){
            remove_vertex_from_graph(graph, xId[newx2X[i]], weightsum);
        }
        shuffle_vertex(newx2X, xId, idX, p);
        q = p + Q - 1;
    }
    return idX;
}