diff --git a/sourceCode/wheelArchHeigthMeasure.cpp b/sourceCode/wheelArchHeigthMeasure.cpp index 7f36d4b..6d3d3fc 100644 --- a/sourceCode/wheelArchHeigthMeasure.cpp +++ b/sourceCode/wheelArchHeigthMeasure.cpp @@ -11,7 +11,8 @@ //version 1.3.0 : 修正了寻找上下点使用固定门限的问题 //version 1.3.1 : 添加了一个检测轮毂是否存在的函数 //version 1.3.2 : 针对不理想点云改进了算法,增强鲁棒性 -std::string m_strVersion = "1.3.2"; +//version 1.3.3 : 轮眉点的提取进行了改进,修正了可能的取点错误 +std::string m_strVersion = "1.3.3"; const char* wd_wheelArchHeigthMeasureVersion(void) { return m_strVersion.c_str(); @@ -49,7 +50,7 @@ bool compareByPtSize(const SWD_clustersInfo& a, const SWD_clustersInfo& b) { } //提取轮眉区域的下端点 -void _getArcEndings(std::vector< std::vector>& scanLines, const int cluster_arc_id, std::vector& contourPts) +void _getArcEndings(std::vector< std::vector>& scanLines, const int cluster_arc_id, std::vector& contourPts, double maxZ) { int lineNum = (int)scanLines.size(); @@ -61,7 +62,7 @@ void _getArcEndings(std::vector< std::vector>& scanLines, const { if ((i == 380) && (j > 288)) int kkk = 1; - if ( (scanLines[i][j].nPointIdx == cluster_arc_id) && (scanLines[i][j].pt3D.z >1e-4)) + if ( (scanLines[i][j].nPointIdx == cluster_arc_id) && (scanLines[i][j].pt3D.z >1e-4) && (scanLines[i][j].pt3D.z < maxZ)) lastIdx = j; } if (lastIdx >= 0) @@ -906,7 +907,7 @@ WD_wheelArchInfo wd_wheelArchHeigthMeasure( //寻找轮眉点 //(1)快速寻找下端点(2)取中间区域,精确确定端点(3)抛物线拟合(4)计算轮眉点(最高点) std::vector arcEndings; - _getArcEndings(scanLines, 2, arcEndings); //轮眉的ID是2 + _getArcEndings(scanLines, 2, arcEndings, upWheelPt.z); //轮眉的ID是2 if (arcEndings.size() == 0) { *errCode = SX_ERR_INVALID_ARC; diff --git a/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp b/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp index 6ed16b4..f1f911f 100644 --- a/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp +++ b/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp @@ -2639,7 +2639,7 @@ void _outputScanDataFile_removeZeros(char* fileName, SVzNL3DLaserLine * scanData #define TEST_COMPUTE_WHEEL_ARCH 1 #define TEST_COMPUTE_CALIB_PARA 0 -#define TEST_GROUP 2 +#define TEST_GROUP 6 int main() { #if TEST_CONVERT_TO_GRID @@ -2718,10 +2718,14 @@ int main() const char* dataPath[TEST_GROUP] = { "F:/ShangGu/椤圭洰/鍐犻挦_杞湁楂樺害娴嬮噺/娴嬭瘯鏁版嵁/鐜板満鏁版嵁/", //0 "F:/ShangGu/椤圭洰/鍐犻挦_杞湁楂樺害娴嬮噺/娴嬭瘯鏁版嵁/閮ㄧ讲鐜板満鏁版嵁/", //1 + "F:/ShangGu/椤圭洰/鍐犻挦_杞湁楂樺害娴嬮噺/娴嬭瘯鏁版嵁/閮ㄧ讲鐜板満鏁版嵁2/11/", //2 + "F:/ShangGu/椤圭洰/鍐犻挦_杞湁楂樺害娴嬮噺/娴嬭瘯鏁版嵁/閮ㄧ讲鐜板満鏁版嵁2/13/", //3 + "F:/ShangGu/椤圭洰/鍐犻挦_杞湁楂樺害娴嬮噺/娴嬭瘯鏁版嵁/閮ㄧ讲鐜板満鏁版嵁2/15/", //4 + "F:/ShangGu/椤圭洰/鍐犻挦_杞湁楂樺害娴嬮噺/娴嬭瘯鏁版嵁/閮ㄧ讲鐜板満鏁版嵁2/17/", //5 }; SVzNLRange fileIdx[TEST_GROUP] = { - {1,2}, {1,4} + {1,2}, {1,4}, {1,7}, {1,7}, {1,7},{1,7} }; SSG_planeCalibPara poseCalibPara; @@ -2745,14 +2749,14 @@ int main() char _scan_file[256]; int endGroup = TEST_GROUP - 1; - for (int grp = 1; grp <= endGroup; grp++) + for (int grp = 2; 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 = 4; + //fidx = 6; sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx); std::vector> scanData; vzReadLaserScanPointFromFile_XYZ_vector(_scan_file, scanData); @@ -2784,9 +2788,9 @@ int main() SSG_treeGrowParam growParam; growParam.maxLineSkipNum = 10; - growParam.yDeviation_max = 10.0; + growParam.yDeviation_max = 20.0; growParam.maxSkipDistance = 10.0; - growParam.zDeviation_max = 10.0;// + growParam.zDeviation_max = 20.0;// growParam.minLTypeTreeLen = 100; //mm growParam.minVTypeTreeLen = 100; //mm