#pragma once #if defined(SG_API_LIBRARY) # define SG_APISHARED_EXPORT __declspec(dllexport) #else # define SG_APISHARED_EXPORT __declspec(dllimport) #endif #include "SG_baseDataType.h" #include #define ENABLE_CROSS_WISE_TEAR 0 #define OUTPUT_TEARING_POINTS 1 #define KEEP_GAP_AS_FEATURE 1 #define SCAN_BUFF_SIZE 21 //缓存区大小,缓存21条扫描线,处理中间扫描线 typedef struct { double scanXScale; //3D扫描的X精度,取决于两条扫描线的间距。 double scanYScale; //3D扫描的Y精度,取决于点间距。scanXScale和scanYScale可以在现场安装后扫描数据得到 double differnceBinTh; //一阶差分二值化门限。其物理意义为撕裂斜面的斜率值。默认为1.0 SSG_tearFeatureExtactPara extractPara; double tearingMinLen; //最小撕裂长度,达到此长度时输出撕裂 double tearingMinGap; //两个同位置的撕裂的间隔。小于此间隔时,视为同一个撕裂。 }SSG_beltTearingParam; typedef enum { keSG_tearType_Uknown = 0, keSG_tearType_MachineDir, //纵撕 keSG_tearType_CrossWise,//横撕 }ESG_tearType; typedef enum { keSG_tearStatus_Uknown = 0, keSG_tearStatus_New, //新发现的撕裂 keSG_tearStatus_Growing, //持续的撕裂 keSG_tearStatus_Ended, //撕裂结束 keSG_tearStatus_Invalid, //无效撕裂(可能被合并) }ESG_tearStatus; typedef struct { int tearID; //每个撕裂有个唯一的序号 ESG_tearStatus tearStatus; ESG_tearType tearType; int statLineIdx; //撕裂开始时的扫描线序号 int endLineIdx; //撕裂结束时的扫描线序号,当撕裂持续时,为最新的扫描线序号 double tearDepth;//撕裂深度。-1表示是贯穿型撕裂 double tearWidth;//撕裂宽度 SSG_ROIRectD roi; //撕裂的ROI范围,为{左,右,上,下} #if OUTPUT_TEARING_POINTS std::vector pts; //撕裂的边界点,debug或显示目的 #endif }SSG_beltTearingInfo; //处理状态机 typedef enum { keSG_HLineProc_Init = 0, //初态 keSG_HLineProc_First_Half, keSG_HLineProc_Wait_Second, keSG_HLineProc_Second_Half, }ESG_HLineProcSM; typedef struct { int hLineIdx; //SVzNL3DPosition scanBuff[SCAN_BUFF_SIZE]; //循环buff //int buffHead;//循环buff的头位置 //int buffSize;//循环buff SVzNL3DPosition preVldData; SVzNL3DPosition gapPos; ESG_HLineProcSM hLineSM; //水平扫描线处理状态机 SSG_RUN firstHalf; SVzNL3DPosition firstHalf_startPt; SVzNL3DPosition firstHalf_endPt; SSG_RUN secondHalf; SVzNL3DPosition secondHalf_startPt; SVzNL3DPosition secondHalf_endPt; double gapMaxZ; }SSG_hLineProInfo; void sg_detectBeltTearing( SVzNL3DLaserLine* laser3DPoints, //一条扫描线 int lineIdx, int nPointCount, //每条扫描线的点数量。当采用Grid数据格式时,每条扫描线的点的数量是相同的。必须使用Grid格式 int* errCode, std::vector& hLineWorkers, std::vector& beltTearings_new, std::vector& beltTearings_growing, std::vector& beltTearings_ended, std::vector& beltTearings_unknown, //未判明,应用无需处理。 const SSG_beltTearingParam measureParam);