wheelArchHeigthMeasure version 1.4.1 :
优化了标定块凹槽长度计算方法,使用前部1/4和后部1/4点计算,跳开中间波动比较大的点。
This commit is contained in:
parent
bbad1650f2
commit
9d3cb1c18d
@ -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;
|
||||
}
|
||||
@ -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 };
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user