From 36798e875407126cd76851b4ef5fb5b44a67a3be Mon Sep 17 00:00:00 2001 From: jerryzeng Date: Sat, 25 Apr 2026 09:36:41 +0800 Subject: [PATCH] =?UTF-8?q?workpieceHolePositioning=20version=201.4.7=20:?= =?UTF-8?q?=20=E4=BF=AE=E6=AD=A3=E9=97=AE=E9=A2=98=EF=BC=9A=E5=9C=A8?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E5=BC=82=E7=89=A9=E6=A3=80=E6=B5=8B=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E8=AE=A1=E7=AE=97ZSliceTh=E6=97=B6=E3=80=82=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0Z=E8=AE=A1=E7=AE=97=E7=9A=84=E4=BF=9D=E6=8A=A4?= =?UTF-8?q?=EF=BC=8C=E9=98=B2=E6=AD=A2=E5=BC=82=E5=B8=B8=E5=80=BC=E6=B7=B7?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sourceCode/workpieceHolePositioning.cpp | 30 ++++++++++++++----- .../workpieceHolePositioning_test.cpp | 2 +- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/sourceCode/workpieceHolePositioning.cpp b/sourceCode/workpieceHolePositioning.cpp index 3ee5724..aaf41b0 100644 --- a/sourceCode/workpieceHolePositioning.cpp +++ b/sourceCode/workpieceHolePositioning.cpp @@ -17,7 +17,8 @@ //version 1.4.4 : 对1.4.3一个小的修正, 不影响结果 //version 1.4.5 : 添加异物检测,通过errCode输出“有异物”和“无产品”结果 //version 1.4.6 : 修正问题:4个孔组成工作时,需要4个孔的高度基本一致。 -std::string m_strVersion = "1.4.6"; +//version 1.4.7 : 修正问题:在进行异物检测时,计算ZSliceTh时。添加Z计算的保护,防止异常值混入 +std::string m_strVersion = "1.4.7"; const char* wd_workpieceHolePositioningVersion(void) { return m_strVersion.c_str(); @@ -139,7 +140,7 @@ int angleConditionDistanceSearch( return result; } -double _getMeanZ(std::vector>& quantiValue, SVzNL3DPoint seed, SVzNLRect& roi2D, double rectR) +double _getMeanZ(std::vector>& quantiValue, SVzNL3DPoint seed, SVzNLRect& roi2D, double rectR, double zRange) { int cols = (int)quantiValue.size(); int rows = (int)quantiValue[0].size(); @@ -149,6 +150,7 @@ double _getMeanZ(std::vector>& quantiValue, SVzNL3DPoint see int win = (int)rectR; int hist = 0; double zSum = 0; + double refZ = seed.z; for (int i = -win; i <= win; i++) { for (int j = -win; j <= win; j++) @@ -159,8 +161,12 @@ double _getMeanZ(std::vector>& quantiValue, SVzNL3DPoint see { if (quantiValue[qx][qy] > 1e-4) { - zSum += quantiValue[qx][qy]; - hist++; + double zDiff = abs(quantiValue[qx][qy] - refZ); + if (zDiff < zRange) + { + zSum += quantiValue[qx][qy]; + hist++; + } } } } @@ -864,10 +870,18 @@ void wd_workpieceHolePositioning( SVzNL3DPoint center_p1p3 = { (p1.center.x + p3.center.x) / 2,(p1.center.y + p3.center.y) / 2, (p1.center.z + p3.center.z) / 2 }; SVzNL3DPoint center_p2p3 = { (p2.center.x + p3.center.x) / 2,(p2.center.y + p3.center.y) / 2, (p2.center.z + p3.center.z) / 2 }; double rectR = 5.0; - double z1 = _getMeanZ(quantiValue, center_p0p1, roi2D, rectR); - double z2 = _getMeanZ(quantiValue, center_p0p2, roi2D, rectR); - double z3 = _getMeanZ(quantiValue, center_p1p3, roi2D, rectR); - double z4 = _getMeanZ(quantiValue, center_p2p3, roi2D, rectR); + double z1 = _getMeanZ(quantiValue, center_p0p1, roi2D, rectR, workpiecePara.H/2); + if (z1 < 1e-4) + z1 = center_p0p1.z; + double z2 = _getMeanZ(quantiValue, center_p0p2, roi2D, rectR, workpiecePara.H / 2); + if (z2 < 1e-4) + z2 = center_p0p2.z; + double z3 = _getMeanZ(quantiValue, center_p1p3, roi2D, rectR, workpiecePara.H / 2); + if (z3 < 1e-4) + z3 = center_p1p3.z; + double z4 = _getMeanZ(quantiValue, center_p2p3, roi2D, rectR, workpiecePara.H / 2); + if (z4 < 1e-4) + z4 = center_p2p3.z; p0.center.z = (z1 + z2) / 2; p1.center.z = (z1 + z3) / 2; diff --git a/workpieceHolePositioning_test/workpieceHolePositioning_test.cpp b/workpieceHolePositioning_test/workpieceHolePositioning_test.cpp index fd36b8f..f654f83 100644 --- a/workpieceHolePositioning_test/workpieceHolePositioning_test.cpp +++ b/workpieceHolePositioning_test/workpieceHolePositioning_test.cpp @@ -566,7 +566,7 @@ void TuoPuFa_holePosition_test(void) }; SVzNLRange fileIdx[TPF_TEST_GROUP] = { - {6,6}, {1, 16}, {9,9} + {6,6}, {1, 16}, {13,13} }; const char* ver = wd_workpieceHolePositioningVersion();