wheelArchHeigthMeasure version 1.4.3 : 根据5.18数据进行轮毂检测算法优化,修改了参数。
This commit is contained in:
parent
7a372b05a7
commit
5378038e3b
@ -18,7 +18,8 @@
|
|||||||
//version 1.4.0 : 添加了标定块凹槽长度计算API。
|
//version 1.4.0 : 添加了标定块凹槽长度计算API。
|
||||||
//version 1.4.1 : 优化了标定块凹槽长度计算方法,使用前部1/4和后部1/4点计算,跳开中间波动比较大的点。
|
//version 1.4.1 : 优化了标定块凹槽长度计算方法,使用前部1/4和后部1/4点计算,跳开中间波动比较大的点。
|
||||||
//version 1.4.2 : 优化标定块凹槽长度计算方法,添加了噪点滤除。
|
//version 1.4.2 : 优化标定块凹槽长度计算方法,添加了噪点滤除。
|
||||||
std::string m_strVersion = "1.4.2";
|
//version 1.4.3 : 根据5.18数据进行轮毂检测算法优化,修改了参数。
|
||||||
|
std::string m_strVersion = "1.4.3";
|
||||||
const char* wd_wheelArchHeigthMeasureVersion(void)
|
const char* wd_wheelArchHeigthMeasureVersion(void)
|
||||||
{
|
{
|
||||||
return m_strVersion.c_str();
|
return m_strVersion.c_str();
|
||||||
@ -590,7 +591,10 @@ WD_wheelArchInfo wd_wheelArchHeigthMeasure(
|
|||||||
{
|
{
|
||||||
std::vector<SVzNL3DPosition>& lineData = scanLines[line];
|
std::vector<SVzNL3DPosition>& lineData = scanLines[line];
|
||||||
if (linePtNum != (int)lineData.size())
|
if (linePtNum != (int)lineData.size())
|
||||||
|
{
|
||||||
isGridData = false;
|
isGridData = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
//滤波,滤除异常点
|
//滤波,滤除异常点
|
||||||
sg_lineDataRemoveOutlier_changeOriginData(&lineData[0], linePtNum, filterParam);
|
sg_lineDataRemoveOutlier_changeOriginData(&lineData[0], linePtNum, filterParam);
|
||||||
}
|
}
|
||||||
@ -732,14 +736,16 @@ WD_wheelArchInfo wd_wheelArchHeigthMeasure(
|
|||||||
std::vector<std::vector<SWDIndexingVzPoint>> downEndings;
|
std::vector<std::vector<SWDIndexingVzPoint>> downEndings;
|
||||||
for (int line = 0; line < lineNum; line++)
|
for (int line = 0; line < lineNum; line++)
|
||||||
{
|
{
|
||||||
if (line == 319)
|
if (line == 281)
|
||||||
int kkk = 1;
|
int kkk = 1;
|
||||||
std::vector<SWDIndexingVzPoint> line_upEnding;
|
std::vector<SWDIndexingVzPoint> line_upEnding;
|
||||||
std::vector<SWDIndexingVzPoint> line_downEnding;
|
std::vector<SWDIndexingVzPoint> line_downEnding;
|
||||||
_lineProc_getWheelEnding(scanLines[line], line, line_upEnding, line_downEnding);
|
_lineProc_getWheelEnding(scanLines[line], line, line_upEnding, line_downEnding,
|
||||||
|
scale_segGap, scale_endingAngleLen, wheel_endingAngleTh);
|
||||||
upEndings.push_back(line_upEnding);
|
upEndings.push_back(line_upEnding);
|
||||||
downEndings.push_back(line_downEnding);
|
downEndings.push_back(line_downEnding);
|
||||||
}
|
}
|
||||||
|
|
||||||
//生长聚类
|
//生长聚类
|
||||||
std::vector<SSG_endingTree> upEndingTrees;
|
std::vector<SSG_endingTree> upEndingTrees;
|
||||||
_getWheelEndingGrowingTrees(upEndings, upEndingTrees, growParam);
|
_getWheelEndingGrowingTrees(upEndings, upEndingTrees, growParam);
|
||||||
@ -769,11 +775,43 @@ WD_wheelArchInfo wd_wheelArchHeigthMeasure(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double downEnding_maxBtmY = -DBL_MAX;
|
||||||
|
int minBtmIdx = -1;
|
||||||
for (int i = 0; i < (int)downEndingTrees.size(); i++)
|
for (int i = 0; i < (int)downEndingTrees.size(); i++)
|
||||||
{
|
{
|
||||||
|
double btmY_0 = _getBtmY(downEndingTrees[i]);
|
||||||
|
if (downEnding_maxBtmY < btmY_0)
|
||||||
|
{
|
||||||
|
downEnding_maxBtmY = btmY_0;
|
||||||
|
minBtmIdx = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(minBtmIdx < 0)
|
||||||
|
{
|
||||||
|
*errCode = SX_ERR_INVALID_WHEEL_EDGE;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
double downEnding_maxYopY = _getTopY(downEndingTrees[minBtmIdx]);
|
||||||
|
int downEnding_maxLeft = downEndingTrees[minBtmIdx].treeNodes[0].lineIdx;
|
||||||
|
int downEnding_maxRight = downEndingTrees[minBtmIdx].treeNodes.back().lineIdx;
|
||||||
|
for (int i = 0; i < (int)downEndingTrees.size(); i++)
|
||||||
|
{
|
||||||
|
if (i == minBtmIdx)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
double topY_0 = _getTopY(downEndingTrees[i]);
|
||||||
double btmY_0 = _getBtmY(downEndingTrees[i]);
|
double btmY_0 = _getBtmY(downEndingTrees[i]);
|
||||||
int left_0 = downEndingTrees[i].treeNodes[0].lineIdx;
|
int left_0 = downEndingTrees[i].treeNodes[0].lineIdx;
|
||||||
int right_0 = downEndingTrees[i].treeNodes.back().lineIdx;
|
int right_0 = downEndingTrees[i].treeNodes.back().lineIdx;
|
||||||
|
if((downEnding_maxRight > left_0) && (right_0 > downEnding_maxLeft)) //与最下方交叠
|
||||||
|
downEndingTrees[i].treeType = -1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(btmY_0 < downEnding_maxYopY )
|
||||||
|
downEndingTrees[i].treeType = -1;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
for (int j = i + 1; j < (int)downEndingTrees.size(); j++)
|
for (int j = i + 1; j < (int)downEndingTrees.size(); j++)
|
||||||
{
|
{
|
||||||
if (downEndingTrees[j].treeType < 0)
|
if (downEndingTrees[j].treeType < 0)
|
||||||
@ -790,7 +828,9 @@ WD_wheelArchInfo wd_wheelArchHeigthMeasure(
|
|||||||
downEndingTrees[j].treeType = -1;
|
downEndingTrees[j].treeType = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<SSG_endingTree> validDownEndingTrees;
|
std::vector<SSG_endingTree> validDownEndingTrees;
|
||||||
for (int i = 0; i < (int)downEndingTrees.size(); i++)
|
for (int i = 0; i < (int)downEndingTrees.size(); i++)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -2730,11 +2730,11 @@ void _outputScanDataFile_removeZeros(char* fileName, SVzNL3DLaserLine * scanData
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define TEST_CONVERT_TO_GRID 0
|
#define TEST_CONVERT_TO_GRID 0
|
||||||
#define TEST_COMPUTE_WHEEL_ARCH 0
|
#define TEST_COMPUTE_WHEEL_ARCH 1
|
||||||
#define TEST_CAMERA_ADJUSTING 1
|
#define TEST_CAMERA_ADJUSTING 0
|
||||||
#define TEST_COMPUTE_CALIB_PARA 0
|
#define TEST_COMPUTE_CALIB_PARA 0
|
||||||
|
|
||||||
#define TEST_GROUP 7
|
#define TEST_GROUP 11
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
#if TEST_CONVERT_TO_GRID
|
#if TEST_CONVERT_TO_GRID
|
||||||
@ -2819,11 +2819,15 @@ int main()
|
|||||||
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场数据2/15_C552/", //4
|
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场数据2/15_C552/", //4
|
||||||
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场数据2/17_C586/", //5
|
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场数据2/17_C586/", //5
|
||||||
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据/", //6
|
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据/", //6
|
||||||
|
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据2/右后轮/", //7
|
||||||
|
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据2/右前轮/", //8
|
||||||
|
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据2/左后轮/", //9
|
||||||
|
"F:/ShangGu/项目/冠钦_轮眉高度测量/测试数据/部署现场2数据2/左前轮/", //10
|
||||||
};
|
};
|
||||||
|
|
||||||
SVzNLRange fileIdx[TEST_GROUP] = {
|
SVzNLRange fileIdx[TEST_GROUP] = {
|
||||||
{1,2}, {1,4}, {27,41}, {27,41}, {27,41},{27,41}, {7,7}
|
{1,2}, {1,4}, {27,41}, {27,41}, {27,41},{27,41}, {7,7},
|
||||||
|
{1,37}, {1,37},{1,36},{1,38}
|
||||||
};
|
};
|
||||||
|
|
||||||
SSG_planeCalibPara poseCalibPara;
|
SSG_planeCalibPara poseCalibPara;
|
||||||
@ -2847,16 +2851,24 @@ int main()
|
|||||||
char _scan_file[256];
|
char _scan_file[256];
|
||||||
|
|
||||||
int endGroup = TEST_GROUP - 1;
|
int endGroup = TEST_GROUP - 1;
|
||||||
for (int grp = 6; grp <= endGroup; grp++)
|
for (int grp = 7; grp <= endGroup; grp++)
|
||||||
{
|
{
|
||||||
char calibFile[250];
|
char calibFile[250];
|
||||||
sprintf_s(calibFile, "%sground_calib_para.txt", dataPath[grp]);
|
sprintf_s(calibFile, "%sground_calib_para.txt", dataPath[grp]);
|
||||||
poseCalibPara = _readCalibPara(calibFile);
|
poseCalibPara = _readCalibPara(calibFile);
|
||||||
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
|
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
|
||||||
{
|
{
|
||||||
//fidx = 2;
|
//fidx = 38;
|
||||||
if(6 == grp)
|
if(6 == grp)
|
||||||
sprintf_s(_scan_file, "%s%d_LaserData_Jl26C575.txt", dataPath[grp], fidx);
|
sprintf_s(_scan_file, "%s%d_LaserData_Jl26C575.txt", dataPath[grp], fidx);
|
||||||
|
else if(7 == grp)
|
||||||
|
sprintf_s(_scan_file, "%s%d_右后轮.txt", dataPath[grp], fidx);
|
||||||
|
else if (8 == grp)
|
||||||
|
sprintf_s(_scan_file, "%s%d_右前轮.txt", dataPath[grp], fidx);
|
||||||
|
else if (9 == grp)
|
||||||
|
sprintf_s(_scan_file, "%s%d_左后轮.txt", dataPath[grp], fidx);
|
||||||
|
else if (10 == grp)
|
||||||
|
sprintf_s(_scan_file, "%s%d_左前轮.txt", dataPath[grp], fidx);
|
||||||
else
|
else
|
||||||
sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx);
|
sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx);
|
||||||
std::vector<std::vector< SVzNL3DPosition>> scanData;
|
std::vector<std::vector< SVzNL3DPosition>> scanData;
|
||||||
@ -2892,7 +2904,7 @@ int main()
|
|||||||
growParam.maxLineSkipNum = 10;
|
growParam.maxLineSkipNum = 10;
|
||||||
growParam.yDeviation_max = 20.0;
|
growParam.yDeviation_max = 20.0;
|
||||||
growParam.maxSkipDistance = 10.0;
|
growParam.maxSkipDistance = 10.0;
|
||||||
growParam.zDeviation_max = 20.0;//
|
growParam.zDeviation_max = 40.0;//
|
||||||
growParam.minLTypeTreeLen = 100; //mm
|
growParam.minLTypeTreeLen = 100; //mm
|
||||||
growParam.minVTypeTreeLen = 100; //mm
|
growParam.minVTypeTreeLen = 100; //mm
|
||||||
|
|
||||||
@ -2936,7 +2948,16 @@ int main()
|
|||||||
sprintf_s(_dbg_file, "%sresult\\LaserLine%d_result.txt", dataPath[grp], fidx);
|
sprintf_s(_dbg_file, "%sresult\\LaserLine%d_result.txt", dataPath[grp], fidx);
|
||||||
_outputScanDataFile_RGBD_obj(_dbg_file, scanData, 0, 0, 0, wheelArcHeight);
|
_outputScanDataFile_RGBD_obj(_dbg_file, scanData, 0, 0, 0, wheelArcHeight);
|
||||||
#endif
|
#endif
|
||||||
printf("%s: arcY=%f, upPtY=%f, height=%f, arcToGrund=%f, time=%d(ms)!\n", _scan_file, wheelArcHeight.wheelArchPos.y, wheelArcHeight.wheelUpPos.y, wheelArcHeight.archToCenterHeigth, wheelArcHeight.archToGroundHeigth, (int)(t2 - t1));
|
if(SG_ERR_NOT_GRID_FORMAT == errCode)
|
||||||
|
printf("%s: arcY=%f, upPtY=%f, height=%f, arcToGrund=%f, time=%d(ms), errCode=不是栅格数据\n", _scan_file,
|
||||||
|
wheelArcHeight.wheelArchPos.y, wheelArcHeight.wheelUpPos.y,
|
||||||
|
wheelArcHeight.archToCenterHeigth, wheelArcHeight.archToGroundHeigth,
|
||||||
|
(int)(t2 - t1));
|
||||||
|
else
|
||||||
|
printf("%s: arcY=%f, upPtY=%f, height=%f, arcToGrund=%f, time=%d(ms), errCode=%d\n", _scan_file,
|
||||||
|
wheelArcHeight.wheelArchPos.y, wheelArcHeight.wheelUpPos.y,
|
||||||
|
wheelArcHeight.archToCenterHeigth, wheelArcHeight.archToGroundHeigth,
|
||||||
|
(int)(t2 - t1), errCode);
|
||||||
double len = sqrt(pow(wheelArcHeight.wheelUpPos.x - wheelArcHeight.wheelDownPos.x, 2) +
|
double len = sqrt(pow(wheelArcHeight.wheelUpPos.x - wheelArcHeight.wheelDownPos.x, 2) +
|
||||||
pow(wheelArcHeight.wheelUpPos.y - wheelArcHeight.wheelDownPos.y, 2) +
|
pow(wheelArcHeight.wheelUpPos.y - wheelArcHeight.wheelDownPos.y, 2) +
|
||||||
pow(wheelArcHeight.wheelUpPos.z - wheelArcHeight.wheelDownPos.z, 2));
|
pow(wheelArcHeight.wheelUpPos.z - wheelArcHeight.wheelDownPos.z, 2));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user