diff --git a/sourceCode/wheelArchHeigthMeasure.cpp b/sourceCode/wheelArchHeigthMeasure.cpp index d788fd4..8c85a08 100644 --- a/sourceCode/wheelArchHeigthMeasure.cpp +++ b/sourceCode/wheelArchHeigthMeasure.cpp @@ -16,7 +16,8 @@ //version 1.3.5 : 改进轮眉取点方法。 //version 1.3.6 : 轮眉到轮心高度计算方法进行了修正,重新从由两点距离修改为Y高度差。 //version 1.4.0 : 添加了标定块凹槽长度计算API。 -std::string m_strVersion = "1.4.0"; +//version 1.4.1 : 优化了标定块凹槽长度计算方法,使用前部1/4和后部1/4点计算,跳开中间波动比较大的点。 +std::string m_strVersion = "1.4.1"; const char* wd_wheelArchHeigthMeasureVersion(void) { return m_strVersion.c_str(); @@ -1215,27 +1216,31 @@ double wd_getCalibrationBlockLength( validLines.push_back(lineData); } - double sumGaugeLen = 0; - int sumSize = 0; + std::vector gaugeLen; int validLineNum = (int)validLines.size(); for (int i = 0; i < validLineNum; i++) { int validLinePtNum = (int)validLines[i].size(); SVzNL3DPosition first_pt = validLines[i][0]; SVzNL3DPosition last_pt = validLines[i].back(); + int midPtIdx_0 = validLinePtNum / 4; + int midPtIdx_1 = (validLinePtNum * 3) / 4; + SVzNL3DPosition mid_pt0 = validLines[i][midPtIdx_0]; + SVzNL3DPosition mid_pt1 = validLines[i][midPtIdx_1]; double totalLen = sqrt(pow(first_pt.pt3D.x - last_pt.pt3D.x, 2) + pow(first_pt.pt3D.y - last_pt.pt3D.y, 2) + pow(first_pt.pt3D.z - last_pt.pt3D.z, 2)); double lenDiff = abs(nominalTotalLen - totalLen); if ( (lenDiff < 10) &&(validLinePtNum>100)) { //计算凹槽长度 - double _a = 0, _b = 0, _c = 0; - compute2ptLine_2(first_pt.pt3D.y, first_pt.pt3D.z, last_pt.pt3D.y, last_pt.pt3D.z, &_a, &_b, &_c); - + double _a1 = 0, _b1 = 0, _c1 = 0; + compute2ptLine_2(first_pt.pt3D.y, first_pt.pt3D.z, mid_pt0.pt3D.y, mid_pt0.pt3D.z, &_a1, &_b1, &_c1); + double _a2 = 0, _b2 = 0, _c2 = 0; + compute2ptLine_2(mid_pt1.pt3D.y, mid_pt1.pt3D.z, last_pt.pt3D.y, last_pt.pt3D.z, &_a2, &_b2, &_c2); SVzNL3DPosition peakPt_1 = { 0, 0, 0 }; double maxLen_1 = -1; - for (int j = 0; j < validLinePtNum / 2; j++) + for (int j = 0; j < midPtIdx_0; j++) { - double len = computePtDistToLine(validLines[i][j].pt3D.y, validLines[i][j].pt3D.z, _a, _b, _c); + double len = computePtDistToLine(validLines[i][j].pt3D.y, validLines[i][j].pt3D.z, _a1, _b1, _c1); if (maxLen_1 < len) { peakPt_1 = validLines[i][j]; @@ -1245,9 +1250,9 @@ double wd_getCalibrationBlockLength( SVzNL3DPosition peakPt_2 = { 0, 0, 0 }; double maxLen_2 = -1; - for (int j = validLinePtNum / 2; j < validLinePtNum; j++) + for (int j = midPtIdx_1; j < validLinePtNum; j++) { - double len = computePtDistToLine(validLines[i][j].pt3D.y, validLines[i][j].pt3D.z, _a, _b, _c); + double len = computePtDistToLine(validLines[i][j].pt3D.y, validLines[i][j].pt3D.z, _a2, _b2, _c2); if (maxLen_2 < len) { peakPt_2 = validLines[i][j]; @@ -1258,8 +1263,7 @@ double wd_getCalibrationBlockLength( if ((maxLen_1 > 2.0) && (maxLen_2 > 2.0)) { double vLen = sqrt(pow(peakPt_1.pt3D.x - peakPt_2.pt3D.x, 2) + pow(peakPt_1.pt3D.y - peakPt_2.pt3D.y, 2) + pow(peakPt_1.pt3D.z - peakPt_2.pt3D.z, 2)); - sumGaugeLen += vLen; - sumSize++; + gaugeLen.push_back(vLen); #if _OUTPUT_DEBUG_DATA int nPtIdx_1 = peakPt_1.nPointIdx; int lineIdx_1 = nPtIdx_1 >> 16; @@ -1273,12 +1277,20 @@ double wd_getCalibrationBlockLength( } } } - if (sumSize == 0) + + if (gaugeLen.size() <= 3) { *errCode = SX_ERR_ZERO_OBJECTS; return -1; } - + //去除头尾 + double sumGaugeLen = 0; + int sumSize = 0; + for(int i = 1; i < (int)gaugeLen.size()-1; i ++) + { + sumGaugeLen += gaugeLen[i]; + sumSize++; + } sumGaugeLen = sumGaugeLen / sumSize; return sumGaugeLen; } \ No newline at end of file diff --git a/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp b/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp index 910451c..e4eaa38 100644 --- a/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp +++ b/wheelArchHeigthMeasure_test/wheelArchHeigthMeasure_test.cpp @@ -2968,7 +2968,7 @@ int main() char _scan_file[256]; - for (int grp = 0; grp <= 3; grp++) + for (int grp = 2; grp <= 3; grp++) { for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++) { @@ -2995,10 +2995,10 @@ int main() filterParam.outlierTh = 5; SSG_treeGrowParam growParam; - growParam.maxLineSkipNum = 10; - growParam.yDeviation_max = 20.0; - growParam.maxSkipDistance = 10.0; - growParam.zDeviation_max = 20.0;// + growParam.maxLineSkipNum = 5; + growParam.yDeviation_max = 5.0; + growParam.maxSkipDistance = 5.0; + growParam.zDeviation_max = 5.0;// growParam.minLTypeTreeLen = 100; //mm growParam.minVTypeTreeLen = 100; //mm SVzNLRangeD calibratiionBlockYRange = { -1000, 500 };