diff --git a/hybridPosePositioning_test/hybridPosePositioning_test.cpp b/hybridPosePositioning_test/hybridPosePositioning_test.cpp index 154dd4b..7fffaa7 100644 --- a/hybridPosePositioning_test/hybridPosePositioning_test.cpp +++ b/hybridPosePositioning_test/hybridPosePositioning_test.cpp @@ -2467,7 +2467,7 @@ void HaiRuiMa_groundCalib_test(void) } //æ‹“æ™®å�‘工件孔定ä½�(工件定ä½�) -#define HRM_RotorCore_TEST_GROUP 11 +#define HRM_RotorCore_TEST_GROUP 15 void HaiRuiMa_rotorCorePositioning_test(void) { const char* dataPath[HRM_RotorCore_TEST_GROUP] = { @@ -2477,24 +2477,28 @@ void HaiRuiMa_rotorCorePositioning_test(void) "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�钢芯/现场数æ�®/", //2 "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/定å­�æ•°æ�®/09-14/", //3 "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/定å­�æ•°æ�®/09-14中/", //4 - "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/定å­�æ•°æ�®/异常数æ�®/", //5 + "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/定å­�æ•°æ�®/异常数æ�®_1/", //5 "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/定å­�æ•°æ�®/10-09å°�/", //6 "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/定å­�æ•°æ�®/æ›´æ�¢5mm镜头相机/", //7 "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/转å­�æ•°æ�®/10.21æ•°æ�®/1-24中型/", //8 "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/转å­�æ•°æ�®/10.21æ•°æ�®/25-63å°�åž‹/", //9 "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/转å­�æ•°æ�®/10.21æ•°æ�®/64-87大型/", //10 + "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/定å­�æ•°æ�®/20261023æ•°æ�®/", //11 + "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/定å­�æ•°æ�®/20261024æ•°æ�®/", //12 + "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/定å­�æ•°æ�®/异常数æ�®/", //13 + "F:/ShangGu/项目/冠钦项目/å®�波海瑞马/转å­�定å­�抓å�–/转å­�æ•°æ�®/2楼转å­�异常数æ�®/", //14 }; SVzNLRange fileIdx[HRM_RotorCore_TEST_GROUP] = { {1,10}, {3,70},{9,9}, {1,54}, {1,54}, - {1,6}, {1,8}, {1, 16},{1,24}, {25,63}, - {64,87} + {7,9}, {1,8}, {1, 16},{1,24}, {25,63}, + {64,87},{1,80}, {1,178}, {1, 39}, {1,38} }; const char* ver = wd_hybridPositioningVersion(); printf("ver:%s\n", ver); - for (int grp = 3; grp <= 7; grp++) + for (int grp = 14; grp <= 14; grp++) { SSG_planeCalibPara groundCalibPara; //åˆ�始化æˆ�å�•ä½�阵 @@ -2518,7 +2522,10 @@ void HaiRuiMa_rotorCorePositioning_test(void) { //fidx = 50; char _scan_file[256]; - sprintf_s(_scan_file, "%s%d_cloud.txt", dataPath[grp], fidx); + if( (grp>= 12) && (grp <= 14)) + sprintf_s(_scan_file, "%s%d.txt", dataPath[grp], fidx); + else + sprintf_s(_scan_file, "%s%d_cloud.txt", dataPath[grp], fidx); std::vector> scanLines; vzReadLaserScanPointFromFile_XYZUV_vector(_scan_file, scanLines); _removeZeroLines_XYZUV(scanLines); @@ -2570,7 +2577,14 @@ void HaiRuiMa_rotorCorePositioning_test(void) std::vector objROIs; vzReadObj2DROI(_scan_file, objROIs); #else //使用掩膜 - sprintf_s(_scan_file, "%s%d_mask.bmp", dataPath[grp], fidx); + if (grp == 11) //20261023æ•°æ�® + sprintf_s(_scan_file, "%s%d_reinspection_2d_mask.bmp", dataPath[grp], fidx); + else if( (grp == 12) ||(grp == 14)) ////20261024æ•°æ�® + sprintf_s(_scan_file, "%s%d_input_reinspection_2d_mask.bmp", dataPath[grp], fidx); + else if(grp ==13) + sprintf_s(_scan_file, "%s%d_reinspection_2d_mask.bmp", dataPath[grp], fidx); + else + sprintf_s(_scan_file, "%s%d_mask.bmp", dataPath[grp], fidx); // // 读å�– BMP 文件(彩色,默认) cv::Mat img = cv::imread(_scan_file, cv::IMREAD_COLOR); @@ -2630,6 +2644,8 @@ void HaiRuiMa_rotorCorePositioning_test(void) EWD_WorkpieceClass workpieceClass = keWD_Class_Stator; if ((grp >= 8) && (grp <= 10)) workpieceClass = keWD_Class_Rotor; + else if(grp == 14) + workpieceClass = keWD_Class_Rotor; SVzNLSizeD spacerParam; //éš”æ�¿å�‚数:长和宽 spacerParam.dWidth = 720.0; diff --git a/sourceCode/hybridPosePositioning.cpp b/sourceCode/hybridPosePositioning.cpp index 411843b..eae27a5 100644 --- a/sourceCode/hybridPosePositioning.cpp +++ b/sourceCode/hybridPosePositioning.cpp @@ -36,7 +36,8 @@ //version 1.5.1 : ת×Ó¸Öо£¬2D½á¹ûÓÉROIÊäÈë»»³ÉÑÚÂëÊäÈë //version 1.5.2 : ת×Ó¸Öо£¬(1)2D½á¹ûÌí¼Ó×ø±ê±£»¤¡£µãÔÆÊä³öµÄ×ø±ê»á³¬¹ý£¨1920£¬ 1216£©¡£ // (2)¸Ä½ø¶¨×Ó¼ì²â¼ì²â·½·¨ £¨3£©¸Ä½ø¸ô°å¼ì²â£¬¹¤¼þÑÚĤÖеĵ㲻²ÎÓë¸ô°å¼ì²â -std::string m_strVersion = "HybridPositioning 1.5.2"; +//version 1.5.3 : ת×Ó¸Öо£¬×ª×ӸĽøÐé¼ÙÄ¿±ê¹ýÂËÂß¼­£¨Ô­ÒòÊÇת×ÓÖмä¿×±È½ÏС£¬Ô­À´Ã»Óиô°åʱµÄ¹ýÂËÂß¼­ÓÐÎÊÌâ +std::string m_strVersion = "HybridPositioning 1.5.3"; const char* wd_hybridPositioningVersion(void) { return m_strVersion.c_str(); @@ -2642,9 +2643,9 @@ void wd_HRM_RotorCorePositioning( if (idx == 44) int kkk = 1; SSG_ROIRect& obj_roi = objROIs[idx]; - int ex_w = (obj_roi.right - obj_roi.left) / 6; - int ex_h = (obj_roi.bottom - obj_roi.top) / 6; - double roi_R = ex_w < ex_h ? (double)ex_w : (double)ex_h; + int ex_w = (obj_roi.right - obj_roi.left) / 3; + int ex_h = (obj_roi.bottom - obj_roi.top) / 3; + double roi_R = ex_w < ex_h ? (double)ex_w : (double)ex_h; //ת×ÓÖÐÑë¿×·¶Î§ int L = obj_roi.left - ex_w; if (L < 0) L = 0; @@ -2715,6 +2716,10 @@ void wd_HRM_RotorCorePositioning( roiScanLines[line].resize(roiLinePtNum); dataRoiMask[line].resize(roiLinePtNum); } + + int totalPixelsInR = 0; + int zeroPointsInR = 0; + std::vector pointsInR; for (int x = L; x <= R; x++) { for (int y = T; y <= B; y++) @@ -2726,6 +2731,8 @@ void wd_HRM_RotorCorePositioning( int ptIdx = a_mapping.mappings[m].ptIdx; if ((lineIdx == 275) && (ptIdx == 929)) int kkk = 1; + + double dist = sqrt((x - nCx) * (x - nCx) + (y - nCy) * (y - nCy)); if (scanLines[lineIdx][ptIdx].pt3D.z > 1e-4) { scanLines[lineIdx][ptIdx].nPointIdx &= 0xffff0000; @@ -2740,7 +2747,6 @@ void wd_HRM_RotorCorePositioning( dataRoiMask[roiLineIdx][roiPtIdx] = 1; //ËÑË÷ÖÐÐĵã - double dist = sqrt((x - nCx) * (x - nCx) + (y - nCy) * (y - nCy)); if (minDist < 0) { minDist = dist; @@ -2752,6 +2758,14 @@ void wd_HRM_RotorCorePositioning( centerPosition = { roiLineIdx, roiPtIdx }; } } + if (dist < roi_R) + { + totalPixelsInR++; + if (scanLines[lineIdx][ptIdx].pt3D.z > 1e-4) + pointsInR.push_back(scanLines[lineIdx][ptIdx].pt3D); + else + zeroPointsInR++; + } } } } @@ -2803,18 +2817,36 @@ void wd_HRM_RotorCorePositioning( a_workpiece.center = { 0.0, 0.0, 0.0 }; } } - else + else { - //ËÑË÷µãÔÆÓ빤¼þÖÐÐÄ×î½Ó½üµÄµã - std::vector roiPoints; - _searchRCirclePoints(roiScanLines_copy, dataRoiMask, a_workpiece.center, a_workpiece.value * 0.1, roiPoints); - double meanZ = _getListMeanZ_2(roiPoints); - if (meanZ > 1e-4) + if (keWD_Class_Stator == workpieceClass) //version1.5.3: Ö»Óж¨×Ó¿ÉÒÔʹÓÃÕâÖÖÂß¼­£¬×ª×ÓÖмä¿×±È½ÏС£¬ÐèÒªÁíÒ»ÖÖÂß¼­ { - double heightDiff = meanZ - a_workpiece.center.z; - if (heightDiff < workpieceParam.height / 2) + //ËÑË÷µãÔÆÓ빤¼þÖÐÐÄ×î½Ó½üµÄµã + std::vector roiPoints; + _searchRCirclePoints(roiScanLines_copy, dataRoiMask, a_workpiece.center, a_workpiece.value * 0.1, roiPoints); + double meanZ = _getListMeanZ_2(roiPoints); + if (meanZ > 1e-4) + { + double heightDiff = meanZ - a_workpiece.center.z; + if (heightDiff < workpieceParam.height / 2) + a_workpiece.center = { 0.0, 0.0, 0.0 }; + } + } +#if 0 + else //version1.5.3: ת×Ó¹ýÂËÂß¼­£ºËÑË÷´°¿ÚÄÚ¿Õ°×µãºÍ´óÓÚ£¨workpieceParam.height / 2£©µÄµã£¬¿´µãµÄÊýÄ¿ + { + double zMin = a_workpiece.center.z + workpieceParam.height / 2; + int vldPtsNum = 0; + for (int m = 0; m < (int)pointsInR.size(); m++) + { + if (pointsInR[m].z > zMin) + vldPtsNum++; + } + vldPtsNum += zeroPointsInR; + if (vldPtsNum < 1) //version1.5.3£º´Ë´¦ÊǹýÂËÔëÉù a_workpiece.center = { 0.0, 0.0, 0.0 }; } +#endif } #ifdef _OUTPUT_DEBUG_DATA