#ifndef __RV_CVCLS_H_INCLUDED_
#define __RV_CVCLS_H_INCLUDED_

#ifdef CVCLS_EXPORTS
#define CVCLS_API __declspec(dllexport)
#else
#define CVCLS_API __declspec(dllimport)
#endif


#include <rvb\rvtypes.h>

#define IRV_CH_DEF      0
#define IRV_CH_LMEDS    4
#define IRV_CH_RANSAC   8

#define RSM_MIN_COUNT     3
#define RSM_MAX_COUNT    9
#define RSM_COEF_COUNT   9



//get_contour_chain descriptor
//适用: irvRetrieveContourTree, irvDetectSubPixelEdge
typedef struct __irv_rct_descriptor_
{
	int flags;      //保留
	int count;
	 
	RvPoint* pts;
	 
}IRV_RCT_DESCRIPTOR;

typedef struct __irv_rct_descriptor_64_
{
	int flags;      //保留
	int count;
	RvPoint_f64* p64;
}IRV_RCT_DESCRIPTOR_F64;


//pHomoMtx大小：      9
//控制点数大于或等于：4
CVCLS_API BOOL   irvCalcHomography(RvPoint_f64* pCpSrc, RvPoint_f64* pCpDest, int cpCount, int method,   double* pHomoMtx);
CVCLS_API BOOL   irvTransCoordE2(const double* pHomoMtx, RvPoint_f64 src,  RvPoint_f64* pDst);
CVCLS_API BOOL   irvTransCoordE1(const double* pHomoMtx, const RvPoint_f64* pSrcArr,  RvPoint_f64* pDstArr, int arrSize);

//pAffiMtx大小： 6
//控制点数：     3
CVCLS_API BOOL   irvCalcAffine(RvPoint_f64* pCpSrc, RvPoint_f64* pCpDest, int cpCount, double* pAffiMtx);
CVCLS_API BOOL   irvTransCoord(const double* pAffiMtx, const RvPoint_f64* pSrcArr,  RvPoint_f64* pDstArr, int arrSize);

//返回当前距离，如果非法数据，返回-1.
//ICP配对，根据FLANN计算距离
//searchMethod =0, nnRadius=0(该两参数目前保留)
CVCLS_API double   irvIcp(RvPoint_f* pModelArr, int modelSize, RvPoint_f* pSceneArr, int sceneSize,int searchMethod, int nnRadius, int maxSteps, double minDist, RvPoint_f& offset, double& angle);


//flann align  
//该函数会将pModelArr调整新到位置。
//pIndexArr为输出索引，数组大小为modelSize
//CVCLS_API BOOL   irvFlannAlign(RvPoint* pModelArr, int modelSize, const RvPoint* pSceneArr, int sceneSize, int knn, double maxDist, \
//	                             int* pIndexArr, RvPoint_f64* offset, double* angle);


/////////////////////////////for mura defects////////////////////////////
//高斯背景估计
CVCLS_API void   irvEstimateGaussianBackground(const RvImage imFrame, int filterSize,  RvImage imBackground);

//*************************底部打光图像均匀化与二值化@20230602
//背景估计：计算背景信息。前提是背景信息比前景信息的像素值高，如果图像不是这种情况，可以将图像的黑白像素值反转。
//核心思想是对图像中每一个点取其矩形邻域，然后对矩形邻域内所有点的像素值进行从大到小的排序，
//取排在前五的几个像素值较大的像素值计算均值，作为该点的背景值。
CVCLS_API RvImage   irvEstimateBackground(const RvImage imScene, int winSize,  RvImage imBackground);
//光照补强alpha建议0.75
CVCLS_API RvImage   irvNormalizeLum(  RvImage imScene, float alpha, const RvImage imBackground);
 

//imScene--原图像
//h- 3 去噪核参数
//a1--原图像系数，通常取1.0~1.5, 通常1
//a2--高斯滤波图像系数，通常取-0.5~-0.9, 通常-0.5
CVCLS_API RvImage   irvEnhanceScene(   RvImage imScene, float h, float a1, float a2 );

//最佳阈值迭代法获取阈值
//T--迭代结束的阈值
//a--控制前景区域范围的参数，a越大被划分为前景的区域越多
CVCLS_API int   irvCalcSceneThres(   RvImage imScene, float T, float a);


//***********************end of @20230602

//差分图像
CVCLS_API void   irvSubstractBackground(const RvImage imOriginal, const RvImage imBackground, double multipler, double offset, RvImage imObjects);

CVCLS_API void   irvRemoveTinyObjects(RvImage imObjects, int filterSize);

CVCLS_API void   irvSegmentObjects(RvImage imObjects, double params);

 

///////////细胞物体分割///////////////////////////////////////////
//space =21,  color =51
//返回包含RvBox2D*数据的sequence
//
CVCLS_API RvSequence   irvSegmentCellsWs(const RvImage imObjects, double space, double color, BOOL bFilterMeanShift, RvSequence seq);

//bClearOnly 为true的话，将彻底销毁seq
CVCLS_API void   irvDestroyCellsWs(RvSequence seq, BOOL bClearOnly);


//输入多边形轮廓点，输出多边形拟合后轮廓点，精度0,1,2,3,...
CVCLS_API int   irvApproxPolyDp(const RvPoint* pInArr, int inSize, double accuracy,   RvPoint* pOutArr, int size);

//移除炫光，原理使用h通道进行二值化，并生成二值图。该函数仅供参考，不做正式执行。,
CVCLS_API RvImage   irvSegmentByDeglare(const RvImage imRgb, int lower, int maxval, RvImage imBin);


//获得BIN图中轮廓树,返回轮廓数
//approx type
#define RCT_AM_NONE    1
#define RCT_AM_SIMPLE  2
//tree的数据为IRV_RCT_DESCRIPTOR ，外部释放时，使用MPM_FREE
CVCLS_API int   irvRetrieveContourTree(const RvImage imBin, int approx,  RvTree tree);

//释放轮廓树中的轮廓数据，不释放tree对象
CVCLS_API void   irvReleaseContourTree(RvTree tree);


//光照均匀化，自动gamma矫正, rgb图像
CVCLS_API void   irvAdjustGamma(RvImage imRgb);

//柱状图均匀化
CVCLS_API void   irvEqualizeByHisto(RvImage imRgb);

//USM锐化
//for gaussion: sigma=25, alpha=1.5, beta=-0.5, gamma=0
//for laplacian: sigma =-1
#define SBK_GAUSSIAN    0
#define SBK_LAPLACIAN   1

CVCLS_API void   irvSharpen(RvImage imRgb, int blurKernnel, double sigma, double alpha, double beta, double gamma);

//彩色图RGB
//double S = 1.5; /* default sigma=0 */
//double H = 4.2; /* default th_h=0  */
//	double L = 0.81; /* default th_l=0  */

CVCLS_API RvSequence   irvDetectSubPixelEdge(const RvImage image,  double sigma, double thH, double thL,   RvSequence seq);


 


 
 
#endif

