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