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;
}
Пример #2
0
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);	
}
Пример #3
0
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);	
}