/*
* Copyright (C) 2007-2008 Anael Orlinski
*
* This file is part of Panomatic.
*
* Panomatic is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* 
* Panomatic is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with Panomatic; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

#ifndef __libsurf_keypointdetector_h
#define __libsurf_keypointdetector_h

#include "Image.h"
#include "KeyPoint.h"

namespace libsurf {

class KeyPointInsertor
{
public:	
	virtual void operator()(const KeyPoint &k) = 0;
};

class KeyPointDetector
{
public:
	// default constructor
	KeyPointDetector();

	// setters for various parameters
	inline void setMaxScales(unsigned int iMaxScales)	{ _maxScales = iMaxScales; }
	inline void setMaxOctaves(unsigned int iMaxOctaves) { _maxOctaves = iMaxOctaves; }
	inline void setScoreThreshold(double iThreshold)	{ _scoreThreshold = iThreshold; }

	// detect keypoints and put them in the image
	void detectKeypoints(Image& iImage, KeyPointInsertor& iInsertor);
	
private:
	
	// internal values of the keypoint detector
	
	// number of scales
	unsigned int					_maxScales;
	
	// number of octaves
	unsigned int					_maxOctaves;

	// detection score threshold
	double							_scoreThreshold;

	// initial box filter size
	unsigned int					_initialBoxFilterSize;

	// scale overlapping : how many filter sizes to overlap
	// with default value 3 : [3,5,7,9,11][7,11,15,19,23][...
	unsigned int					_scaleOverlap;

	// some default values.
	const static double kBaseSigma;

	bool fineTuneExtrema(double *** iSH, unsigned int iX, unsigned int iY, unsigned int iS, 
						double& oX, double& oY, double& oS, double& oScore,
						unsigned int iOctaveWidth, unsigned int iOctaveHeight, unsigned int iBorder);

	bool calcTrace(Image& iImage, double iX, double iY, double iScale, int& oTrace);

	unsigned int		getFilterSize(unsigned int iOctave, unsigned int iScale);
	unsigned int		getBorderSize(unsigned int iOctave, unsigned int iScale);

};

}

#endif //__libsurf_keypointdetector_h
