From 5378038e3b5ad7a3a236d791009692e1e1fdfb5d Mon Sep 17 00:00:00 2001 From: jerryzeng Date: Thu, 21 May 2026 12:17:38 +0800 Subject: [PATCH] =?UTF-8?q?wheelArchHeigthMeasure=20version=201.4.3=20:=20?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE5.18=E6=95=B0=E6=8D=AE=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E8=BD=AE=E6=AF=82=E6=A3=80=E6=B5=8B=E7=AE=97=E6=B3=95=E4=BC=98?= =?UTF-8?q?=E5=8C=96,=E4=BF=AE=E6=94=B9=E4=BA=86=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sourceCode/wheelArchHeigthMeasure.cpp | 46 +++++++++++++++++-- .../wheelArchHeigthMeasure_test.cpp | 39 ++++++++++++---- 2 files changed, 73 insertions(+), 12 deletions(-) diff --git a/sourceCode/wheelArchHeigthMeasure.cpp b/sourceCode/wheelArchHeigthMeasure.cpp index f15c5f1..f375388 100644 --- a/sourceCode/wheelArchHeigthMeasure.cpp +++ b/sourceCode/wheelArchHeigthMeasure.cpp @@ -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& 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> downEndings; for (int line = 0; line < lineNum; line++) { - if (line == 319) + if (line == 281) int kkk = 1; std::vector line_upEnding; std::vector 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 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 validDownEndingTrees; for (int i = 0; i < (int)downEndingTrees.size(); i++) { diff --git a/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp b/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp index e747483..85e13e1 100644 --- a/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp +++ b/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp @@ -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> 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));