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