int main() {
  std::vector<int> v(500);
  sift0(begin(v), 50);
  std::cout << "sift0(begin(v), 50):\n";
  print_sieve(begin(v), 50);
  sift1(begin(v), 50);
  std::cout << "sift1(begin(v), 50):\n";
  print_sieve(begin(v), 50);
  sift(begin(v), 500);
  std::cout << "sift(begin(v), 500):\n";
  print_sieve(begin(v), 500);
  std::cout << "gcm(15, 9) = " << gcm(15, 9) << std::endl;
}
示例#2
0
int main( int argc, char** argv ) {
	string filename1 = "image2.jpg";
	string filename2 = "image1.jpg";
	cv::Mat oriImg1 = cv::imread( filename1, 0 );
	cv::Mat oriImg2 = cv::imread( filename2, 0 );


	// extract sift features
	cv::SIFT sift1( 0, 3, 0.04, 10, 1.0 );
	cv::SIFT sift2( 0, 3, 0.04, 10, 1.0 );
	vector<cv::KeyPoint> siftFeats1, siftFeats2;
	const int width1 = 400;
	const int width2 = width1 + rand()%10;
	int height1 = (int)(oriImg1.rows*(float)width1/(float)oriImg1.cols);
	int height2 = (int)(oriImg2.rows*(float)width2/(float)oriImg2.cols);
	cv::Mat img1, img2;
	cv::resize( oriImg1, img1, cv::Size(width1, height1));
	cv::resize( oriImg2, img2, cv::Size(width2, height2));
	cv::Mat siftDescs1, siftDescs2, siftMask1, siftMask2;
	sift1( img1, siftMask1, siftFeats1, siftDescs1, false );
	sift2( img2, siftMask2, siftFeats2, siftDescs2, false );
	cout << siftFeats1.size() << ", " << siftFeats2.size() << endl;


	// click seed area in oriImg1
	vector<cv::Point> corners;
	corners = SelectCorners( img1 );
	int cornernum = (int)corners.size();
	int corxmin, corymin, corxmax, corymax;
	corxmin = corymin = INT_MAX; corxmax = corymax = INT_MIN;
	for ( int i = 0; i < cornernum; i ++ ) {
		if ( corners[i].x < corxmin )
			corxmin = corners[i].x;
		if ( corners[i].x > corxmax )
			corxmax = corners[i].x;
		if ( corners[i].y < corymin )
			corymin = corners[i].y;
		if ( corners[i].y > corymax )
			corymax = corners[i].y;
	}
	cout << corxmin << " "
		 << corxmax << " "
		 << corymin << " "
		 << corymax << endl;
	cv::Point lupt(corxmin, corymin), rdpt(corxmax, corymax);

	// matched feature search using knn
	const int k = 1;
	vector<int> idxs;
	vector<distindex> dists;
	vector<distindex> alldists;
	vector<double> distdiffs, xydiffs;
	for ( int i = 0; i < (int)siftFeats1.size(); i ++ ) {
/*		if ( siftFeats1[i].pt.x < corxmax &&
			 siftFeats1[i].pt.x > corxmin &&
			 siftFeats1[i].pt.y < corymax &&
			 siftFeats1[i].pt.y > corymin ) {*/
		if ( i%50 == 0 )
			cout << "process feature " << i << "...\n";
			cv::Mat cimg1 = img1.clone();
			cv::Mat cimg2 = img2.clone();
			cv::circle( cimg1, siftFeats1[i].pt, 5, cv::Scalar::all(255), 2 );
			double xydiff = 0, distdiff = 0;
			distindex alldist;
			KNNSearch( i, siftDescs1, siftDescs2, idxs, dists, k );
			for ( int j = 0; j < k; j ++ ) {
				xydiff += sqrt( (siftFeats2[idxs[j]].pt.x-siftFeats1[i].pt.x)*(siftFeats2[idxs[j]].pt.x-siftFeats1[i].pt.x) +
						        (siftFeats2[idxs[j]].pt.y-siftFeats1[i].pt.y)*(siftFeats2[idxs[j]].pt.y-siftFeats1[i].pt.y) );
				distdiff += dists[j].dist;
				cv::circle( cimg2, siftFeats2[idxs[j]].pt, 5, cv::Scalar::all(255), 2 );
			}
			alldist.ori 	= i;
			alldist.index 	= idxs[0];
			alldist.dist 	= distdiff;
			alldists.push_back( alldist );
			distdiffs.push_back( distdiff );
			xydiffs.push_back( xydiff );
/*			cout << endl;
			cv::imshow( "cimg1", cimg1 );
			cv::imshow( "cimg2", cimg2 );
			cv::waitKey(0);*/
			idxs.clear();
			dists.clear();
/*		}*/
	}
	cv::Mat diffMat( img1.rows, img1.cols, CV_8UC1, cv::Scalar::all(0) );

	// normalize descriptor euclidean distance
	int mindist = INT_MAX, maxdist = INT_MIN;
	for ( int i = 0; i < (int)distdiffs.size(); i ++ ) {
		if ( distdiffs[i] < mindist )
			mindist = distdiffs[i];
		if ( distdiffs[i] > maxdist )
			maxdist = distdiffs[i];
	}
	for ( int i = 0; i < (int)distdiffs.size(); i ++ ) {
		distdiffs[i] = (distdiffs[i]-mindist)/(maxdist-mindist)*255;
	}

	// normalize pixel distance
	int minxy = INT_MAX, maxxy = INT_MIN;
	for ( int i = 0; i < (int)distdiffs.size(); i++ ) {
		if ( xydiffs[i] < minxy )
			minxy = xydiffs[i];
		if ( xydiffs[i] > maxxy )
			maxxy = xydiffs[i];
	}
	for ( int i = 0; i < (int)xydiffs.size(); i ++ ) {
		xydiffs[i] = (xydiffs[i]-minxy)/(maxxy-minxy)*255;
	}

	// sort the descriptor difference using euclidean between knns
	const float perc = .1;
	int uniNum = (int)siftFeats1.size()*perc;
	sort( alldists.begin(), alldists.end() );
	cv::Mat cimg1 = img1.clone();
	for ( int i = 0; i < (int)alldists.size(); i ++ ) {
		if ( i > (int)alldists.size()-uniNum )
			cv::circle( cimg1, siftFeats1[alldists[i].ori].pt, 4, cv::Scalar::all(distdiffs[alldists[i].ori]), 2 );
		else
			cv::circle( cimg1, siftFeats1[alldists[i].ori].pt, 4, cv::Scalar::all(50), 2 );
	}
/*	if ( (int)distdiffs.size() == (int)siftFeats1.size() ) {
		for ( int i = 0; i < (int)siftFeats1.size(); i++ ) {
			if ( distdiffs[i] > 220 ) {
				cv::circle( diffMat, siftFeats1[i].pt, 4, cv::Scalar::all(distdiffs[i]), 2 );
			}
		}
	}*/
	cv::imshow( "diffMat", cimg1 );
	cv::imwrite( "inv_knn_1_perc_.1_com.jpg", cimg1 );
	cv::waitKey(0);
}