rodAndBarDetection version 1.2.5 :
添加筑裕钢筋焊缝提取API
This commit is contained in:
parent
2757c09682
commit
c14a77e5a2
@ -780,16 +780,22 @@ void _outputRGBDScan_RGBD_weldSeam(
|
|||||||
int centerFlag = pt3D->nPointIdx >> 4;
|
int centerFlag = pt3D->nPointIdx >> 4;
|
||||||
if (centerFlag > 0)
|
if (centerFlag > 0)
|
||||||
{
|
{
|
||||||
rgb = { 180, 0, 0 };
|
if (centerFlag <= 2)
|
||||||
size = 2;
|
{
|
||||||
|
rgb = { 180, 0, 0 };
|
||||||
|
size = 2;
|
||||||
|
}
|
||||||
|
else if(centerFlag == 4)
|
||||||
|
{
|
||||||
|
rgb = { 0, 250, 0 };
|
||||||
|
size = 4;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rgb = objColor[pt3D->nPointIdx % 8];
|
rgb = objColor[pt3D->nPointIdx % 8];
|
||||||
size = 2;
|
size = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else //if (pt3D->nPointIdx == 0)
|
else //if (pt3D->nPointIdx == 0)
|
||||||
{
|
{
|
||||||
@ -807,52 +813,75 @@ void _outputRGBDScan_RGBD_weldSeam(
|
|||||||
|
|
||||||
if (objNum > 0)
|
if (objNum > 0)
|
||||||
{
|
{
|
||||||
sw << "Line_" << lineIdx << "_0_" << objNum << std::endl;
|
std::vector<SVzNL3DPoint> weldPoints;
|
||||||
size = 12;
|
|
||||||
for (int i = 0; i < objNum; i++)
|
for (int i = 0; i < objNum; i++)
|
||||||
{
|
{
|
||||||
if (i == 0)
|
if (weldSeamInfo[i].weldType == KeWD_WELD_POINT)
|
||||||
rgb = { 250, 255, 0 };
|
weldPoints.push_back(weldSeamInfo[i].center);
|
||||||
else
|
else
|
||||||
rgb = { 250, 0, 0 };
|
{
|
||||||
float x = (float)weldSeamInfo[i].center.x;
|
weldPoints.push_back(weldSeamInfo[i].startPt);
|
||||||
float y = (float)weldSeamInfo[i].center.y;
|
weldPoints.push_back(weldSeamInfo[i].center);
|
||||||
float z = (float)weldSeamInfo[i].center.z;
|
weldPoints.push_back(weldSeamInfo[i].endPt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sw << "Line_" << lineIdx << "_0_" << (int)weldPoints.size() << std::endl;
|
||||||
|
size = 15;
|
||||||
|
for (int i = 0; i < (int)weldPoints.size(); i++)
|
||||||
|
{
|
||||||
|
rgb = { 250, 0, 0 };
|
||||||
|
float x = (float)weldPoints[i].x;
|
||||||
|
float y = (float)weldPoints[i].y;
|
||||||
|
float z = (float)weldPoints[i].z;
|
||||||
sw << "{" << x << "," << y << "," << z << "}-";
|
sw << "{" << x << "," << y << "," << z << "}-";
|
||||||
sw << "{0,0}-{0,0}-";
|
sw << "{0,0}-{0,0}-";
|
||||||
sw << "{" << rgb.r << "," << rgb.g << "," << rgb.b << "," << size << " }" << std::endl;
|
sw << "{" << rgb.r << "," << rgb.g << "," << rgb.b << "," << size << " }" << std::endl;
|
||||||
}
|
}
|
||||||
//输出法向
|
//输出法向
|
||||||
size = 8;
|
size = 4;
|
||||||
double len = 60;
|
double len1 = 20;
|
||||||
|
double len2 = 20;
|
||||||
lineIdx = 0;
|
lineIdx = 0;
|
||||||
for (int i = 0; i < objNum; i++)
|
for (int i = 0; i < objNum; i++)
|
||||||
{
|
{
|
||||||
if (i == 0)
|
SVzNL3DPoint pt0, pt1;
|
||||||
rgb = { 250, 255, 0 };
|
if (weldSeamInfo[i].weldType == KeWD_WELD_POINT)
|
||||||
|
{
|
||||||
|
pt0 = weldSeamInfo[i].center;
|
||||||
|
pt1 = { weldSeamInfo[i].center.x + len1 * weldSeamInfo[i].axialDir.x,
|
||||||
|
weldSeamInfo[i].center.y + len1 * weldSeamInfo[i].axialDir.y,
|
||||||
|
weldSeamInfo[i].center.z + len1 * weldSeamInfo[i].axialDir.z };
|
||||||
|
}
|
||||||
else
|
else
|
||||||
rgb = { 250, 0, 0 };
|
{
|
||||||
SVzNL3DPoint pt0 = { weldSeamInfo[i].center.x, weldSeamInfo[i].center.y, weldSeamInfo[i].center.z };
|
pt0 = weldSeamInfo[i].startPt;
|
||||||
SVzNL3DPoint pt2 = { weldSeamInfo[i].center.x + len * weldSeamInfo[i].normalDir.x,
|
pt1 = weldSeamInfo[i].endPt;
|
||||||
weldSeamInfo[i].center.y + len * weldSeamInfo[i].normalDir.y,
|
}
|
||||||
weldSeamInfo[i].center.z + len * weldSeamInfo[i].normalDir.z };
|
|
||||||
|
SVzNL3DPoint pt2 = { weldSeamInfo[i].center.x, weldSeamInfo[i].center.y, weldSeamInfo[i].center.z };
|
||||||
|
SVzNL3DPoint pt3 = { weldSeamInfo[i].center.x + len2 * weldSeamInfo[i].normalDir.x,
|
||||||
|
weldSeamInfo[i].center.y + len2 * weldSeamInfo[i].normalDir.y,
|
||||||
|
weldSeamInfo[i].center.z + len2 * weldSeamInfo[i].normalDir.z };
|
||||||
//显示轴向量
|
//显示轴向量
|
||||||
sw << "Poly_" << lineIdx << "_2" << std::endl;
|
rgb = { 0, 0, 250 };
|
||||||
sw << "{" << (float)weldSeamInfo[i].startPt.x << "," << (float)weldSeamInfo[i].startPt.y << "," << (float)weldSeamInfo[i].startPt.z << "}-";
|
|
||||||
sw << "{0,0}-{0,0}-";
|
|
||||||
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
|
|
||||||
sw << "{" << (float)weldSeamInfo[i].endPt.x << "," << (float)weldSeamInfo[i].endPt.y << "," << (float)weldSeamInfo[i].endPt.z << "}-";
|
|
||||||
sw << "{0,0}-{0,0}-";
|
|
||||||
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
|
|
||||||
lineIdx++;
|
|
||||||
//显示法向量
|
|
||||||
sw << "Poly_" << lineIdx << "_2" << std::endl;
|
sw << "Poly_" << lineIdx << "_2" << std::endl;
|
||||||
sw << "{" << (float)pt0.x << "," << (float)pt0.y << "," << (float)pt0.z << "}-";
|
sw << "{" << (float)pt0.x << "," << (float)pt0.y << "," << (float)pt0.z << "}-";
|
||||||
sw << "{0,0}-{0,0}-";
|
sw << "{0,0}-{0,0}-";
|
||||||
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
|
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
|
||||||
|
sw << "{" << (float)pt1.x << "," << (float)pt1.y << "," << (float)pt1.z << "}-";
|
||||||
|
sw << "{0,0}-{0,0}-";
|
||||||
|
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
|
||||||
|
lineIdx++;
|
||||||
|
//显示法向量
|
||||||
|
rgb = { 250, 0, 0 };
|
||||||
|
sw << "Poly_" << lineIdx << "_2" << std::endl;
|
||||||
sw << "{" << (float)pt2.x << "," << (float)pt2.y << "," << (float)pt2.z << "}-";
|
sw << "{" << (float)pt2.x << "," << (float)pt2.y << "," << (float)pt2.z << "}-";
|
||||||
sw << "{0,0}-{0,0}-";
|
sw << "{0,0}-{0,0}-";
|
||||||
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
|
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
|
||||||
|
sw << "{" << (float)pt3.x << "," << (float)pt3.y << "," << (float)pt3.z << "}-";
|
||||||
|
sw << "{0,0}-{0,0}-";
|
||||||
|
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
|
||||||
lineIdx++;
|
lineIdx++;
|
||||||
}
|
}
|
||||||
lineIdx++;
|
lineIdx++;
|
||||||
@ -1156,18 +1185,19 @@ void rodWeldSeamPosition_test(void)
|
|||||||
cornerParam.jumpCornerTh_2 = 60;
|
cornerParam.jumpCornerTh_2 = 60;
|
||||||
|
|
||||||
SSG_outlierFilterParam filterParam;
|
SSG_outlierFilterParam filterParam;
|
||||||
filterParam.continuityTh = 5.0; //噪声滤除。当相邻点的z跳变大于此门限时,检查是否为噪声。若长度小于outlierLen, 视为噪声
|
filterParam.continuityTh = 4.0; //噪声滤除。当相邻点的z跳变大于此门限时,检查是否为噪声。若长度小于outlierLen, 视为噪声
|
||||||
filterParam.outlierTh = 5;
|
filterParam.outlierTh = 4;
|
||||||
|
|
||||||
SSG_treeGrowParam growParam;
|
SSG_treeGrowParam growParam;
|
||||||
growParam.maxLineSkipNum = 5;
|
growParam.maxLineSkipNum = 5;
|
||||||
growParam.yDeviation_max = 10.0;
|
growParam.yDeviation_max = 5.0;
|
||||||
growParam.maxSkipDistance = 20.0;
|
growParam.maxSkipDistance = 20.0;
|
||||||
growParam.zDeviation_max = 10.0;//
|
growParam.zDeviation_max = 3.0;//
|
||||||
growParam.minLTypeTreeLen = 50; //mm, 螺杆长度
|
growParam.minLTypeTreeLen = 50; //mm, 螺杆长度
|
||||||
growParam.minVTypeTreeLen = 50; //mm
|
growParam.minVTypeTreeLen = 50; //mm
|
||||||
|
|
||||||
bool isHorizonScan = true; //true:激光线平行槽道;false:激光线垂直槽道
|
bool isHorizonScan = true; //true:激光线平行槽道;false:激光线垂直槽道
|
||||||
|
double weldSeanRange = 100; //焊缝距钢筋交叉点的范围(最大值)
|
||||||
int errCode = 0;
|
int errCode = 0;
|
||||||
std::vector<SSX_weldSeamInfo> weldSeamInfo;
|
std::vector<SSX_weldSeamInfo> weldSeamInfo;
|
||||||
sx_rebarWeldSeamPositioning(
|
sx_rebarWeldSeamPositioning(
|
||||||
@ -1177,6 +1207,7 @@ void rodWeldSeamPosition_test(void)
|
|||||||
filterParam,
|
filterParam,
|
||||||
growParam,
|
growParam,
|
||||||
rodParam,
|
rodParam,
|
||||||
|
weldSeanRange,
|
||||||
weldSeamInfo,
|
weldSeamInfo,
|
||||||
&errCode);
|
&errCode);
|
||||||
long t2 = (long)GetTickCount64();
|
long t2 = (long)GetTickCount64();
|
||||||
@ -1192,7 +1223,7 @@ void rodWeldSeamPosition_test(void)
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
#if 1 //螺杆定位测试
|
#if 0 //螺杆定位测试
|
||||||
#if 0
|
#if 0
|
||||||
screwTest();
|
screwTest();
|
||||||
#else
|
#else
|
||||||
|
|||||||
@ -47,3 +47,6 @@
|
|||||||
//配天工件定位
|
//配天工件定位
|
||||||
#define SX_ERR_UNKNOWN_PLATE_DIR -2601
|
#define SX_ERR_UNKNOWN_PLATE_DIR -2601
|
||||||
|
|
||||||
|
//蓼淘보룹땍貫
|
||||||
|
#define SX_ERR_NO_HIGHEST_ROD -2701
|
||||||
|
|
||||||
|
|||||||
@ -843,7 +843,7 @@ void wd_getRodArcFeatureGrowingTrees(
|
|||||||
{
|
{
|
||||||
for (int i = 0, i_max = (int)all_lineFeatures.size(); i < i_max; i++)
|
for (int i = 0, i_max = (int)all_lineFeatures.size(); i < i_max; i++)
|
||||||
{
|
{
|
||||||
if (i == 424)
|
if (i == 1147)
|
||||||
int kkk = 1;
|
int kkk = 1;
|
||||||
std::vector<SWD_rodArcFeature>& a_lineFeatures = all_lineFeatures[i];
|
std::vector<SWD_rodArcFeature>& a_lineFeatures = all_lineFeatures[i];
|
||||||
for (int j = 0, j_max = (int)a_lineFeatures.size(); j < j_max; j++)
|
for (int j = 0, j_max = (int)a_lineFeatures.size(); j < j_max; j++)
|
||||||
|
|||||||
@ -3824,10 +3824,64 @@ bool compareByPtIdx(const SSG_basicFeature1D& a, const SSG_basicFeature1D& b) {
|
|||||||
return a.jumpPos2D.y < b.jumpPos2D.y;
|
return a.jumpPos2D.y < b.jumpPos2D.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//根据距离连续性分段
|
||||||
|
void wd_lineDataSegment_dist(
|
||||||
|
std::vector< SWD3DPointPostion>& lineData,
|
||||||
|
std::vector<SSG_RUN>& segs,
|
||||||
|
const double maxDistTh,
|
||||||
|
const int minSegSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
int dataSize = (int)lineData.size();
|
||||||
|
int runIdx = 1;
|
||||||
|
SSG_RUN a_run = { 0, -1, 0 }; //startIdx, len, lastIdx
|
||||||
|
double pre_z = 0;
|
||||||
|
double pre_y = 0;
|
||||||
|
for (int i = 0; i < dataSize; i++)
|
||||||
|
{
|
||||||
|
if (lineData[i].point.z > 1e-4)
|
||||||
|
{
|
||||||
|
if (a_run.len < 0)
|
||||||
|
{
|
||||||
|
a_run.start = i;
|
||||||
|
a_run.len = 1;
|
||||||
|
a_run.value = i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double dist = sqrt(pow(lineData[i].point.y - pre_y, 2) + pow(lineData[i].point.z - pre_z, 2));
|
||||||
|
if (dist < maxDistTh)
|
||||||
|
{
|
||||||
|
a_run.len = i - a_run.start + 1;
|
||||||
|
a_run.value = i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
a_run.value = runIdx;
|
||||||
|
runIdx++;
|
||||||
|
if(a_run.len >= minSegSize)
|
||||||
|
segs.push_back(a_run);
|
||||||
|
|
||||||
|
a_run.start = i;
|
||||||
|
a_run.len = 1;
|
||||||
|
a_run.value = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pre_y = lineData[i].point.y;
|
||||||
|
pre_z = lineData[i].point.z;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (a_run.len > 0)
|
||||||
|
{
|
||||||
|
if(a_run.len >= minSegSize)
|
||||||
|
segs.push_back(a_run);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//根据Z连续性分段
|
//根据Z连续性分段
|
||||||
void wd_lineDataSegment_zDist(
|
void wd_lineDataSegment_zDist(
|
||||||
std::vector< SVzNL3DPosition>& lineData,
|
std::vector< SVzNL3DPosition>& lineData,
|
||||||
std::vector< SVzNL3DPosition>& vldPts,
|
std::vector< SVzNL3DPosition>& vldPts,
|
||||||
std::vector<SSG_RUN_EX>& segs,
|
std::vector<SSG_RUN_EX>& segs,
|
||||||
std::vector<int>& backIndexing,
|
std::vector<int>& backIndexing,
|
||||||
const SSG_cornerParam cornerPara
|
const SSG_cornerParam cornerPara
|
||||||
@ -4218,6 +4272,7 @@ bool _chkRodArcFeature(
|
|||||||
{
|
{
|
||||||
//pkIdx可能会有波动
|
//pkIdx可能会有波动
|
||||||
double realPkCorner = abs(ptDirAngles[pkIdx].forwardAngle + ptDirAngles[pkIdx].backwardAngle);
|
double realPkCorner = abs(ptDirAngles[pkIdx].forwardAngle + ptDirAngles[pkIdx].backwardAngle);
|
||||||
|
int validCorner = ptDirAngles[pkIdx].type;
|
||||||
int realPkIdx = pkIdx;
|
int realPkIdx = pkIdx;
|
||||||
//向前搜索
|
//向前搜索
|
||||||
for (int i = pkIdx - 1; i >= 0; i--)
|
for (int i = pkIdx - 1; i >= 0; i--)
|
||||||
@ -4225,12 +4280,21 @@ bool _chkRodArcFeature(
|
|||||||
if (lineData[i].pt3D.z < 1e-4)
|
if (lineData[i].pt3D.z < 1e-4)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (ptDirAngles[i].type < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
double dist = sqrt(pow(lineData[pkIdx].pt3D.y - lineData[i].pt3D.y, 2) + pow(lineData[pkIdx].pt3D.z - lineData[i].pt3D.z, 2));
|
double dist = sqrt(pow(lineData[pkIdx].pt3D.y - lineData[i].pt3D.y, 2) + pow(lineData[pkIdx].pt3D.z - lineData[i].pt3D.z, 2));
|
||||||
if (dist > searchWin)
|
if (dist > searchWin)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
double flatAngle = abs(ptDirAngles[i].forwardAngle + ptDirAngles[i].backwardAngle);
|
double flatAngle = abs(ptDirAngles[i].forwardAngle + ptDirAngles[i].backwardAngle);
|
||||||
if (realPkCorner > flatAngle)
|
if( validCorner < 0)
|
||||||
|
{
|
||||||
|
realPkCorner = flatAngle;
|
||||||
|
realPkIdx = i;
|
||||||
|
validCorner = 0;
|
||||||
|
}
|
||||||
|
else if (realPkCorner > flatAngle)
|
||||||
{
|
{
|
||||||
realPkCorner = flatAngle;
|
realPkCorner = flatAngle;
|
||||||
realPkIdx = i;
|
realPkIdx = i;
|
||||||
@ -4242,12 +4306,21 @@ bool _chkRodArcFeature(
|
|||||||
if (lineData[i].pt3D.z < 1e-4)
|
if (lineData[i].pt3D.z < 1e-4)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (ptDirAngles[i].type < 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
double dist = sqrt(pow(lineData[pkIdx].pt3D.y - lineData[i].pt3D.y, 2) + pow(lineData[pkIdx].pt3D.z - lineData[i].pt3D.z, 2));
|
double dist = sqrt(pow(lineData[pkIdx].pt3D.y - lineData[i].pt3D.y, 2) + pow(lineData[pkIdx].pt3D.z - lineData[i].pt3D.z, 2));
|
||||||
if (dist > searchWin)
|
if (dist > searchWin)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
double flatAngle = abs(ptDirAngles[i].forwardAngle + ptDirAngles[i].backwardAngle);
|
double flatAngle = abs(ptDirAngles[i].forwardAngle + ptDirAngles[i].backwardAngle);
|
||||||
if (realPkCorner > flatAngle)
|
if (validCorner < 0)
|
||||||
|
{
|
||||||
|
realPkCorner = flatAngle;
|
||||||
|
realPkIdx = i;
|
||||||
|
validCorner = 0;
|
||||||
|
}
|
||||||
|
else if (realPkCorner > flatAngle)
|
||||||
{
|
{
|
||||||
realPkCorner = flatAngle;
|
realPkCorner = flatAngle;
|
||||||
realPkIdx = i;
|
realPkIdx = i;
|
||||||
@ -4316,7 +4389,7 @@ void wd_getRodArcFeature_peakCornerMethod(
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
double arcPerPointCornerMinValue = 5; //arc上每个点的转角最小值
|
double arcPerPointCornerMinValue = 5; //arc上每个点的转角最小值
|
||||||
double arcTotalCornerMinValue = 45; //Õû¸öArcµÄת½Ç×îСֵ
|
double arcTotalCornerMinValue = 30; //整个Arc的转角最小值
|
||||||
//计算前向角和后向角
|
//计算前向角和后向角
|
||||||
std::vector< SSG_pntDirAngle> ptDirAngles;
|
std::vector< SSG_pntDirAngle> ptDirAngles;
|
||||||
wd_computeDirAngle_wholeLine( lineData, cornerPara, ptDirAngles);
|
wd_computeDirAngle_wholeLine( lineData, cornerPara, ptDirAngles);
|
||||||
@ -4356,10 +4429,10 @@ void wd_getRodArcFeature_peakCornerMethod(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//提取corner极值(较早实现函数可以使用此函数进行代码优化)
|
//提取corner极值(较早实现函数可以使用此函数进行代码优化)
|
||||||
void _searchCornerPeaks(
|
void wd_searchCornerPeaks(
|
||||||
std::vector< SSG_pntDirAngle>& corners,
|
std::vector< SSG_pntDirAngle>& corners,
|
||||||
std::vector< SVzNL3DPosition>& vldPts,
|
std::vector< SVzNL3DPosition>& vldPts,
|
||||||
const SSG_cornerParam cornerPara,
|
const double minCornerTh,
|
||||||
double cornerMergeScale,
|
double cornerMergeScale,
|
||||||
std::vector< SSG_pntDirAngle>& cornerPeakP,
|
std::vector< SSG_pntDirAngle>& cornerPeakP,
|
||||||
std::vector< SSG_pntDirAngle>& cornerPeakM
|
std::vector< SSG_pntDirAngle>& cornerPeakM
|
||||||
@ -4379,20 +4452,19 @@ void _searchCornerPeaks(
|
|||||||
if (i == 275)
|
if (i == 275)
|
||||||
int kkk = 1;
|
int kkk = 1;
|
||||||
SSG_pntDirAngle* curr_data = &corners[i];
|
SSG_pntDirAngle* curr_data = &corners[i];
|
||||||
if (curr_data->pntIdx < 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (curr_data->pntIdx < 0)
|
if (curr_data->pntIdx < 0)
|
||||||
{
|
{
|
||||||
if (i == i_max - 1) //最后一个
|
if (i == i_max - 1) //最后一个
|
||||||
{
|
{
|
||||||
if (1 == _state) //上升
|
if (1 == _state) //上升
|
||||||
{
|
{
|
||||||
cornerPk_P.push_back(corners[eEdgePtIdx]);
|
if(corners[eEdgePtIdx].corner > 0)
|
||||||
|
cornerPk_P.push_back(corners[eEdgePtIdx]);
|
||||||
}
|
}
|
||||||
else if (2 == _state) //下降
|
else if (2 == _state) //下降
|
||||||
{
|
{
|
||||||
cornerPk_M.push_back(corners[eEdgePtIdx]);
|
if(corners[eEdgePtIdx].corner < 0)
|
||||||
|
cornerPk_M.push_back(corners[eEdgePtIdx]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
@ -4451,7 +4523,7 @@ void _searchCornerPeaks(
|
|||||||
double square_distTh = cornerMergeScale * cornerMergeScale; //2倍的cornerScale。
|
double square_distTh = cornerMergeScale * cornerMergeScale; //2倍的cornerScale。
|
||||||
for (int i = 0, i_max = (int)cornerPk_P.size(); i < i_max; i++)
|
for (int i = 0, i_max = (int)cornerPk_P.size(); i < i_max; i++)
|
||||||
{
|
{
|
||||||
if (cornerPk_P[i].corner < cornerPara.cornerTh)
|
if (cornerPk_P[i].corner < minCornerTh)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool isPeak = true;
|
bool isPeak = true;
|
||||||
@ -4494,7 +4566,7 @@ void _searchCornerPeaks(
|
|||||||
|
|
||||||
for (int i = 0, i_max = (int)cornerPk_M.size(); i < i_max; i++)
|
for (int i = 0, i_max = (int)cornerPk_M.size(); i < i_max; i++)
|
||||||
{
|
{
|
||||||
if (abs(cornerPk_M[i].corner) < cornerPara.cornerTh)
|
if (abs(cornerPk_M[i].corner) < minCornerTh)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool isPeak = true;
|
bool isPeak = true;
|
||||||
@ -4534,8 +4606,6 @@ void _searchCornerPeaks(
|
|||||||
if (true == isPeak)
|
if (true == isPeak)
|
||||||
cornerPeakM.push_back(cornerPk_M[i]);
|
cornerPeakM.push_back(cornerPk_M[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -4703,10 +4773,10 @@ void wd_getLineCorerFeature(
|
|||||||
std::vector< SSG_pntDirAngle> cornerPeakM;
|
std::vector< SSG_pntDirAngle> cornerPeakM;
|
||||||
double cornerMergeScale = cornerPara.scale * 2;
|
double cornerMergeScale = cornerPara.scale * 2;
|
||||||
//提取corner极值
|
//提取corner极值
|
||||||
_searchCornerPeaks(
|
wd_searchCornerPeaks(
|
||||||
corners,
|
corners,
|
||||||
vldPts,
|
vldPts,
|
||||||
cornerPara,
|
cornerPara.cornerTh,
|
||||||
cornerMergeScale,
|
cornerMergeScale,
|
||||||
cornerPeakP,
|
cornerPeakP,
|
||||||
cornerPeakM
|
cornerPeakM
|
||||||
@ -4899,10 +4969,10 @@ void wd_getLineCorerFeature_accelerate(
|
|||||||
std::vector< SSG_pntDirAngle> cornerPeakM;
|
std::vector< SSG_pntDirAngle> cornerPeakM;
|
||||||
double cornerMergeScale = cornerPara.scale * 2;
|
double cornerMergeScale = cornerPara.scale * 2;
|
||||||
//提取corner极值
|
//提取corner极值
|
||||||
_searchCornerPeaks(
|
wd_searchCornerPeaks(
|
||||||
corners,
|
corners,
|
||||||
lineData,
|
lineData,
|
||||||
cornerPara,
|
cornerPara.cornerTh,
|
||||||
cornerMergeScale,
|
cornerMergeScale,
|
||||||
cornerPeakP,
|
cornerPeakP,
|
||||||
cornerPeakM
|
cornerPeakM
|
||||||
@ -5645,10 +5715,10 @@ void sg_getLineZJumpFeature_cornerMethod(
|
|||||||
std::vector< SSG_pntDirAngle> cornerPeakP;
|
std::vector< SSG_pntDirAngle> cornerPeakP;
|
||||||
std::vector< SSG_pntDirAngle> cornerPeakM;
|
std::vector< SSG_pntDirAngle> cornerPeakM;
|
||||||
double cornerMergeScale = cornerPara.scale * 2;
|
double cornerMergeScale = cornerPara.scale * 2;
|
||||||
_searchCornerPeaks(
|
wd_searchCornerPeaks(
|
||||||
corners,
|
corners,
|
||||||
vldPts,
|
vldPts,
|
||||||
cornerPara,
|
cornerPara.cornerTh,
|
||||||
cornerMergeScale,
|
cornerMergeScale,
|
||||||
cornerPeakP,
|
cornerPeakP,
|
||||||
cornerPeakM
|
cornerPeakM
|
||||||
@ -5884,10 +5954,10 @@ void sg_getLineLJumpFeature_cornerMethod(
|
|||||||
std::vector< SSG_pntDirAngle> cornerPeakP;
|
std::vector< SSG_pntDirAngle> cornerPeakP;
|
||||||
std::vector< SSG_pntDirAngle> cornerPeakM;
|
std::vector< SSG_pntDirAngle> cornerPeakM;
|
||||||
double cornerMergeScale = cornerPara.scale;
|
double cornerMergeScale = cornerPara.scale;
|
||||||
_searchCornerPeaks(
|
wd_searchCornerPeaks(
|
||||||
corners,
|
corners,
|
||||||
vldPts,
|
vldPts,
|
||||||
cornerPara,
|
cornerPara.cornerTh,
|
||||||
cornerMergeScale,
|
cornerMergeScale,
|
||||||
cornerPeakP,
|
cornerPeakP,
|
||||||
cornerPeakM
|
cornerPeakM
|
||||||
|
|||||||
@ -71,6 +71,56 @@ void lineFitting_abc(std::vector< SVzNL3DPoint>& inliers, double* _a, double* _b
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//拟合成通用直线方程ax+by+c=0,包括垂直
|
||||||
|
void indexingPtLineFitting_abc(std::vector< SWD3DPointPostion>& inliers, double* _a, double* _b, double* _c)
|
||||||
|
{
|
||||||
|
//判断是否为垂直
|
||||||
|
int dataSize = (int)inliers.size();
|
||||||
|
if (dataSize < 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
double deltaX = abs(inliers[0].point.x - inliers[dataSize - 1].point.x);
|
||||||
|
double deltaY = abs(inliers[0].point.y - inliers[dataSize - 1].point.y);
|
||||||
|
std::vector< SVzNL3DPoint> fittingData;
|
||||||
|
if (deltaX < deltaY)
|
||||||
|
{
|
||||||
|
//x=ky+b 拟合
|
||||||
|
for (int i = 0; i < dataSize; i++)
|
||||||
|
{
|
||||||
|
SVzNL3DPoint a_fitPt;
|
||||||
|
a_fitPt.x = inliers[i].point.y;
|
||||||
|
a_fitPt.y = inliers[i].point.x;
|
||||||
|
a_fitPt.z = inliers[i].point.z;
|
||||||
|
fittingData.push_back(a_fitPt);
|
||||||
|
}
|
||||||
|
double k = 0, b = 0;
|
||||||
|
lineFitting(fittingData, &k, &b);
|
||||||
|
//ax+by+c
|
||||||
|
*_a = 1.0;
|
||||||
|
*_b = -k;
|
||||||
|
*_c = -b;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < dataSize; i++)
|
||||||
|
{
|
||||||
|
SVzNL3DPoint a_fitPt;
|
||||||
|
a_fitPt.x = inliers[i].point.x;
|
||||||
|
a_fitPt.y = inliers[i].point.y;
|
||||||
|
a_fitPt.z = inliers[i].point.z;
|
||||||
|
fittingData.push_back(a_fitPt);
|
||||||
|
}
|
||||||
|
//y = kx+b拟合
|
||||||
|
double k = 0, b = 0;
|
||||||
|
lineFitting(fittingData, &k, &b);
|
||||||
|
//ax+by+c
|
||||||
|
*_a = k;
|
||||||
|
*_b = -1;
|
||||||
|
*_c = b;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//Ô²×îС¶þ³ËÄâºÏ
|
//Ô²×îС¶þ³ËÄâºÏ
|
||||||
double fitCircleByLeastSquare(
|
double fitCircleByLeastSquare(
|
||||||
const std::vector<SVzNL3DPoint>& pointArray,
|
const std::vector<SVzNL3DPoint>& pointArray,
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -36,12 +36,24 @@ typedef struct
|
|||||||
SVzNL3DPoint endPt;
|
SVzNL3DPoint endPt;
|
||||||
}SSX_rodPositionInfo;
|
}SSX_rodPositionInfo;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
KeWD_WELD_UNKNOWN = 0,
|
||||||
|
KeWD_WELD_POINT, //焊点
|
||||||
|
KeWD_WELD_SEAM, //焊缝
|
||||||
|
KeWD_WELD_SEAM_GAP, //焊缝,有缝隙
|
||||||
|
}EWD_weldType;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
EWD_weldType weldType;
|
||||||
SVzNL3DPoint startPt;
|
SVzNL3DPoint startPt;
|
||||||
SVzNL3DPoint endPt;
|
SVzNL3DPoint endPt;
|
||||||
SVzNL3DPoint center;
|
SVzNL3DPoint center;
|
||||||
|
SVzNL3DPoint axialDir;
|
||||||
SVzNL3DPoint normalDir; //法向量
|
SVzNL3DPoint normalDir; //法向量
|
||||||
|
std::vector< SVzNL3DPoint> centerPts;
|
||||||
|
std::vector< SVzNL3DPoint> edgePts_0;
|
||||||
|
std::vector< SVzNL3DPoint> edgePts_1;
|
||||||
}SSX_weldSeamInfo;
|
}SSX_weldSeamInfo;
|
||||||
|
|
||||||
//读版本号
|
//读版本号
|
||||||
@ -97,5 +109,6 @@ SG_APISHARED_EXPORT void sx_rebarWeldSeamPositioning(
|
|||||||
const SSG_outlierFilterParam filterParam,
|
const SSG_outlierFilterParam filterParam,
|
||||||
const SSG_treeGrowParam growParam,
|
const SSG_treeGrowParam growParam,
|
||||||
const SSX_rodParam rodParam,
|
const SSX_rodParam rodParam,
|
||||||
|
const double weldSeanRange, //焊缝距钢筋交叉点的范围(最大值)
|
||||||
std::vector<SSX_weldSeamInfo>& weldSeamInfo,
|
std::vector<SSX_weldSeamInfo>& weldSeamInfo,
|
||||||
int* errCode);
|
int* errCode);
|
||||||
@ -566,7 +566,7 @@ void TuoPuFa_holePosition_test(void)
|
|||||||
};
|
};
|
||||||
|
|
||||||
SVzNLRange fileIdx[TPF_TEST_GROUP] = {
|
SVzNLRange fileIdx[TPF_TEST_GROUP] = {
|
||||||
{6,6}, {1, 16}, {18,18}
|
{6,6}, {1, 16}, {1,17}
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* ver = wd_workpieceHolePositioningVersion();
|
const char* ver = wd_workpieceHolePositioningVersion();
|
||||||
@ -734,7 +734,7 @@ void TuoPuFa_holePosition_test(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if TEST_COMPUTE_HOLE
|
#if TEST_COMPUTE_HOLE
|
||||||
for (int grp = 2; grp <= 2; grp++)
|
for (int grp = 1; grp <= 2; grp++)
|
||||||
{
|
{
|
||||||
SSG_planeCalibPara groundCalibPara;
|
SSG_planeCalibPara groundCalibPara;
|
||||||
//初始化成单位阵
|
//初始化成单位阵
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user