From 098caff1718017d6a959d77651497eec01010c12 Mon Sep 17 00:00:00 2001 From: jerryzeng Date: Wed, 11 Mar 2026 00:42:17 +0800 Subject: [PATCH] =?UTF-8?q?BQ=5FworkpieceCornerExtraction=20ver=201.4.0=20?= =?UTF-8?q?=E5=8D=9A=E6=B8=85=E5=B7=A5=E4=BB=B6=E5=AE=9A=E4=BD=8D=E7=BA=A0?= =?UTF-8?q?=E5=81=8F=E6=94=B9=E8=BF=9B=E3=80=82=E7=AE=97=E6=B3=95=E4=B8=8A?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E8=BD=AE=E5=BB=93=E7=82=B9=E7=9A=84=E5=89=8D?= =?UTF-8?q?=E5=90=91=E5=92=8C=E5=90=8E=E5=90=91=E8=A7=92=EF=BC=8C=E8=BF=9B?= =?UTF-8?q?=E8=80=8C=E8=AE=A1=E7=AE=97=E6=8B=90=E8=A7=92=EF=BC=8C=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E7=9B=B4=E8=A7=92=E7=BB=93=E6=9E=84=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E8=A1=A5=E7=BC=BA=E8=A7=92=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BQ_workpieceCornerExtract_test.vcxproj | 2 +- .../BQ_workpieceCornerExtraction.vcxproj | 2 +- baseAlgorithm/baseAlgorithm.vcxproj | 2 +- sourceCode/BQ_workpieceCornerExtraction.cpp | 459 +++++++++--------- 4 files changed, 243 insertions(+), 222 deletions(-) diff --git a/BQ_workpieceCornerExtract_test/BQ_workpieceCornerExtract_test.vcxproj b/BQ_workpieceCornerExtract_test/BQ_workpieceCornerExtract_test.vcxproj index 0096fa4..5e10773 100644 --- a/BQ_workpieceCornerExtract_test/BQ_workpieceCornerExtract_test.vcxproj +++ b/BQ_workpieceCornerExtract_test/BQ_workpieceCornerExtract_test.vcxproj @@ -42,7 +42,7 @@ Application true - v142 + v143 Unicode diff --git a/BQ_workpieceCornerExtraction/BQ_workpieceCornerExtraction.vcxproj b/BQ_workpieceCornerExtraction/BQ_workpieceCornerExtraction.vcxproj index c519166..f989737 100644 --- a/BQ_workpieceCornerExtraction/BQ_workpieceCornerExtraction.vcxproj +++ b/BQ_workpieceCornerExtraction/BQ_workpieceCornerExtraction.vcxproj @@ -42,7 +42,7 @@ DynamicLibrary true - v142 + v143 Unicode diff --git a/baseAlgorithm/baseAlgorithm.vcxproj b/baseAlgorithm/baseAlgorithm.vcxproj index 2ecea6d..9633928 100644 --- a/baseAlgorithm/baseAlgorithm.vcxproj +++ b/baseAlgorithm/baseAlgorithm.vcxproj @@ -42,7 +42,7 @@ DynamicLibrary true - v142 + v143 Unicode diff --git a/sourceCode/BQ_workpieceCornerExtraction.cpp b/sourceCode/BQ_workpieceCornerExtraction.cpp index 4bf9e9e..2c9b0b4 100644 --- a/sourceCode/BQ_workpieceCornerExtraction.cpp +++ b/sourceCode/BQ_workpieceCornerExtraction.cpp @@ -773,23 +773,65 @@ void _searchPlusCornerPeaks( } } +//判断两个有序点之间是否是一条直线 +bool checkIsLine( + SSG_dirCornerAngle& pt1, SSG_dirCornerAngle& pt2, + std::vector& polarPoints, + double angleTh, double cutLineDeviationTh) +{ + int ringBuffSize = (int)polarPoints.size(); + //偏离度判断 +//计算两点连线 + double a, b, c; + int idx1 = pt1.forward_pntIdx; //避开一个尺度 + int idx2 = pt2.backward_pntIdx; //避开一个尺度 + compute2ptLine_2( + polarPoints[idx1].x, polarPoints[idx1].y, + polarPoints[idx2].x, polarPoints[idx2].y, + &a, &b, &c); + double tmp = sqrt(a * a + b * b); + a = a / tmp; + b = b / tmp; + c = c / tmp; + + double maxDist = 0; + int number = idx2 - idx1; + if (number < 0) + number += ringBuffSize; + for (int m = 0; m < number; m++) + { + int idx = (m + idx1) % ringBuffSize; + double dist = abs(a * polarPoints[idx].x + b * polarPoints[idx].y + c); + if (maxDist < dist) + maxDist = dist; + } + if (maxDist < cutLineDeviationTh) //判断为直线 + return true; + else + return false; +} + //根据轮廓的角点计算Branch, 并判断是否缺角。缺角时通过拟合方式补全 // std::vector& polarPoints: 点的循环对列 //branchCornerAngle: 支持寻找不同角度的Branch,由branchCornerAngle指定。90度为直角。 //angleTh: 角度误差范围。比如名义为90的直角,实际加工会有误差。 //cutLineDeviationTh:以截角两点连线,截角上点到直线的最大偏离。保证截角是直线 -void _computeBranchesFromCornerPeaks(std::vector& polarPoints, std::vector< SSG_dirCornerAngle>& cornerPlusPeaks, std::vector& branches, double branchCornerAngle, double angleTh, double cutLineDeviationTh) +void _computeBranchesFromCornerPeaks( + std::vector& polarPoints, + std::vector< SSG_dirCornerAngle>& cornerPlusPeaks, + std::vector& branches, + SSX_BQworkpiecePara& workpieceParam, +#if _OUTPUT_DEBUG_DATA + std::vector& branchDebugData, +#endif + double branchCornerAngle, double angleTh, double cutLineDeviationTh) { int ringBuffSize = (int)polarPoints.size(); //判断是否有缺角 int size_peaks = (int)cornerPlusPeaks.size(); - std::vector cutPairFlags; - cutPairFlags.resize(size_peaks); - std::fill(cutPairFlags.begin(), cutPairFlags.end(), 0); - int cutPairID = 1; for (int i = 0; i < size_peaks; i++) { - if (cutPairFlags[i] > 0) + if (cornerPlusPeaks[i].pntIdx < 0) continue; SSG_dirCornerAngle& corner_1 = cornerPlusPeaks[i]; @@ -803,38 +845,182 @@ void _computeBranchesFromCornerPeaks(std::vector& polarPoints, std: if (angleDiff < angleTh) { //偏离度判断 - //计算两点连线 - double a, b, c; - compute2ptLine_2( - corner_1.point.x, corner_1.point.y, - corner_2.point.x, corner_2.point.y, - &a, &b, &c); - double tmp = sqrt(a * a + b * b); - a = a / tmp; - b = b / tmp; - c = c / tmp; + //判断两个有序点之间是否是一条直线 + bool isLine = checkIsLine( corner_1, corner_2, polarPoints, angleTh, cutLineDeviationTh); + if (true == isLine) //判断为截角 + { + //拟合计算交点 + //直线1 + std::vector linePts_1; + int startIdx = corner_1.backward_pntIdx; + SWD_polarPt startPt = polarPoints[startIdx]; + for (int m = 0; m < ringBuffSize; m++) + { + int idx = startIdx - m; + if (idx < 0) + idx += ringBuffSize; - double maxDist = 0; - int number = corner_2.pntIdx - corner_1.pntIdx; - if (number < 0) - number += ringBuffSize; - for (int m = 0; m < number; m++) - { - int idx = (m + corner_1.pntIdx) % ringBuffSize; - double dist = abs(a * polarPoints[idx].x + b * polarPoints[m].y + c); - if (maxDist < dist) - maxDist = dist; - } - if (maxDist < cutLineDeviationTh) //判断为截角 - { - cutPairFlags[i] = cutPairID; - cutPairFlags[i+1] = cutPairID; - cutPairID++; + double dist = sqrt(pow(startPt.x - polarPoints[idx].x, 2) + pow(startPt.y - polarPoints[idx].y, 2)); + if (dist > workpieceParam.lineLen) + break; + SVzNL3DPoint a_pt = { polarPoints[idx].x , polarPoints[idx].y, polarPoints[idx].z }; + linePts_1.push_back(a_pt); + } + double _a1 = 0, _b1 = 0, _c1 = 0; + lineFitting_abc(linePts_1, &_a1, &_b1, &_c1); + //直线2 + std::vector linePts_2; + startIdx = corner_2.forward_pntIdx; + startPt = polarPoints[startIdx]; + for (int m = 0; m < ringBuffSize; m++) + { + int idx = (startIdx + m) % ringBuffSize; + double dist = sqrt(pow(startPt.x - polarPoints[idx].x, 2) + pow(startPt.y - polarPoints[idx].y, 2)); + if (dist > workpieceParam.lineLen) + break; + SVzNL3DPoint a_pt = { polarPoints[idx].x , polarPoints[idx].y, polarPoints[idx].z }; + linePts_2.push_back(a_pt); + } + double _a2 = 0, _b2 = 0, _c2 = 0; + lineFitting_abc(linePts_2, &_a2, &_b2, &_c2); + //求交点 + SVzNL3DPoint crossPt = computeLineCrossPt_abs(_a1, _b1, _c1, _a2, _b2, _c2); + linePts_1.insert(linePts_1.end(), linePts_2.begin(), linePts_2.end()); + crossPt.z = computeMeanZ(linePts_1); + corner_1.point.x = crossPt.x; + corner_1.point.y = crossPt.y; + corner_1.point.z = crossPt.z; + corner_2.pntIdx = -1; + //更新corner + corner_1.corner = sumCorner; + corner_1.forward_pntIdx = corner_2.forward_pntIdx; } } } - //迭代一次,对于循环Buff, 需要重新检查首尾结合部 - + + //滤除错误的Corner, 并删除 + for (int i = size_peaks-1; i >= 0; i--) + { + SSG_dirCornerAngle& a_corner = cornerPlusPeaks[i]; + if (a_corner.pntIdx < 0) + { + cornerPlusPeaks.erase(cornerPlusPeaks.begin() + i); + } + else + { + double angleDiff = abs(a_corner.corner - branchCornerAngle); + if (angleDiff > angleTh) + { + cornerPlusPeaks.erase(cornerPlusPeaks.begin() + i); + } + } + } + + //寻找branch: branch的特征:相邻之间为直线 + size_peaks = (int)cornerPlusPeaks.size(); + int branchID = 1; + for (int i = 0; i < size_peaks; i++) + { + if (cornerPlusPeaks[i].pntIdx < 0) + continue; + + SSG_dirCornerAngle& corner_1 = cornerPlusPeaks[i]; + int tmpIdx = (i + 1) % size_peaks; + SSG_dirCornerAngle& corner_2 = cornerPlusPeaks[tmpIdx]; + //判断两个有序点之间是否是一条直线 + bool isBranch = checkIsLine(corner_1, corner_2, polarPoints, angleTh, cutLineDeviationTh); + if (true == isBranch) //判断为branch + { + //拟合三条直线 + // 直线0:两个角点之间的直线 + std::vector linePts_0; + int ptSize = corner_2.backward_pntIdx - corner_1.forward_pntIdx; + if (ptSize < 0) + ptSize += ringBuffSize; + for (int m = 0; m <= ptSize; m++) + { + int idx = (corner_1.forward_pntIdx + m) % ringBuffSize; + SVzNL3DPoint a_pt = { polarPoints[idx].x , polarPoints[idx].y, polarPoints[idx].z }; + linePts_0.push_back(a_pt); + } + double _a0 = 0, _b0 = 0, _c0 = 0; + lineFitting_abc(linePts_0, &_a0, &_b0, &_c0); + //直线1 + std::vector linePts_1; + int startIdx = corner_1.backward_pntIdx; + SWD_polarPt startPt = polarPoints[startIdx]; + for (int m = 0; m < ringBuffSize; m++) + { + int idx = startIdx - m; + if (idx < 0) + idx += ringBuffSize; + + double dist = sqrt(pow(startPt.x - polarPoints[idx].x, 2) + pow(startPt.y - polarPoints[idx].y, 2)); + if (dist > workpieceParam.lineLen) + break; + SVzNL3DPoint a_pt = { polarPoints[idx].x , polarPoints[idx].y, polarPoints[idx].z }; + linePts_1.push_back(a_pt); + } + double _a1 = 0, _b1 = 0, _c1 = 0; + lineFitting_abc(linePts_1, &_a1, &_b1, &_c1); + //直线2 + std::vector linePts_2; + startIdx = corner_2.forward_pntIdx; + startPt = polarPoints[startIdx]; + for (int m = 0; m < ringBuffSize; m++) + { + int idx = (startIdx + m) % ringBuffSize; + double dist = sqrt(pow(startPt.x - polarPoints[idx].x, 2) + pow(startPt.y - polarPoints[idx].y, 2)); + if (dist > workpieceParam.lineLen) + break; + SVzNL3DPoint a_pt = { polarPoints[idx].x , polarPoints[idx].y, polarPoints[idx].z }; + linePts_2.push_back(a_pt); + } + double _a2 = 0, _b2 = 0, _c2 = 0; + lineFitting_abc(linePts_2, &_a2, &_b2, &_c2); + +#if _OUTPUT_DEBUG_DATA + SSX_debugInfo a_branchDebug; + a_branchDebug.rgnIdx = branchID++; + a_branchDebug.edge_size = (int)linePts_0.size(); + a_branchDebug.edgeLink1_size = (int)linePts_1.size(); + a_branchDebug.edgeLink2_size = (int)linePts_2.size(); + a_branchDebug.edge = (SVzNL3DPoint*)malloc(sizeof(SVzNL3DPoint) * a_branchDebug.edge_size); + a_branchDebug.edgeLink_1 = (SVzNL3DPoint*)malloc(sizeof(SVzNL3DPoint) * a_branchDebug.edgeLink1_size); + a_branchDebug.edgeLink_2 = (SVzNL3DPoint*)malloc(sizeof(SVzNL3DPoint) * a_branchDebug.edgeLink2_size); + + for (int m = 0; m < a_branchDebug.edge_size; m++) + a_branchDebug.edge[m] = linePts_0[m]; + for (int m = 0; m < a_branchDebug.edgeLink1_size; m++) + a_branchDebug.edgeLink_1[m] = linePts_1[m]; + for (int m = 0; m < a_branchDebug.edgeLink2_size; m++) + a_branchDebug.edgeLink_2[m] = linePts_2[m]; + + branchDebugData.push_back(a_branchDebug); +#endif + + linePts_1.insert(linePts_1.end(), linePts_0.begin(), linePts_0.end()); + linePts_2.insert(linePts_2.end(), linePts_0.begin(), linePts_0.end()); + //计算branch信息 + SWD_branchInfo a_branchInfo; + a_branchInfo.corner[0] = computeLineCrossPt_abs(_a0, _b0, _c0, _a1, _b1, _c1); + a_branchInfo.corner[0].z = computeMeanZ(linePts_1); + a_branchInfo.corner[2] = computeLineCrossPt_abs(_a0, _b0, _c0, _a2, _b2, _c2); + a_branchInfo.corner[2].z = computeMeanZ(linePts_2); + a_branchInfo.corner[1].x = (a_branchInfo.corner[0].x + a_branchInfo.corner[2].x) / 2; + a_branchInfo.corner[1].y = (a_branchInfo.corner[0].y + a_branchInfo.corner[2].y) / 2; + a_branchInfo.corner[1].z = computeMeanZ(linePts_0); + // + a_branchInfo.angle = corner_1.point.angle; + a_branchInfo.line_a = _b0; + a_branchInfo.line_b = -_a0; + a_branchInfo.line_c = -(a_branchInfo.line_a * a_branchInfo.corner[1].x + a_branchInfo.line_b * a_branchInfo.corner[1].y); + branches.push_back(a_branchInfo); + + corner_1.pntIdx = -1; + corner_2.pntIdx = -1; + } + } } SSX_BQworkpieceResult sx_BQ_getWorkpieceCorners( @@ -1135,8 +1321,19 @@ SSX_BQworkpieceResult sx_BQ_getWorkpieceCorners( std::vector< SSG_dirCornerAngle> cornerPlusPeaks; _searchPlusCornerPeaks(dirCornerAngles, cornerPlusPeaks); //使用R过滤,判断是否缺角 + double branchCornerAngle = 90; + double angleTh = 10; + double cutLineDeviationTh = 5.0; std::vector branches; - _computeBranchesFromCornerPeaks(cornerPlusPeaks, branches); + _computeBranchesFromCornerPeaks( + polarPoints, + cornerPlusPeaks, + branches, + workpieceParam, +#if _OUTPUT_DEBUG_DATA + debug_contours, +#endif + branchCornerAngle, angleTh, cutLineDeviationTh); //提取R极值点 double minR = -1, maxR = -1; //计算最小和最大的R,用以区分有没有分支。minR和maxR相差小时,为圆形或8角形,没有分支 @@ -1174,9 +1371,6 @@ SSX_BQworkpieceResult sx_BQ_getWorkpieceCorners( polarRPeakPts.push_back(polarPoints[pi]); } - double ratio_MaxMin = maxR / minR; - bool hasBranch = ratio_MaxMin < 1.25 ? false : true; - std::vector validPolarRPeakPts; std::vector polarPeakInfo; int pkId = 0; @@ -1251,192 +1445,19 @@ SSX_BQworkpieceResult sx_BQ_getWorkpieceCorners( int workpieceType = -1; bool partialScan = false; //当相机视野不能覆盖工件全部时,partialScan为true std::vector< SWD_branchInfo> branchInfo; - if (true == hasBranch) + if (branches.size() > 0) //有分支(branch) { - //计算分支,90度范围内为同一分支。根据分支数量确定工件类型 - int pkSize = (int)validPolarRPeakPts.size(); - for (int m = 0; m < pkSize; m++) - { - if (validPolarRPeakPts[m].cptIndex < 0) - continue; - - //if (polarPeakInfo[m].cornerDir == 2) //逆时针。 - { - int nxtIdx = (m + 1)%pkSize; - - bool isSameBranch = checkSameBranch(validPolarRPeakPts[m], validPolarRPeakPts[nxtIdx], - polarPoints, center_x, center_y); - double angleDiff = computeAngleDiff(validPolarRPeakPts[nxtIdx].angle, validPolarRPeakPts[m].angle); - if (angleDiff < 0) - angleDiff += 360; - if ( (angleDiff < 90) && (true == isSameBranch)) //为同一branch,合并,只保留一个 - { - validPolarRPeakPts[nxtIdx].pkId = validPolarRPeakPts[m].pkId; //pair - validPolarRPeakPts[nxtIdx].cptIndex = -1; - } - } - } - - std::vector> branchPeaks; //每个branch最多两个极值点 - branchPeaks.resize(pkId); - std::vector> branchPeakInfo; - branchPeakInfo.resize(pkId); - for (int m = 0; m < pkSize; m++) - { - if (validPolarRPeakPts[m].cptIndex < 0) - validPolarRPeakPts[m].cptIndex = polarPeakInfo[m].cptIndex; //恢复 - int pkId = validPolarRPeakPts[m].pkId; - branchPeaks[pkId].push_back(validPolarRPeakPts[m]); - branchPeakInfo[pkId].push_back(polarPeakInfo[m]); - } - for (int m = pkSize - 1; m >= 0; m--) - { - if (branchPeaks[m].size() == 0) - { - branchPeaks.erase(branchPeaks.begin() + m); - branchPeakInfo.erase(branchPeakInfo.begin() + m); - } - } - - - - int branchNum = (int)branchPeaks.size(); + int branchNum = (int)branches.size(); if (branchNum == 2) - { workpieceType = 3; //节点3 - - SVzNL3DPoint pt1 = { polarPoints[minRPos].x, polarPoints[minRPos].y, 0 }; - SVzNL3DPoint pt2 = { center_x, center_y, 0 }; - double aux_a, aux_b, aux_c; - compute2ptLine(pt1, pt2, &aux_a, &aux_b, &aux_c); - double counterAngle = polarPoints[minRPos].angle + 180; - if (counterAngle > 360) - counterAngle = counterAngle - 360; - SVzNL3DPoint a_cross = computeEdgeCross(counterAngle, polarPoints, aux_a, aux_b, aux_c); - double refine_cx = (pt1.x + a_cross.x) / 2; - double refine_cy = (pt1.y + a_cross.y) / 2; - //确定cornerDir - for (int m = 0; m < branchNum; m++) - { - for (int n = 0; n < branchPeaks[m].size(); n++) - { - int cptIdx = branchPeakInfo[m][n].cptIndex; - int LL1 = branchPeakInfo[m][n].L1_ptIndex; - int LL2 = branchPeakInfo[m][n].L2_ptIndex; - double angle = atan2(polarPoints[cptIdx].y - refine_cy, polarPoints[cptIdx].x - refine_cx); - angle = (angle / PI) * 180 + 180.0; - double LL1_angle = atan2(polarPoints[LL1].y - refine_cy, polarPoints[LL1].x - refine_cx); - LL1_angle = (LL1_angle / PI) * 180 + 180.0; - double LL2_angle = atan2(polarPoints[LL2].y - refine_cy, polarPoints[LL2].x - refine_cx); - LL2_angle = (LL2_angle / PI) * 180 + 180.0; - - double L1_angle = computeAngleDiff(angle, LL1_angle); - double L2_angle = computeAngleDiff(LL2_angle, angle); - if (L1_angle < L2_angle) - branchPeakInfo[m][n].cornerDir = 2; //逆时针 - else - branchPeakInfo[m][n].cornerDir = 1; //顺时针 - } - } - } - else if ((branchNum == 3) || (branchNum == 4)) - { - if (branchNum == 3) - { - partialScan = true; - workpieceType = 2; //节点2 - } - else - workpieceType = 1; //节点1 - //确定cornerDir - - for (int m = 0; m < branchNum; m++) - { - for(int n = 0; n < branchPeaks[m].size(); n++) - { - int cptIdx = branchPeakInfo[m][n].cptIndex; - int LL1 = branchPeakInfo[m][n].L1_ptIndex; - int LL2 = branchPeakInfo[m][n].L2_ptIndex; - double L1_angle = polarPoints[cptIdx].angle - polarPoints[LL1].angle; - if (L1_angle < 0) - L1_angle += 360; - double L2_angle = polarPoints[LL2].angle - polarPoints[cptIdx].angle; - if (L2_angle < 0) - L2_angle += 360; - if (L1_angle < L2_angle) - branchPeakInfo[m][n].cornerDir = 2; //逆时针 - else - branchPeakInfo[m][n].cornerDir = 1; //顺时针 - } - } - } + else if (branchNum == 3) + workpieceType = 2; //节点2 + else if (branchNum == 4) + workpieceType = 1; //节点1 else workpieceType = 0; - - //计算各个branch的信息 - for (int branchIdx = 0; branchIdx < branchNum; branchIdx++) - { - std::vector& a_branch = branchPeaks[branchIdx]; - std::vector& a_branchInfo = branchPeakInfo[branchIdx]; - //取固定长度垂直边 - SWD_polarPt branchCorner; - SWD_polarPeakInfo branchCornerInfo; - if (a_branch.size() == 2) //取角度最接近90度的 - { - double diff1 = abs(a_branchInfo[0].cornerAngle - 90); - double diff2 = abs(a_branchInfo[1].cornerAngle - 90); - branchCorner = diff1 < diff2 ? a_branch[0]: a_branch[1]; - branchCornerInfo = diff1 < diff2 ? a_branchInfo[0] : a_branchInfo[1]; - } - else - { - branchCorner = a_branch[0]; - branchCornerInfo = a_branchInfo[0]; - } - - SWD_branchInfo resultBranchInfo; - std::vector branchLinePts; //用于显示和debug - std::vector< SVzNL3DPoint> branchEdgePt1; - std::vector< SVzNL3DPoint> branchEdgePt2; - int opOK = _getBranchInfo( - validStartLine, //开始扫描边界 - validEndLine, //结束扫描边界 - partialScan, //当相机视野不能覆盖工件全部时,partialScan为true, - polarPoints, - branchCorner, - branchCornerInfo, - &resultBranchInfo, - branchLinePts, - branchEdgePt1, - branchEdgePt2); - if(opOK < 0) - { - *errCode = SX_ERR_ZERO_CONTOUR_PT; - return workpieceCorners; - } - branchInfo.push_back(resultBranchInfo); -#if _OUTPUT_DEBUG_DATA - SSX_debugInfo a_branchDebug; - a_branchDebug.rgnIdx = (int)branchInfo.size(); - a_branchDebug.edge_size = (int)branchEdgePt1.size(); - a_branchDebug.edgeLink1_size = (int)branchLinePts.size(); - a_branchDebug.edgeLink2_size = (int)branchEdgePt2.size(); - a_branchDebug.edge = (SVzNL3DPoint*)malloc(sizeof(SVzNL3DPoint) * a_branchDebug.edge_size); - a_branchDebug.edgeLink_1 = (SVzNL3DPoint*)malloc(sizeof(SVzNL3DPoint) * a_branchDebug.edgeLink1_size); - a_branchDebug.edgeLink_2 = (SVzNL3DPoint*)malloc(sizeof(SVzNL3DPoint) * a_branchDebug.edgeLink2_size); - - for(int m = 0; m < a_branchDebug.edge_size; m ++) - a_branchDebug.edge[m] = branchEdgePt1[m]; - for (int m = 0; m < a_branchDebug.edgeLink1_size; m++) - a_branchDebug.edgeLink_1[m] = branchLinePts[m]; - for (int m = 0; m < a_branchDebug.edgeLink2_size; m++) - a_branchDebug.edgeLink_2[m] = branchEdgePt2[m]; - debug_contours.push_back(a_branchDebug); -#endif - } - - - + branchInfo.insert(branchInfo.end(), branches.begin(), branches.end()); + workpieceCorners.workpieceType = workpieceType; if (workpieceType == 1) //4个branch {