wheelArchHeigthMeasure version 1.4.3 : 根据5.18数据进行轮毂检测算法优化,修改了参数。

This commit is contained in:
jerryzeng 2026-05-21 12:17:38 +08:00
parent 7a372b05a7
commit 5378038e3b
2 changed files with 73 additions and 12 deletions

View File

@ -18,7 +18,8 @@
//version 1.4.0 : 添加了标定块凹槽长度计算API。
//version 1.4.1 : 优化了标定块凹槽长度计算方法使用前部1/4和后部1/4点计算跳开中间波动比较大的点。
//version 1.4.2 : 优化标定块凹槽长度计算方法,添加了噪点滤除。
std::string m_strVersion = "1.4.2";
//version 1.4.3 : 根据5.18数据进行轮毂检测算法优化,修改了参数。
std::string m_strVersion = "1.4.3";
const char* wd_wheelArchHeigthMeasureVersion(void)
{
return m_strVersion.c_str();
@ -590,7 +591,10 @@ WD_wheelArchInfo wd_wheelArchHeigthMeasure(
{
std::vector<SVzNL3DPosition>& lineData = scanLines[line];
if (linePtNum != (int)lineData.size())
{
isGridData = false;
break;
}
//滤波,滤除异常点
sg_lineDataRemoveOutlier_changeOriginData(&lineData[0], linePtNum, filterParam);
}
@ -732,14 +736,16 @@ WD_wheelArchInfo wd_wheelArchHeigthMeasure(
std::vector<std::vector<SWDIndexingVzPoint>> downEndings;
for (int line = 0; line < lineNum; line++)
{
if (line == 319)
if (line == 281)
int kkk = 1;
std::vector<SWDIndexingVzPoint> line_upEnding;
std::vector<SWDIndexingVzPoint> line_downEnding;
_lineProc_getWheelEnding(scanLines[line], line, line_upEnding, line_downEnding);
_lineProc_getWheelEnding(scanLines[line], line, line_upEnding, line_downEnding,
scale_segGap, scale_endingAngleLen, wheel_endingAngleTh);
upEndings.push_back(line_upEnding);
downEndings.push_back(line_downEnding);
}
//生长聚类
std::vector<SSG_endingTree> upEndingTrees;
_getWheelEndingGrowingTrees(upEndings, upEndingTrees, growParam);
@ -769,11 +775,43 @@ WD_wheelArchInfo wd_wheelArchHeigthMeasure(
}
}
double downEnding_maxBtmY = -DBL_MAX;
int minBtmIdx = -1;
for (int i = 0; i < (int)downEndingTrees.size(); i++)
{
double btmY_0 = _getBtmY(downEndingTrees[i]);
if (downEnding_maxBtmY < btmY_0)
{
downEnding_maxBtmY = btmY_0;
minBtmIdx = i;
}
}
if(minBtmIdx < 0)
{
*errCode = SX_ERR_INVALID_WHEEL_EDGE;
return result;
}
double downEnding_maxYopY = _getTopY(downEndingTrees[minBtmIdx]);
int downEnding_maxLeft = downEndingTrees[minBtmIdx].treeNodes[0].lineIdx;
int downEnding_maxRight = downEndingTrees[minBtmIdx].treeNodes.back().lineIdx;
for (int i = 0; i < (int)downEndingTrees.size(); i++)
{
if (i == minBtmIdx)
continue;
double topY_0 = _getTopY(downEndingTrees[i]);
double btmY_0 = _getBtmY(downEndingTrees[i]);
int left_0 = downEndingTrees[i].treeNodes[0].lineIdx;
int right_0 = downEndingTrees[i].treeNodes.back().lineIdx;
if((downEnding_maxRight > left_0) && (right_0 > downEnding_maxLeft)) //与最下方交叠
downEndingTrees[i].treeType = -1;
else
{
if(btmY_0 < downEnding_maxYopY )
downEndingTrees[i].treeType = -1;
}
#if 0
for (int j = i + 1; j < (int)downEndingTrees.size(); j++)
{
if (downEndingTrees[j].treeType < 0)
@ -790,7 +828,9 @@ WD_wheelArchInfo wd_wheelArchHeigthMeasure(
downEndingTrees[j].treeType = -1;
}
}
#endif
}
std::vector<SSG_endingTree> validDownEndingTrees;
for (int i = 0; i < (int)downEndingTrees.size(); i++)
{

View File

@ -2730,11 +2730,11 @@ void _outputScanDataFile_removeZeros(char* fileName, SVzNL3DLaserLine * scanData
}
#define TEST_CONVERT_TO_GRID 0
#define TEST_COMPUTE_WHEEL_ARCH 0
#define TEST_CAMERA_ADJUSTING 1
#define TEST_COMPUTE_WHEEL_ARCH 1
#define TEST_CAMERA_ADJUSTING 0
#define TEST_COMPUTE_CALIB_PARA 0
#define TEST_GROUP 7
#define TEST_GROUP 11
int main()
{
#if TEST_CONVERT_TO_GRID
@ -2819,11 +2819,15 @@ int main()
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场数据2/15_C552/", //4
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场数据2/17_C586/", //5
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据/", //6
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据2/右后轮/", //7
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据2/右前轮/", //8
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据2/左后轮/", //9
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据2/左前轮/", //10
};
SVzNLRange fileIdx[TEST_GROUP] = {
{1,2}, {1,4}, {27,41}, {27,41}, {27,41},{27,41}, {7,7}
{1,2}, {1,4}, {27,41}, {27,41}, {27,41},{27,41}, {7,7},
{1,37}, {1,37},{1,36},{1,38}
};
SSG_planeCalibPara poseCalibPara;
@ -2847,16 +2851,24 @@ int main()
char _scan_file[256];
int endGroup = TEST_GROUP - 1;
for (int grp = 6; grp <= endGroup; grp++)
for (int grp = 7; grp <= endGroup; grp++)
{
char calibFile[250];
sprintf_s(calibFile, "%sground_calib_para.txt", dataPath[grp]);
poseCalibPara = _readCalibPara(calibFile);
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
{
//fidx = 2;
//fidx = 38;
if(6 == grp)
sprintf_s(_scan_file, "%s%d_LaserData_Jl26C575.txt", dataPath[grp], fidx);
else if(7 == grp)
sprintf_s(_scan_file, "%s%d_右后轮.txt", dataPath[grp], fidx);
else if (8 == grp)
sprintf_s(_scan_file, "%s%d_右前轮.txt", dataPath[grp], fidx);
else if (9 == grp)
sprintf_s(_scan_file, "%s%d_左后轮.txt", dataPath[grp], fidx);
else if (10 == grp)
sprintf_s(_scan_file, "%s%d_左前轮.txt", dataPath[grp], fidx);
else
sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx);
std::vector<std::vector< SVzNL3DPosition>> scanData;
@ -2892,7 +2904,7 @@ int main()
growParam.maxLineSkipNum = 10;
growParam.yDeviation_max = 20.0;
growParam.maxSkipDistance = 10.0;
growParam.zDeviation_max = 20.0;//
growParam.zDeviation_max = 40.0;//
growParam.minLTypeTreeLen = 100; //mm
growParam.minVTypeTreeLen = 100; //mm
@ -2936,7 +2948,16 @@ int main()
sprintf_s(_dbg_file, "%sresult\\LaserLine%d_result.txt", dataPath[grp], fidx);
_outputScanDataFile_RGBD_obj(_dbg_file, scanData, 0, 0, 0, wheelArcHeight);
#endif
printf("%s: arcY=%f, upPtY=%f, height=%f, arcToGrund=%f, time=%d(ms)!\n", _scan_file, wheelArcHeight.wheelArchPos.y, wheelArcHeight.wheelUpPos.y, wheelArcHeight.archToCenterHeigth, wheelArcHeight.archToGroundHeigth, (int)(t2 - t1));
if(SG_ERR_NOT_GRID_FORMAT == errCode)
printf("%s: arcY=%f, upPtY=%f, height=%f, arcToGrund=%f, time=%d(ms), errCode=不是栅格数据\n", _scan_file,
wheelArcHeight.wheelArchPos.y, wheelArcHeight.wheelUpPos.y,
wheelArcHeight.archToCenterHeigth, wheelArcHeight.archToGroundHeigth,
(int)(t2 - t1));
else
printf("%s: arcY=%f, upPtY=%f, height=%f, arcToGrund=%f, time=%d(ms), errCode=%d\n", _scan_file,
wheelArcHeight.wheelArchPos.y, wheelArcHeight.wheelUpPos.y,
wheelArcHeight.archToCenterHeigth, wheelArcHeight.archToGroundHeigth,
(int)(t2 - t1), errCode);
double len = sqrt(pow(wheelArcHeight.wheelUpPos.x - wheelArcHeight.wheelDownPos.x, 2) +
pow(wheelArcHeight.wheelUpPos.y - wheelArcHeight.wheelDownPos.y, 2) +
pow(wheelArcHeight.wheelUpPos.z - wheelArcHeight.wheelDownPos.z, 2));