/*! 
*   \file  CFeatureExtraction.h
*   \brief Declares class to extract features.
*    
*   \details  
*   CFeatureExtraction extracts the requested features. 
*
*   \date      October 24, 2011
*   \copyright eBay Research Labs.
*/

#pragma once

// Include standard C++ headers.
#include <string>   

// Include openCV-specific headers.
#include <cv.h>

#include "CSignature.h"
#include "CFeatureMapper.hpp"

class CFeatureExtraction
{
	public:
        CFeatureExtraction();
	CFeatureExtraction(const cv::Mat &imgIn, CFeatureMapper &ftrMapper, bool flagCrop=true);
	CFeatureExtraction(const cv::Mat &imgIn, bool flagCrop=true);
	~CFeatureExtraction(void);
	
	
	CSignature& getSignature() { return *m_sig; }
	const std::string& getMD5() const { return m_md5; }

	CSignature* release() { CSignature* sig(m_sig); m_sig = 0; return sig; }
	
        std::ostream& SerializeSignatureJSON(std::ostream& stream);
        std::ostream& SerializeSignatureJSONText(std::ostream& stream, bool contentOnly = false);
        std::ostream& SerializeSignatureXML(std::ostream& stream);
	std::string SerializeSignature();
	void DeserializeSignature(const std::string&);
 private:
	std::string m_md5;
	CSignature* m_sig;
	void  DefaultRectROI(cv::Size sz, cv::Rect &roi);
        void  ResizeImageWithROI(const cv::Mat &imgIn, cv::Mat &imgOut, cv::Rect &roi, bool flagCrop=true, int maxDim=128);  
	
        cv::Mat   Hist1D(const cv::Mat& data2D, const float *range, const int numBins);
        cv::Mat   ClrHSV_BWValHist(const cv::Mat &hsv, float &fracClr);
	
        void  GradientHist(int numAngBins, const cv::Mat &dx, const cv::Mat &dy, const cv::Mat &imgEdge, cv::Mat &histOrient, int &numEdgePixels, float &maxEdgeMag);
        void  OrientHist(const cv::Mat &rgb, cv::Mat &histOrient, cv::Mat &fracEdgePixels, float &maxEdgeMag);


};
