diff --git a/rodAndBarDetection_test/rodAndBarDetection_test.cpp b/rodAndBarDetection_test/rodAndBarDetection_test.cpp index 30e7b81..669351b 100644 --- a/rodAndBarDetection_test/rodAndBarDetection_test.cpp +++ b/rodAndBarDetection_test/rodAndBarDetection_test.cpp @@ -878,23 +878,28 @@ void _outputRGBDScan_RGBD_weldSeam( sw.close(); } -#define SCREW_TEST_GROUP 3 +#define SCREW_TEST_GROUP 7 void screwTest(void) { const char* dataPath[SCREW_TEST_GROUP] = { "F:/ShangGu/项目/冠钦项目/螺杆测量/数据/模拟数据/", //0 "F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云2/上方两根/", //1 "F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云3/", //2 + "F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云4/位置1/", //3 + "F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云4/位置2/", //4 + "F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云4/位置2未动螺杆拧进去100mm左右/", //5 + "F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云4/位置2向前100mm螺杆拧进去100mm左右/", //6 }; SVzNLRange fileIdx[SCREW_TEST_GROUP] = { - {1,4},{1,30},{1,11} + {1,4},{1,30},{1,11}, + {1,20}, {1,20}, {1,5}, {1,21} }; const char* ver = wd_rodAndBarDetectionVersion(); printf("ver:%s\n", ver); - for (int grp = 2; grp < SCREW_TEST_GROUP; grp++) + for (int grp = 3; grp < SCREW_TEST_GROUP; grp++) { for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++) { @@ -924,7 +929,7 @@ void screwTest(void) //double rodDiameter = 10.0; SSG_cornerParam cornerParam; - cornerParam.cornerTh = 60; //45度角 + cornerParam.cornerTh = 30; //45度角 cornerParam.scale = rodDiameter/4; // algoParam.bagParam.bagH / 8; // 15; // algoParam.bagParam.bagH / 8; cornerParam.minEndingGap = 20; // algoParam.bagParam.bagW / 4; cornerParam.minEndingGap_z = 5.0; @@ -936,12 +941,12 @@ void screwTest(void) filterParam.outlierTh = 5; SSG_treeGrowParam growParam; - growParam.maxLineSkipNum = 10; - growParam.yDeviation_max = 20.0; - growParam.maxSkipDistance = 20.0; - growParam.zDeviation_max = 50.0;// - growParam.minLTypeTreeLen = 10; //mm, 螺杆长度 - growParam.minVTypeTreeLen = 10; //mm + growParam.maxLineSkipNum = 30; + growParam.yDeviation_max = 5.0; + growParam.maxSkipDistance = 30.0; + growParam.zDeviation_max = 50;// + growParam.minLTypeTreeLen = 50; //mm, 螺杆长度 + growParam.minVTypeTreeLen = 50; //mm bool isHorizonScan = true; //true:激光线平行槽道;false:激光线垂直槽道 int errCode = 0; @@ -1025,21 +1030,22 @@ void locatingPlateTest(void) } } -#define ROD_POSITION_TEST_GROUP 1 +#define ROD_POSITION_TEST_GROUP 2 void rodPositionTest(void) { const char* dataPath[ROD_POSITION_TEST_GROUP] = { - "F:/ShangGu/项目/冠钦项目/棒材抓取/", //0 + "F:/ShangGu/项目/冠钦项目/矩森棒材抓取/", //0 + "F:/ShangGu/项目/冠钦项目/胶布圆棒抓取/模拟测试数据/", //1 }; SVzNLRange fileIdx[ROD_POSITION_TEST_GROUP] = { - {1,8}, + {1,8}, {1,5} }; const char* ver = wd_rodAndBarDetectionVersion(); printf("ver:%s\n", ver); - for (int grp = 0; grp < ROD_POSITION_TEST_GROUP; grp++) + for (int grp = 1; grp < ROD_POSITION_TEST_GROUP; grp++) { SSG_planeCalibPara poseCalibPara; //初始化成单位阵 @@ -1063,7 +1069,10 @@ void rodPositionTest(void) { //fidx =1; char _scan_file[256]; - sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx); + if(1 == grp) + sprintf_s(_scan_file, "%s%d_LaserData_Hi229156.txt", dataPath[grp], fidx); + else + sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx); std::vector> scanLines; wdReadLaserScanPointFromFile_XYZ_vector(_scan_file, scanLines); @@ -1075,8 +1084,16 @@ void rodPositionTest(void) long t1 = (long)GetTickCount64();//统计时间 SSX_rodParam rodParam; - rodParam.diameter = 52.0; //圆棒直径 - rodParam.len = 290; + if (0 == grp) + { + rodParam.diameter = 52.0; //圆棒直径 + rodParam.len = 290; + } + else + { + rodParam.diameter = 68.0; //圆棒直径 + rodParam.len = 187; + } SSG_cornerParam cornerParam; cornerParam.cornerTh = 60; //45度角 @@ -1231,7 +1248,7 @@ int main() locatingPlateTest(); #endif #else //棒材抓取定位测试 -#if 0 +#if 1 rodPositionTest(); #else rodWeldSeamPosition_test(); diff --git a/sourceCode/SG_lineFeature.cpp b/sourceCode/SG_lineFeature.cpp index 1901b8b..7c55810 100644 --- a/sourceCode/SG_lineFeature.cpp +++ b/sourceCode/SG_lineFeature.cpp @@ -4619,6 +4619,7 @@ void wd_getRodArcFeature_segmentPeakCornerMethod( //Сֵж int peakNum = (int)localZMin.size(); + SSG_intPair prePos = { -1, -1, -1 }; for (int i = 0; i < peakNum; i++) { int pkIdx = localZMin[i].jumpPos2D.y; @@ -4628,7 +4629,7 @@ void wd_getRodArcFeature_segmentPeakCornerMethod( ptDirAngles, lineData, arcPerPointCornerMinValue, arcTotalCornerMinValue, a_rodPos); - if (true == isArc) + if ( (true == isArc) && (prePos.idx != a_rodPos.idx)) { SWD_rodArcFeature a_rodArc; memset(&a_rodArc, 0, sizeof(SWD_rodArcFeature)); @@ -4641,6 +4642,7 @@ void wd_getRodArcFeature_segmentPeakCornerMethod( a_rodArc.peakPt = lineData[a_rodPos.idx].pt3D; a_rodArc.featureValue = ptDirAngles[a_rodPos.idx].corner; line_rodArcs.push_back(a_rodArc); + prePos = a_rodPos; } } return; diff --git a/sourceCode/rodAndBarDetection.cpp b/sourceCode/rodAndBarDetection.cpp index 5754cd7..c239313 100644 --- a/sourceCode/rodAndBarDetection.cpp +++ b/sourceCode/rodAndBarDetection.cpp @@ -19,7 +19,8 @@ //version 1.2.8 : ݸ˶λ㷨еһBug //version 1.2.9 : ݸ˶λ㷨ϼʱȷ⣬֤ͶӰĵͶӰǰĵƵZ仯һ //version 1.2.10 : Ľݸ˶λȡ㷨 -std::string m_strVersion = "1.2.10"; +//version 1.2.11 : ֳݵ +std::string m_strVersion = "1.2.11"; const char* wd_rodAndBarDetectionVersion(void) { return m_strVersion.c_str(); @@ -242,7 +243,7 @@ void rodAarcFeatueDetection( int linePtNum = (int)scanLines[0].size(); for (int line = 0; line < lineNum; line++) { - if (line == 827) + if (line == 1304) int kkk = 1; std::vector& lineData = scanLines[line]; @@ -632,8 +633,8 @@ SVzNL3DRangeD _getPointCloudROI(std::vector& scanData) } fitPoints.erase(fitPoints.begin(), fitPoints.begin() + eraseIdx); fit2DPos.erase(fit2DPos.begin(), fit2DPos.begin() + eraseIdx); - fitPoints.erase(fitPoints.end() - 5, fitPoints.end()); - fit2DPos.erase(fit2DPos.end() - 5, fit2DPos.end()); + fitPoints.erase(fitPoints.end() - 15, fitPoints.end()); + fit2DPos.erase(fit2DPos.end() - 15, fit2DPos.end()); } else { @@ -655,8 +656,8 @@ SVzNL3DRangeD _getPointCloudROI(std::vector& scanData) int eraseNum = (int)fitPoints.size() - eraseIdx; fitPoints.erase(fitPoints.end() - eraseNum, fitPoints.end()); fit2DPos.erase(fit2DPos.end() - eraseNum, fit2DPos.end()); - fitPoints.erase(fitPoints.begin(), fitPoints.begin() + 5); - fit2DPos.erase(fit2DPos.begin(), fit2DPos.begin() + 5); + fitPoints.erase(fitPoints.begin(), fitPoints.begin() + 15); + fit2DPos.erase(fit2DPos.begin(), fit2DPos.begin() + 15); } //ñ־ for (int j = 0; j < (int)fit2DPos.size(); j++)