int KitechSurfObjectRecognitionComp::NaiveNearestNeighbor( const float* vec, int laplacian, const CvSeq* model_keypoints, const CvSeq* model_descriptors ) { int length = (int)(model_descriptors->elem_size/sizeof(float)); int i, neighbor = -1; double d, dist1 = 1e6, dist2 = 1e6; CvSeqReader reader, kreader; cvStartReadSeq( model_keypoints, &kreader, 0 ); cvStartReadSeq( model_descriptors, &reader, 0 ); for( i = 0; i < model_descriptors->total; i++ ) { const CvSURFPoint* kp = (const CvSURFPoint*)kreader.ptr; const float* mvec = (const float*)reader.ptr; CV_NEXT_SEQ_ELEM( kreader.seq->elem_size, kreader ); CV_NEXT_SEQ_ELEM( reader.seq->elem_size, reader ); if( laplacian != kp->laplacian ) continue; d = CompareSURFDescriptors( vec, mvec, dist2, length ); if( d < dist1 ) { dist2 = dist1; dist1 = d; neighbor = i; } else if ( d < dist2 ) dist2 = d; } if ( dist1 < 0.6*dist2 ) return neighbor; return -1; }
void CompareImagesByHarrisFeatures(cv::Mat img1, cv::Mat img2,bool doAHE, bool doPlot, bool doSave, double &score, double &avgTrackLength){ //SURF parameters const int maxCorners = 500; const double qualityLevel = 1.0; const double minDistance = 1.0; //function variables std::vector<cv::KeyPoint> keypoints1,keypoints2; //assign default values for output variables score = 0.0; avgTrackLength = 0.0; cv::Mat im1,im2; //apply adaptive histogram equalization if(doAHE){ cv::equalizeHist(img1,im1); cv::equalizeHist(img2,im2); } else { im1 = img1; im2 = img2; } //detect surf features cv::GoodFeaturesToTrackDetector detector(maxCorners,qualityLevel,minDistance,3,true,0.04); detector.detect(im1,keypoints1); detector.detect(im2,keypoints2); if(doPlot){ cv::Mat im1withKeypoints,im2withKeypoints; //draw kp and plot cv::drawKeypoints(im1,keypoints1,im1withKeypoints,cv::Scalar::all(-1),cv::DrawMatchesFlags::DEFAULT); cv::drawKeypoints(im2,keypoints2,im2withKeypoints,cv::Scalar::all(-1),cv::DrawMatchesFlags::DEFAULT); cv::imshow("Image 1",im1withKeypoints); cv::imshow("Image 2",im2withKeypoints); } CompareSURFDescriptors(im1,im2,keypoints1,keypoints2,true,false,score,avgTrackLength); }
void CompareImagesByMSERFeatures(cv::Mat img1, cv::Mat img2,bool doAHE, bool doPlot, bool doSave, double &score, double &avgTrackLength){ //function variables std::vector<cv::KeyPoint> keypoints1,keypoints2; //assign default values for output variables score = 0.0; avgTrackLength = 0.0; cv::Mat im1,im2; //apply adaptive histogram equalization if(doAHE){ cv::equalizeHist(img1,im1); cv::equalizeHist(img2,im2); } else { im1 = img1; im2 = img2; } //detect surf features cv::MSER detector; detector.detect(im1,keypoints1); detector.detect(im2,keypoints2); if(doPlot){ cv::Mat im1withKeypoints,im2withKeypoints; //draw kp and plot cv::drawKeypoints(im1,keypoints1,im1withKeypoints,cv::Scalar::all(-1),cv::DrawMatchesFlags::DEFAULT); cv::drawKeypoints(im2,keypoints2,im2withKeypoints,cv::Scalar::all(-1),cv::DrawMatchesFlags::DEFAULT); cv::imshow("Image 1",im1withKeypoints); cv::imshow("Image 2",im2withKeypoints); } CompareSURFDescriptors(im1,im2,keypoints1,keypoints2,true,false,score,avgTrackLength); }