#ifndef _Luffy_Process_h_ #define _Luffy_Process_h_ #include "CVUtils.h" #include "stdio.h" #include #include using namespace cv; using std::vector; namespace luffy_base { #define LP_MAX_ANGLE 360 #define LP_GRAY_LEVEL 256 #define LP_MAX_GRAY_VALUE 255 #define LP_COLOR_GREEN Scalar(0, 255, 0) #define LP_COLOR_RED Scalar(0, 0, 255) #define LP_COLOR_BLUE Scalar(255, 0, 0) #define LP_COLOR_WHITE Scalar(255, 255, 255) #define LP_COLOR_BLACK Scalar(0, 0, 0) #define LuffyMax(a, b) ((a)>(b) ? (a) : (b)) #define LuffyMin(a, b) ((a)<(b) ? (a) : (b)) #define LP_SINGLE_LINE 1 class luffyCircle { public: luffyCircle() :ptCenter(0,0), fRadius(0){} public: Point2f ptCenter; float fRadius; }; class luffyObject { public: luffyObject(); Rect rtPos; float getRadius() { return (rtPos.width / 2.0); } //Rect }; typedef int LP_NORM_METHOD; class luffyPos { public: Point m_ptInPic; //圆在大图中的圆心位置 Point m_ptInROI; //圆在ROI中的圆心位置 Rect m_rtROI; //ROI区域 float m_fRadiusAvg; //半径 }; /* 阈值分割算法汇总 emThresMethodDefault 按照param1作为阈值分割 emThresMethodInv 按照param1作为阈值 emThresMethodRatio 按照灰度总数的前百分比emThresMethodRatio计算值作为阈值 emThresMethodNum 按照灰度总数的前emThresMethodNum个灰度数量作为阈值 emThresMethodOtsu 最大间方差得到的阈值 emThresMethodIteration 迭代法 emThresMethodBasicGlobal 基本全局阈值法 emThresMethodMaxEntropy 最大熵阈值分割 emThresMethodHuangFuzzy */ namespace luffy_threshold { enum EmThresMethod { emThresMethodDefault = 000, emThresMethodInv = 100, emThresMethodRatio = 2, emThresMethodNum = 3, emThresMethodOtsu = 4, emThresMethodIteration= 5, emThresMethodBasicGlobal = 6, emThresMethodMaxEntropy = 7, emThresMethodHuangFuzzy = 8, emThresMethod2 = 9 }; void calcuHist(const Mat &src, Mat &matHist, int &nTotal, Mat &mask = gDummyMat); int getThresValue(Mat &matHist, int nTotal, double dRatio, EmThresMethod emMethod = emThresMethodRatio); int Threshold(const Mat &src, Mat &dst, double param1, int nThresMethod = emThresMethodDefault, Mat mask = Mat()); int Threshold(const Mat &src, Mat &dst, vector param, int nThresMethod = emThresMethodDefault, Mat mask = Mat()); } /* 投影计数:直角坐标与极坐标投影 */ namespace luffy_projection { enum EmProjectionDirect { emProjX = 0, emProjY = 1 }; void project2point(const Mat & src, Mat & projDst, Point ptCenter, int nAngleCount, LP_NORM_METHOD normType = 0); void project2axis(const Mat & src, Mat & projDst, EmProjectionDirect param1 = emProjX, LP_NORM_METHOD normType = 0); } // &points, float &fRadius, Point2f ¢er); // &points, float& a, float &b); // &vec, Point2f ptCenter, float radius, float dDiff); enum EmCreateMode{ emCreateDefault, emCreateGray, emCreateColor, emCreateCopy, emCreateNull }; void createImage(Mat & src, Mat & dst, EmCreateMode emMode = emCreateDefault, Scalar color = Scalar::all(0)); void sobel(Mat &src, Mat *pDst = NULL, Mat *pSobelX = NULL, Mat *pSobelY = NULL, int iBlockSize = 3); enum EmGradientMethod { emGradient1 }; void ComputeGradient(Mat & src, EmGradientMethod method = emGradient1, Mat *pAngle = nullptr, Mat *pMag = NULL); // genRandPoints(vector & vecPoints, float fProb, int prec = 100); vector fitModelbyRansac(vector &vecPoints, EmModel emModel, float fProb, float errorDis, int nMaxItNum, int minFitNum, int breakCondi); vector fitModelbyRansac(vector &vecPoints, EmModel emModel, RansacParam *pParam); bool fitModel(vector &vecPoints, vector &vecRes, EmModel emModel); } /* 数学类操作:几何+代数 */ namespace luffy_math { int mod(int index, int total, int periodNum = 1); // // float disofPoint2Line(T pt, float a, float b) { // bool sort2Data(T &minData, T &maxData) { // getArea(Size imgSize, vector< vector > &contours); int getArea(const Size imgSize, const vector & contours); //获取长度 std::list getLeng(Size imgSize, vector< vector > contours, int contourIdx); std::list cvProcessContours(Size imgSize, CvSeq* contour, int max_level); void CollectPolyEdges(const Point* v, int count, vector& edges, int shift); int CaculCollectionArea(Size imgSize, vector& edges); } /* 三角函数值的快速索引 1、先初始化createNewTrigValue,其中total表示将360°进行total份等分, 2、创建完成之后,即可使用getCos/Sin与getCosPtr/SinPtr索引相关参数,index为total等分下的索引 */ namespace luffy_triangle { bool createNewTrigValue(int total); bool releaseTrigValue(int total); double getCos(int total, int index); double getSin(int total, int index); double *getCosPtr(int total); double *getSinPtr(int total); } /* 碰击计算:记录从起点到终点,第一次遇见白点时候的坐标,分为极坐标与直角坐标 */ namespace luffy_hit { enum EmHitDirectParam { emHitIn2Out = 0, emHitOut2In = 1, emHitUp2Down = 0, emHitDown2Up = 1, emHitLeft2Right = 2, emRight2Left = 3 }; class MoutainClamp { public: MoutainClamp(int iTotal = 360, bool bLoop = false) { left = 0; right = 0; total = iTotal; m_bLoop = bLoop; } int left; int right; int total; bool m_bLoop; int getLen() { return (m_bLoop == false) ? (right - left + 1) : luffy_math::mod(right - left + 1, total); } vector getRect(int nRow, int nCols) { vector vecRect; if (1 != nCols) { if (left <= right) { vecRect.push_back(Rect(left, 0, getLen(), LP_SINGLE_LINE)); } else { vecRect.push_back(Rect(left, 0, nCols - left + 1, LP_SINGLE_LINE)); vecRect.push_back(Rect(0, 0, right, LP_SINGLE_LINE)); } } else { if (left <= right) { vecRect.push_back(Rect(0, left, LP_SINGLE_LINE, getLen())); } else { vecRect.push_back(Rect(0, left, LP_SINGLE_LINE, nRow - left + 1)); vecRect.push_back(Rect(0, 0, LP_SINGLE_LINE, right)); } } return vecRect; }; double getSum(Mat & src){ double dSum = 0.0; vector vecRect = getRect(src.rows, src.cols); for (int i = 0; i < vecRect.size(); i++) { dSum += cv::sum(src(vecRect[i]))[0]; } return dSum; }; int getMid(){ return luffy_math::getVectorsAngle(left, right, total); } bool judgeLen(int nMin = 0, int nMax = 360, bool bLoop = false) { int nLen = getLen(); return luffy_math::checkData(nLen, nMax, nMin); } }; void firstHit4Circle(Mat &binary, Mat &hit, vector &vecHit, Point ptCenter, int nIn, int nOut, int nHitCount = 360, EmHitDirectParam emHit = emHitOut2In); void firstHit4Axis(Mat &binary, Mat &hit, int nMin, int nMax, EmHitDirectParam emHit = emHitUp2Down); void hit2Moutain(Mat & src, std::vector &vecMouts, float thresValue, int nWidth); void filterMoutain(std::vector & vecMouts, int nTotal, int minSpace, int minWidth, bool bLoop = false); MoutainClamp getMaxWidthMoutain(std::vector & vecMouts, bool bLoop = false); MoutainClamp getMaxDensityMoutain(Mat &src, std::vector & vecMouts, bool bLoop = false); } } #endif //_Luffy_Process_h_