wheelArchHeigthMeasure version 1.4.1 :

优化了标定块凹槽长度计算方法,使用前部1/4和后部1/4点计算,跳开中间波动比较大的点。
This commit is contained in:
jerryzeng 2026-05-18 18:59:58 +08:00
parent bbad1650f2
commit 9d3cb1c18d
2 changed files with 31 additions and 19 deletions

View File

@ -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<double> 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;
}

View File

@ -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 };