beltTearingDetection

version 1.0.1 : 皮带撕裂: 添加撕裂Y方向最小和最大宽度, 以及非贯穿撕裂最小深度,用于滤除点云波动和雨刷运动时产生的虚拟Gap(中信重工)
This commit is contained in:
jerryzeng 2026-10-22 16:11:18 +08:00
parent 1883633fac
commit 68e7bb9839
3 changed files with 29 additions and 7 deletions

View File

@ -1051,13 +1051,16 @@ int main()
}; };
SVzNLRange fileIdx[TEST_GROUP] = { SVzNLRange fileIdx[TEST_GROUP] = {
{10,24}, {2, 18}, {16,16}, {1,2}, {1,3} }; {10,24}, {2, 18}, {16,16}, {1,2}, {2,3} };
double camPoseR[9] = { double camPoseR[9] = {
1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 1.0 }; 0.0, 0.0, 1.0 };
const char* ver = sg_beltTearingVersion();
printf("ver:%s\n", ver);
SSG_beltTearingParam algoParam; SSG_beltTearingParam algoParam;
algoParam.differnceBinTh = 2.0; // 1.0; algoParam.differnceBinTh = 2.0; // 1.0;
algoParam.extractPara.gapChkWin = 7; algoParam.extractPara.gapChkWin = 7;
@ -1067,6 +1070,10 @@ int main()
algoParam.tearingMinGap = 100.0; //两个同位置的纵撕的最小间隔。大于此门限视为两个撕裂 algoParam.tearingMinGap = 100.0; //两个同位置的纵撕的最小间隔。大于此门限视为两个撕裂
algoParam.tearingMinLen = 30.0; algoParam.tearingMinLen = 30.0;
algoParam.tearingMinDepth = 2.0; //对于非穿透型撕裂的检测最小深度,用于滤除点云波动形成的虚假撕裂
algoParam.tearingMinYWidth = 2.0; //撕裂在Y方向的最大宽度, 用于滤除雨刷运行产生的虚假Gap
algoParam.tearingMaxYWidth = 150; //撕裂在Y方向的最大宽度, 用于滤除雨刷运行产生的虚假Gap
char _scan_file[256]; char _scan_file[256];
int endGroup = TEST_GROUP - 1; int endGroup = TEST_GROUP - 1;
for (int grp = 4; grp <= endGroup; grp++) for (int grp = 4; grp <= endGroup; grp++)
@ -1120,7 +1127,7 @@ int main()
for (int lineIdx = 0; lineIdx < lineNum; lineIdx++) for (int lineIdx = 0; lineIdx < lineNum; lineIdx++)
{ {
if ((lineIdx == 56) || (lineIdx == 857)) if ((lineIdx == 56) || (lineIdx == 435))
int kkk = 1; int kkk = 1;
SVzNL3DLaserLine* a_line = &laser3DPoints[lineIdx]; SVzNL3DLaserLine* a_line = &laser3DPoints[lineIdx];
sg_detectBeltTearing( sg_detectBeltTearing(

View File

@ -6,7 +6,8 @@
#include "SG_errCode.h" #include "SG_errCode.h"
//version 1.0.0 : 皮带撕裂版本添加版本号后的基础版本 //version 1.0.0 : 皮带撕裂版本添加版本号后的基础版本
std::string m_strVersion = "BeltTearing 1.0.0"; //version 1.0.1 : 添加撕裂Y方向最小和最大宽度, 以及非贯穿撕裂最小深度,用于滤除点云波动和雨刷运动时产生的虚拟Gap(中信重工)
std::string m_strVersion = "BeltTearing 1.0.1";
const char* sg_beltTearingVersion(void) const char* sg_beltTearingVersion(void)
{ {
return m_strVersion.c_str(); return m_strVersion.c_str();
@ -226,7 +227,7 @@ void sg_bearTearing_vLineProc(
} }
} }
} }
if (end > start) //gap必须大于0 if (end > start+1) //gap必须大于1
{ {
//生成特征 //生成特征
SSG_basicFeatureGap a_feature; SSG_basicFeatureGap a_feature;
@ -324,9 +325,19 @@ void sg_bearTearing_vLineProc(
} }
} }
//排序 //排序
gapFeatureNum = (int)vLineFeatures.size();
if (gapFeatureNum > 0) if (gapFeatureNum > 0)
{ {
// //检查宽度
for (int i = gapFeatureNum - 1; i >= 0; i--)
{
if ( (vLineFeatures[i].gap_width > measureParam.tearingMaxYWidth) ||
(vLineFeatures[i].gap_width < measureParam.tearingMinYWidth) ||
((vLineFeatures[i].gap_depth >= 0) && (vLineFeatures[i].gap_depth < measureParam.tearingMinDepth)))
vLineFeatures.erase(vLineFeatures.begin() + i);
}
gapFeatureNum = (int)vLineFeatures.size();
if(gapFeatureNum > 0)
std::sort(vLineFeatures.begin(), vLineFeatures.end(), compareByStartY); std::sort(vLineFeatures.begin(), vLineFeatures.end(), compareByStartY);
} }
#endif #endif

View File

@ -6,7 +6,7 @@
#define ENABLE_CROSS_WISE_TEAR 0 #define ENABLE_CROSS_WISE_TEAR 0
#define OUTPUT_TEARING_POINTS 1 #define OUTPUT_TEARING_POINTS 1
#define KEEP_GAP_AS_FEATURE 1 #define KEEP_GAP_AS_FEATURE 1
#define SCAN_BUFF_SIZE 21 //缓存区大小,缓存21条扫描线,处理中间扫描线 #define SCAN_BUFF_SIZE 3 //缓存区大小,缓存21条扫描线,处理中间扫描线
typedef struct typedef struct
{ {
@ -16,6 +16,10 @@ typedef struct
SSG_tearFeatureExtactPara extractPara; SSG_tearFeatureExtactPara extractPara;
double tearingMinLen; //最小撕裂长度,达到此长度时输出撕裂 double tearingMinLen; //最小撕裂长度,达到此长度时输出撕裂
double tearingMinGap; //两个同位置的撕裂的间隔。小于此间隔时,视为同一个撕裂。 double tearingMinGap; //两个同位置的撕裂的间隔。小于此间隔时,视为同一个撕裂。
double tearingMinDepth; //对于非穿透型撕裂的检测最小深度,用于滤除点云波动形成的虚假撕裂
double tearingMinYWidth; //撕裂在Y方向的最小宽度, 用于滤除点云波动形成的虚假撕裂
double tearingMaxYWidth; //撕裂在Y方向的最大宽度
}SSG_beltTearingParam; }SSG_beltTearingParam;
typedef enum typedef enum