//模板识别
#ifndef   __RV_PMAT_H_INCLUDED_
#define   __RV_PMAT_H_INCLUDED_
  

#define PMAT_API  WINAPI



 #include <rvb\rvtypes.h> 


#define RV_MP_BIN            1 //二值图匹配，分数越小，相似度越高
#define RV_MP_BIN_N          (-RV_MP_BIN) //二值图匹配，分数越小，相似度越高

#define RV_MP_ABSDIFF        2 //灰度图绝对差匹配，分数越小，相似度越高
#define RV_MP_ABSDIFF_N      (-RV_MP_ABSDIFF) //灰度图绝对差匹配，分数越小，相似度越高

#define RV_MP_SQDIFF         3 //灰度图平方差匹配，分数越小，相似度越高
#define RV_MP_SQDIFF_N       (-RV_MP_SQDIFF)  //灰度图标准平方差匹配，分数越小，相似度越高

#define RV_MP_CCORR          4  //灰度图相关性匹配，分数越大，相似度越高，0为最坏结果
#define RV_MP_CCORR_N        (-RV_MP_CCORR)  //灰度图标准相关性匹配，分数越大，相似度越高

#define RV_MP_CCOEFF         5  //灰度图相关性系数匹配，1表示完美匹配，0表示无任何相关性，-1表示糟糕匹配
#define RV_MP_CCOEFF_N       (-RV_MP_CCOEFF)  //灰度图相关性系数匹配，1表示完美匹配，0表示无任何相关性，-1表示糟糕匹配

//pattern match  result
typedef struct __rv_match_pattern_result_
{
	double    x, y;  //坐标
	double    score; //分数
}RvMatPatResult, RvMatchPatternResult,MpResult;



//rvMatchPatternGray根据不同的方法求分数。有些求最大值，有些求最小值，取决于具体方法。
//mask为imTemplet的掩板
//method为匹配方法：RV_MP_BIN， RV_MP_ABSDIFF，等等
//direct为搜索方向：水平，垂直或两个方向。
//nStepRatio为粗搜索步长因子，取值范围为（0-1）即0到1之间，建议取0.3。
//nInitScore为粗搜索分数
//nMinScore为最终的分数，通常小于或(大于)nInitScore
//返回值为查找到合格的个数。
extern "C"  int PMAT_API rvMatchPattern(RvImage imScene, RvImage imTemplet, RvMask mask, int method,  int direct, float nStepRatio, double nInitScore, double nMinScore, MpResult* pResultArray, int nResultCount);

//最少分数
//nScoreThres不同的方法，该值不一样,范围(0-1)
//nMaxScore  保留
//结果坐标以模板图像中心点作为参考坐标
extern "C"  int PMAT_API rvMatchPatternE1(RvImage imScene, RvMask mkScene, RvImage imTemplet, RvMask mkTempl, int method,  int direct, float nStepRatio, double nScoreThres, double nMaxScore, MpResult* pResultArray, int nResultCount);


//计算不同相关性方法最可能获得的最大分数（原始分数，不是规范化后的分数
//主要使用ABSDIFF, BIN, SQRDIFF
//输入： 模板宽度，模板高度，MASK,以及使用的方法
extern "C"  double PMAT_API rvCalcMinScore(int  width, int height, RvMask mask, int method);
//extern "C"  double PMAT_API rvCalcMinScore(int  width, int height, RvMask mask, int method);



//匹配单样本，不搜索,返回分数值
//在场景图x,y坐标处，以模板图像中心（x`,y`）参考点对应
//的区域进行匹配。
//
extern "C"  double PMAT_API rvMatchSingle(RvImage imScene, int x, int y, RvImage imTemplet, RvMask mask, int method );

//pX, pY - 输入初始位置， 输出结果. 坐标为中心点
extern "C"  double PMAT_API rvMatchSingleE1(RvImage imScene, RvMask mkScene, RvImage imTemplet, RvMask mkTemplet, int method, int* pX, int* pY, int dx, int dy,  float nStepRatio, float nThresScore );

//输入rect,在矩形框里面搜
extern "C"  double PMAT_API rvMatchSingleE2(RvImage imScene, RvMask mkScene, RvImage imTemplet, RvMask mkTemplet, int method,  RvRect rect,  float nStepRatio, float nThresScore, int* pX, int* pY  );


 







#endif
