#pragma once #include "RANSAC_LineFittingAlgorithm.h" #include "EdgeProc.h" #include "EdgeFind.h" #include "ChamferInspect.h" #include #include using namespace std; enum SPLINE_ERR_MSG{ERR_SPLINE_EMPTYMASTER=1,ERR_SPLINE_EDGEPROCESS,ERR_SPLINE_LABELPROCESS,ERR_SPLINE_LABELCOUNT,ERR_SPLINE_INDEXFIND ,ERR_SPLINE_LABELPOSITION,ERR_SPLINE_POSITIONNULL,ERR_SPLINE_INS_CNT_SHORT,ERR_SPLINE_IMAGE_NULL,ERR_SPLINE_IMAGE_NULL_02 ,ERR_SPLINE_IMAGE_NULL_03,SPLINE_INS_SUCESS}; #define MAX_SPLINE_DEFECT_COUNT 1000 class CSplinePoint { public: CSplinePoint() { Reset(); } void Reset() { origin = rotate = CPoint(0,0); dThick = dTheta = 0.; bFind = FALSE; } CPoint origin; CPoint rotate; double dThick; double dTheta; BOOL bFind; }; class CImagePoint { public: CImagePoint() { Reset(); } void Reset() { imgPos = originPos = CPoint(0,0); dTheta = 0.; nInsWidth = 0; } CPoint imgPos; CPoint originPos; double dTheta; int nInsWidth; }; class CResultDefect { public: CResultDefect() { Reset(); } void Reset() { dThick = 0.; rectDefect = CRect(0,0,0,0); } CRect rectDefect; double dThick; }; class CDetectPoint { public: CDetectPoint() { Reset(); } void Reset() { orgX = orgY = 0.; imgX = imgY = 0.; dTheta = dDist = 0.; bFind = FALSE; } double orgX,orgY; double imgX,imgY; double dTheta; double dDist; BOOL bFind; }; struct SortOrginYPos : public std::binary_function, pair, bool> { bool operator()(const pair & lhs, const pair & rhs) { return lhs.second.origin.y > rhs.second.origin.y; } }; enum SPLINECHIP_INS_METHOD{METHOD_INS_LINE=0,METHOD_INT_ROUND}; enum MAKE_IMAGE_METHOD{MAKE_METHOD_LINEAR=0,MAKE_METHOD_REGRESSION,MAKE_METHOD_NONE}; enum SPLINE_INS_DIR{SPLINE_INS_DIRECTION_X=0,SPLINE_INS_DIRECTION_Y,SPLINE_INS_DIRECTION_NONE}; typedef struct _CHIP_INS_REGION { public: _CHIP_INS_REGION() { Reset(); } void Reset() { bUse = FALSE; nStartX = nEndX = nThres = nFindThres = nSkipDist = nInsRange = 0; emMethod = MAKE_METHOD_NONE; emDir = SPLINE_INS_DIRECTION_NONE; nCornerYSize = -1; } BOOL bUse; int nStartX; int nEndX; int nCornerYSize; int nThres; int nFindThres; int nSkipDist; int nInsRange; MAKE_IMAGE_METHOD emMethod; SPLINE_INS_DIR emDir; }CHIP_INS_REGION; #define SPLINE_RESULT_DATA_CNT 2 #define SPLINE_RANGE_RESULT_CNT 5 class AFX_EXT_CLASS CSplineModel { public: CSplineModel(void); virtual ~CSplineModel(void); public: BOOL CopyModelData(CSplineModel *pSpline); BOOL WriteModelData(CString strFile,CString strRecipe,CString strCut,std::multimap *pPoint,CPoint pointOffset); BOOL WriteCSVData(CString strFile,CPoint *pPoint,int nCnt,CPoint pointOffset); BOOL ReadModelData(CString strFile,CString strRecipe); BOOL IsLoadMasterImg(){return m_bLoadMasterImg;} CString GetLoadModelRecipe(){return m_strLoadModel;} CSize GetMasterDataSize(){return CSize(m_pointMasterMax.x,m_pointMasterMax.y);} std::multimap *GetMasterData(){return &m_mapMasterPos;} CPoint GetptMasterMax(){return m_pointMasterMax;} CPoint GetptMasterMin(){return m_pointMasterMin;} void ClearModelData(); protected: BOOL AdjustTilt(std::multimap *pPos); double GetTilt(std::multimap *pPos,double &dCenX,double &dCenY); protected: BOOL m_bLoadMasterImg; CString m_strLoadModel; CPoint m_pointMasterMax,m_pointMasterMin; std::multimap m_mapMasterPos; }; class CSISBuffer; class AFX_EXT_CLASS CSplineInspect { public: CSplineInspect(void); CSplineInspect(CSISBuffer *lpBuffer); virtual ~CSplineInspect(void); public: SPLINE_ERR_MSG InspectSpline(CSISBuffer &pImg,CRect &rectCrop,int nDetDist,int nThres,BOOL bFlip,BOOL bSaveImg,BOOL bSaveDebug); double InspectSplineChip(CSISBuffer pImg,int nPosLeft,CHIP_INS_REGION &insRegion,double dRes,int nJudgeThick,COwnerBuffer &pRes ,BOOL bFlip,int iReg,BOOL bSaveDebug,SPLINECHIP_INS_METHOD enOpt=METHOD_INT_ROUND); // ¼öÁ¤ ¹öÀü double InspectSplineChip_New(CSISBuffer pImg,int nPosLeft,CHIP_INS_REGION &insRegion,double dRes,int nJudgeThick ,BOOL bFlip,int iReg,BOOL bSaveDebug,SPLINECHIP_INS_METHOD enOpt=METHOD_INT_ROUND); int InspectChipBin_New(CEdgeProc &EdgeProc,CSISBuffer pOrg,CRect &insRect,CHIP_INS_REGION &insRegion,std::multimap &mapIns); BOOL Blob_OpenCV(CSISBuffer* pOriginImg, COwnerBuffer* pBinImage, CRect rtInsRect, std::vector* vecBlobList, ChipResionType s_RegionType,DefectPosType s_DefectPos, int nMinSize, int nSideFilter, BOOL bROIOffset=TRUE); int FilteringDefect_New(CHIP_INS_REGION &insRegion,std::multimap &mapIns,double dRes,int nJudge,CRect &insRect,BOOL bFlip); public: CChipBlob *GetResultDefect(){return m_ResultDefect;} int GetResultDefectCount(){return m_nDefectCount;} double *GetResultData(){return m_dResultData;} double *GetRangeData(){return m_dRangeResult;} CSISBuffer *GetSplineOrgImg(){return (CSISBuffer*)&m_insSplineOrg;} CSISBuffer *GetSplineResImg(){return (CSISBuffer*)&m_insSplineRes;} BOOL FindCADLine(); BOOL LabelingProcess(); BOOL LabelingCounting(); BOOL LabelFiltering(int nFilterCnt); int GetRectInLabelMaxIndex(CRect &rect); BOOL GetLabelPosition(int nIdx); std::multimap *GetSplinePos(){return &m_mapSplinePos;} CPoint GetSplineOffset(){return CPoint(m_nSplineOffsetX,m_nSplineOffsetY);} BOOL CheckBuffer(); BOOL CheckRange(int x,int y,CSISBuffer *buffer); void ContourTracing(int cy, int cx, int labelindex, int tracingdirection); BOOL CheckRectToBuffer(CRect &rect); BOOL Tracer(int *cy, int *cx, int *tracingdirection); void ReleaseBuffer(); BOOL SetImage(CSISBuffer *lpBuffer); void SetMasterModelData(CSplineModel *pMaster){m_pSpModel=pMaster;} protected: void ReleaseBlob(); void ResetValue(); BOOL FindForeLine(CSISBuffer &pBuffer,int *nForeLine,double &dTheta); BOOL ShiftNRotateImage(CSISBuffer pOrg,CSISBuffer pBin,COwnerBuffer &pProcess,COwnerBuffer &pProcImg,int *nForeLine,double dTheta,CPoint &pPosImg); BOOL DistInspection(CEdgeProc &EdgeProc,CSISBuffer &pTgt,double *dResult,double *dRangeRes); int GetSplineValue(CEdgeProc &glassFind,CSISBuffer pOrg,double dXPos,double dYPos); void MakeSplineResultImage(COwnerBuffer &pRes,CSISBuffer &pProcess); BOOL AdjustTilt(std::multimap *pPos); double GetTilt(std::multimap *pPos,double &dCenX,double &dCenY); protected: BOOL CopyRectImg(LPBYTE pOrg,LPBYTE pTgt,CSize szImg,CRect &rectIns); BOOL MakeCADLine(CHIP_INS_REGION & insRegion,std::multimap &mapData,CPoint &pointMin,CPoint &pointMax,SPLINECHIP_INS_METHOD enOpt=METHOD_INT_ROUND); double GetCAD2ImgOffset(std::multimap &mapData,CSISBuffer pBin,CPoint pointMin,CPoint pointMax,int nGap=30); void MakeInspectResultImage(CSISBuffer &pRes,std::multimap &mapIns); void MakeInspectResultImage(CSISBuffer &pRes,std::multimap &mapIns); void MakeSplineDebugImg(COwnerBuffer &pRes,std::multimap *pMaster,std::multimap *pData); BOOL MakeInspectLine(std::multimap &mapData,std::multimap &mapIns,double dYPos,SPLINECHIP_INS_METHOD enOpt=METHOD_INT_ROUND); double InspectChip(CEdgeProc &EdgeProc,CSISBuffer pOrg,CRect &insRect,CHIP_INS_REGION &insRegion,std::multimap &mapIns); int InspectChipBin(CEdgeProc &EdgeProc,CSISBuffer pOrg,CRect &insRect,CHIP_INS_REGION &insRegion,std::multimap &mapIns); int InspectChipBin_Diagonal(CEdgeProc &EdgeProc,CSISBuffer pOrg,CRect &insRect,CHIP_INS_REGION &insRegion,std::multimap &mapIns); int FilteringDefect(CHIP_INS_REGION &insRegion,std::multimap &mapIns,double dRes,int nJudge,CRect &insRect,BOOL bFlip); double FindThick(CEdgeProc &EdgeProc,CSISBuffer pOrg,CRect &insRect,CPoint pointSet,CPoint &pointRotate,double dTheta,int nDetThres); int AnalysisThick(CEdgeProc &EdgeProc,CRect rectImg,double dRes,int nJudgeThick,double dAvgThick,BOOL bFlip,std::multimap &mapIns); public: double m_dImageTheta; CPoint m_pointPosLeft; CPoint m_pointDiffImg; CSplineModel *m_pSpModel; std::multimap m_mapSplinePos; CChipBlob m_ResultDefect[MAX_SPLINE_DEFECT_COUNT]; double m_dRangeResult[SPLINE_RANGE_RESULT_CNT]; int m_nDefectCount; CSize m_szImageOrg; double m_dResultData[SPLINE_RESULT_DATA_CNT]; COwnerBuffer m_insSplineOrg,m_insSplineRes; CChamferInspect m_ChamferIns; int m_nSplineOffsetX; int m_nSplineOffsetY; int m_nCCCount; CSISBuffer *m_lpBuffer; int **m_pLabelMap; int m_nMaxContourIdx; int m_nMaxContourCount; int **m_pContourMap; int *m_pContourCnt; };