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.5 : 改进轮眉取点方法。
|
||||||
//version 1.3.6 : 轮眉到轮心高度计算方法进行了修正,重新从由两点距离修改为Y高度差。
|
//version 1.3.6 : 轮眉到轮心高度计算方法进行了修正,重新从由两点距离修改为Y高度差。
|
||||||
//version 1.4.0 : 添加了标定块凹槽长度计算API。
|
//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)
|
const char* wd_wheelArchHeigthMeasureVersion(void)
|
||||||
{
|
{
|
||||||
return m_strVersion.c_str();
|
return m_strVersion.c_str();
|
||||||
@ -1215,27 +1216,31 @@ double wd_getCalibrationBlockLength(
|
|||||||
validLines.push_back(lineData);
|
validLines.push_back(lineData);
|
||||||
}
|
}
|
||||||
|
|
||||||
double sumGaugeLen = 0;
|
std::vector<double> gaugeLen;
|
||||||
int sumSize = 0;
|
|
||||||
int validLineNum = (int)validLines.size();
|
int validLineNum = (int)validLines.size();
|
||||||
for (int i = 0; i < validLineNum; i++)
|
for (int i = 0; i < validLineNum; i++)
|
||||||
{
|
{
|
||||||
int validLinePtNum = (int)validLines[i].size();
|
int validLinePtNum = (int)validLines[i].size();
|
||||||
SVzNL3DPosition first_pt = validLines[i][0];
|
SVzNL3DPosition first_pt = validLines[i][0];
|
||||||
SVzNL3DPosition last_pt = validLines[i].back();
|
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 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);
|
double lenDiff = abs(nominalTotalLen - totalLen);
|
||||||
if ( (lenDiff < 10) &&(validLinePtNum>100))
|
if ( (lenDiff < 10) &&(validLinePtNum>100))
|
||||||
{
|
{
|
||||||
//计算凹槽长度
|
//计算凹槽长度
|
||||||
double _a = 0, _b = 0, _c = 0;
|
double _a1 = 0, _b1 = 0, _c1 = 0;
|
||||||
compute2ptLine_2(first_pt.pt3D.y, first_pt.pt3D.z, last_pt.pt3D.y, last_pt.pt3D.z, &_a, &_b, &_c);
|
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 };
|
SVzNL3DPosition peakPt_1 = { 0, 0, 0 };
|
||||||
double maxLen_1 = -1;
|
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)
|
if (maxLen_1 < len)
|
||||||
{
|
{
|
||||||
peakPt_1 = validLines[i][j];
|
peakPt_1 = validLines[i][j];
|
||||||
@ -1245,9 +1250,9 @@ double wd_getCalibrationBlockLength(
|
|||||||
|
|
||||||
SVzNL3DPosition peakPt_2 = { 0, 0, 0 };
|
SVzNL3DPosition peakPt_2 = { 0, 0, 0 };
|
||||||
double maxLen_2 = -1;
|
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)
|
if (maxLen_2 < len)
|
||||||
{
|
{
|
||||||
peakPt_2 = validLines[i][j];
|
peakPt_2 = validLines[i][j];
|
||||||
@ -1258,8 +1263,7 @@ double wd_getCalibrationBlockLength(
|
|||||||
if ((maxLen_1 > 2.0) && (maxLen_2 > 2.0))
|
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));
|
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;
|
gaugeLen.push_back(vLen);
|
||||||
sumSize++;
|
|
||||||
#if _OUTPUT_DEBUG_DATA
|
#if _OUTPUT_DEBUG_DATA
|
||||||
int nPtIdx_1 = peakPt_1.nPointIdx;
|
int nPtIdx_1 = peakPt_1.nPointIdx;
|
||||||
int lineIdx_1 = nPtIdx_1 >> 16;
|
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;
|
*errCode = SX_ERR_ZERO_OBJECTS;
|
||||||
return -1;
|
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;
|
sumGaugeLen = sumGaugeLen / sumSize;
|
||||||
return sumGaugeLen;
|
return sumGaugeLen;
|
||||||
}
|
}
|
||||||
@ -2968,7 +2968,7 @@ int main()
|
|||||||
|
|
||||||
char _scan_file[256];
|
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++)
|
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
|
||||||
{
|
{
|
||||||
@ -2995,10 +2995,10 @@ int main()
|
|||||||
filterParam.outlierTh = 5;
|
filterParam.outlierTh = 5;
|
||||||
|
|
||||||
SSG_treeGrowParam growParam;
|
SSG_treeGrowParam growParam;
|
||||||
growParam.maxLineSkipNum = 10;
|
growParam.maxLineSkipNum = 5;
|
||||||
growParam.yDeviation_max = 20.0;
|
growParam.yDeviation_max = 5.0;
|
||||||
growParam.maxSkipDistance = 10.0;
|
growParam.maxSkipDistance = 5.0;
|
||||||
growParam.zDeviation_max = 20.0;//
|
growParam.zDeviation_max = 5.0;//
|
||||||
growParam.minLTypeTreeLen = 100; //mm
|
growParam.minLTypeTreeLen = 100; //mm
|
||||||
growParam.minVTypeTreeLen = 100; //mm
|
growParam.minVTypeTreeLen = 100; //mm
|
||||||
SVzNLRangeD calibratiionBlockYRange = { -1000, 500 };
|
SVzNLRangeD calibratiionBlockYRange = { -1000, 500 };
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user