void ScaledDetector::drawKeypoints() { if (nextScaleDetector != NULL) { nextScaleDetector->drawKeypoints(); } vector<cv::Point2f> keypoints; findKeypointsInCurrentScale(keypoints); vector<cv::Mat_<uchar> > tomerge(3); tomerge[0] = currentSkeleton.clone(); tomerge[1] = cv::Mat::zeros(currentSkeleton.rows, currentSkeleton.cols, CV_8U); tomerge[2] = cv::Mat::zeros(currentSkeleton.rows, currentSkeleton.cols, CV_8U); cv::Mat drawResult; cv::merge(tomerge,drawResult); for (int i = 0 ; i < keypoints.size() ; i++) { circle( drawResult, keypoints[i], 4, cv::Scalar( 0, 255, 0 ), -1, 8, 0 ); } imshow("result", drawResult); currentSkeleton = currentSkeleton/255; for (int i = 0 ; i < keypoints.size() ; i++) { cout<<keypoints[i]<<endl; currentSkeleton[(int)keypoints[i].y][(int)keypoints[i].x] = 8; } // cout<<currentSkeleton<<endl; cv::waitKey(-1); }
void SpParMat<IT,NT,DER>::Square () { int stages, dummy; // last two parameters of productgrid are ignored for synchronous multiplication shared_ptr<CommGrid> Grid = ProductGrid(commGrid.get(), commGrid.get(), stages, dummy, dummy); IT AA_m = spSeq->getnrow(); IT AA_n = spSeq->getncol(); DER seqTrn = spSeq->TransposeConst(); // will be automatically discarded after going out of scope Grid->GetWorld().Barrier(); IT ** NRecvSizes = SpHelper::allocate2D<IT>(DER::esscount, stages); IT ** TRecvSizes = SpHelper::allocate2D<IT>(DER::esscount, stages); SpParHelper::GetSetSizes( *spSeq, NRecvSizes, commGrid->GetRowWorld()); SpParHelper::GetSetSizes( seqTrn, TRecvSizes, commGrid->GetColWorld()); // Remotely fetched matrices are stored as pointers DER * NRecv; DER * TRecv; int levels = 0; int cstage = stages; while (cstage > 0) { cstage /= 2; levels++; } vector< vector< SpTuples<IT,NT> *> > tomerge(levels); vector< SpTuples<IT,NT> *> wholemerge; cout << "levels: " << levels << endl; int Nself = commGrid->GetRankInProcRow(); int Tself = commGrid->GetRankInProcCol(); for(int i = 0; i < stages; ++i) { vector<IT> ess; if(i == Nself) { NRecv = spSeq; // shallow-copy } else { ess.resize(DER::esscount); for(int j=0; j< DER::esscount; ++j) { ess[j] = NRecvSizes[j][i]; // essentials of the ith matrix in this row } NRecv = new DER(); // first, create the object } SpParHelper::BCastMatrix(Grid->GetRowWorld(), *NRecv, ess, i); // then, broadcast its elements ess.clear(); if(i == Tself) { TRecv = &seqTrn; // shallow-copy } else { ess.resize(DER::esscount); for(int j=0; j< DER::esscount; ++j) { ess[j] = TRecvSizes[j][i]; } TRecv = new DER(); } SpParHelper::BCastMatrix(Grid->GetColWorld(), *TRecv, ess, i); SpTuples<IT,NT> * AA_cont = MultiplyReturnTuples<SR>(*NRecv, *TRecv, false, true); if(!AA_cont->isZero()) tomerge[0].push_back(AA_cont); if(i != Nself) { delete NRecv; } if(i != Tself) { delete TRecv; } for(int lev=0; lev < (levels-1); lev++) { if(tomerge[lev].size() > 1) // i.e. it has 2 elements { assert((tomerge[lev].size() == 2)); ofstream oput; Grid->OpenDebugFile("shrink", oput); oput << "Shrinking from " << tomerge[lev][0]->getnnz() + tomerge[lev][1]->getnnz(); tomerge[lev+1].push_back( MergeAllRec<SR>(tomerge[lev], AA_m, AA_n) ); tomerge[lev].clear(); oput << " to " << tomerge[lev+1].back()->getnnz() << endl; } } } for(int lev=0; lev < levels; lev++) { if(tomerge[lev].size() > 0) // i.e. it has 1 left-over element { assert((tomerge[lev].size() == 1)); wholemerge.push_back( tomerge[lev][0]); tomerge[lev].clear(); } } SpHelper::deallocate2D(NRecvSizes, DER::esscount); SpHelper::deallocate2D(TRecvSizes, DER::esscount); delete spSeq; spSeq = new DER(MergeAll<SR>(wholemerge, AA_m, AA_n), false, NULL); // First get the result in SpTuples, then convert to UDER for(int i=0; i<wholemerge.size(); ++i) { delete wholemerge[i]; } }