#ifndef LP_VALVE_DETECTOR_H #define LP_VALVE_DETECTOR_H #include "Luffy.h" #include "lpbengine.h" #define ALG_RESIZE_IMAGE_WIDTH 416.0 //#define VEIW_HISTGRAM using namespace luffy_base; struct InputParam { QString strObj; Mat imgTemplate; //气门芯模板 int nValveOffset; float fValveWidth; float fValveDis; Point2f ptCenter; double dScoreThres; int nMaxAngle; int nCenterAlg; // 中心校准算法 int nBarScore; Mat barTemplate; //辐条参数 //int bgThresh; int withinOffset; int barNum; //辐条数量 Mat centerRoi; int flagCircle; Mat baseImage; //气门芯型号确认模板图 int backgroundThresh; // 抠图阈值 int modelMatchScore; //模型匹配值 LP_DETECTOR_ROI_DATA roi; cv::Mat backGround; Point2f originalPoint; Mat weightMat; double cMatchScore; int wheelType; }; struct OutputParam { double dTime; double dAngle; double dAngleRes; double dScore; int nErrorType; bool bIsFind; QString strResultTip; Point2f rstPoint; int flag; double showMatchScore; }; class ValveDetector { public: ValveDetector(); ~ValveDetector(); bool detect(Mat & imgSrc, InputParam ¶mIn, OutputParam ¶mOut, Mat &imgDst = Mat()); void drawResult(Mat &img, InputParam ¶mIn, OutputParam ¶mOut); Point2f getCenter(Mat & imgSrc, Point2f pt, InputParam ¶mIn); double ruleData(double, int); QString genResultTip(QString str, int nType); Point2f getCenterPoints(Mat &_img, const Mat ¢erTempl, InputParam paramIn, Point2f pt, Mat& rstMat); bool saveResult(Mat &img, InputParam ¶mIn, OutputParam ¶mOut, QString modelStr); bool isValid(Mat target, Mat templ, Point2f pt, int validThresh); void drawToImage(Mat &img, InputParam ¶mIn, OutputParam ¶mOut); cv::Mat findCircleObject(const Mat &src, const Mat& backgroundImg, int nThres = 20, luffy_base::luffyCircle *pCircle = NULL); cv::Mat getForeImage(const Mat & src, const Mat &backgroundImg); }; /*class RotateData { public: RotateData() {}; RotateData(const Mat &img, Point pt, double dAngleStep, int size) : mImgSrc(img) , mStartAngle(0) , mEndAngle(360) { init(img, pt, dAngleStep, size); }; void init(const Mat& img, Point pt, double dAngleStep, int size) { mImgSrc = img; mStartAngle = 0; mEndAngle = 360.0; mRImgVec.clear(); mRImgVec.resize(size); mDisValVec.clear(); mDisValVec.resize(size, FLT_MAX); mCenter = pt; mAngleStep = dAngleStep; } double angle(int index) { return index*mAngleStep + mStartAngle; } double bestAngle() { if (mDisValVec.empty()) { return -DBL_MAX; } size_t bestIndex = min_element(mDisValVec.begin(), mDisValVec.end()) - mDisValVec.begin(); double bestAngle = angle(bestIndex); return bestAngle; } Mat bestRImg() { if (mRImgVec.empty()) { return Mat(); } size_t bestIndex = min_element(mDisValVec.begin(), mDisValVec.end()) - mDisValVec.begin(); return mRImgVec[bestIndex]; } double mAngleStep; Mat mImgSrc; Point mCenter; vector mRImgVec; vector mDisValVec; float mStartAngle, mEndAngle; }; class ImageCompareModelInvoker : public cv::ParallelLoopBody { public: ImageCompareModelInvoker(Mat &templ, void* pData) : m_pData(pData), temp(templ) {} private: void *m_pData; Mat temp; virtual void operator() (const cv::Range& range) const; };*/ #endif //LP_VALVE_DETECTOR_H