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);
}
Beispiel #2
0
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];
	}
}