hybridPosePositioning

version 1.4.2 : 转子钢芯, 优化了点云中垂直部分去除的门限
This commit is contained in:
jerryzeng 2026-09-20 17:25:30 +08:00
parent a6f1514273
commit 8962f03d2a
2 changed files with 25 additions and 15 deletions

View File

@ -285,7 +285,7 @@ void _removeZeroLines_XYZUV(std::vector<std::vector< SVzNLPositionD>>& scanData)
} }
void vzReadObj2DROI_1(const char* fileName, std::vector<WD_objArea2D>& objROIs) void vzReadObj2DROI(const char* fileName, std::vector<WD_objArea2D>& objROIs)
{ {
std::ifstream inputFile(fileName); std::ifstream inputFile(fileName);
std::string linedata; std::string linedata;
@ -300,9 +300,19 @@ void vzReadObj2DROI_1(const char* fileName, std::vector<WD_objArea2D>& objROIs)
int objID; int objID;
char type; char type;
float L, T, W, H, score; float L, T, W, H, score;
sscanf_s(linedata.c_str(), "obj_%d: C=%c, Rect={ %f, %f, %f, %f }, Score=%f", size_t pos = linedata.find("Rect");
&objID, &type, sizeof(type), &L, &T, &W, &H, &score); if (pos != std::string::npos)
sscanf_s(linedata.c_str(), "obj_%d: C=%c, Rect={ %f, %f, %f, %f }, Score=%f", &objID, &type, sizeof(type), &L, &T, &W, &H, &score);
else
{
float Cx, Cy, R;
sscanf_s(linedata.c_str(), "obj_%d: C=%c, { %f, %f }, R=%f, Score=%f",
&objID, &type, sizeof(type), &Cx, &Cy, &R, &score);
L = Cx - R;
T = Cy - R;
W = R * 2;
H = R * 2;
}
WD_objArea2D a_roi; WD_objArea2D a_roi;
if ('a' == type) if ('a' == type)
a_roi.workpieceType = 1; a_roi.workpieceType = 1;
@ -322,6 +332,7 @@ void vzReadObj2DROI_1(const char* fileName, std::vector<WD_objArea2D>& objROIs)
return; return;
} }
#if 0
void vzReadObj2DROI(const char* fileName, std::vector<WD_objArea2D>& objROIs) void vzReadObj2DROI(const char* fileName, std::vector<WD_objArea2D>& objROIs)
{ {
std::ifstream inputFile(fileName); std::ifstream inputFile(fileName);
@ -358,6 +369,7 @@ void vzReadObj2DROI(const char* fileName, std::vector<WD_objArea2D>& objROIs)
inputFile.close(); inputFile.close();
return; return;
} }
#endif
void _outputRGBDResult_XYZUV_RGBD( void _outputRGBDResult_XYZUV_RGBD(
char* fileName, char* fileName,
@ -2188,7 +2200,7 @@ void HaiRuiMa_TaperedWorkpiece_test(void)
sprintf_s(_scan_file, "%s%d_result.txt", dataPath[grp], fidx); sprintf_s(_scan_file, "%s%d_result.txt", dataPath[grp], fidx);
std::vector<WD_objArea2D> objROIs; std::vector<WD_objArea2D> objROIs;
vzReadObj2DROI_1(_scan_file, objROIs); vzReadObj2DROI(_scan_file, objROIs);
long t1 = (long)GetTickCount64();//统计时间 long t1 = (long)GetTickCount64();//统计时间
@ -2351,13 +2363,13 @@ void HaiRuiMa_rotorCorePositioning_test(void)
}; };
SVzNLRange fileIdx[HRM_RotorCore_TEST_GROUP] = { SVzNLRange fileIdx[HRM_RotorCore_TEST_GROUP] = {
{1,10}, {3,70},{2,2}, {1,47}, {1,54} {1,10}, {3,70},{3,7}, {1,47}, {1,54}
}; };
const char* ver = wd_hybridPositioningVersion(); const char* ver = wd_hybridPositioningVersion();
printf("ver:%s\n", ver); printf("ver:%s\n", ver);
for (int grp = 3; grp < HRM_RotorCore_TEST_GROUP; grp++) for (int grp = 2; grp <= 2; grp++)
{ {
SSG_planeCalibPara groundCalibPara; SSG_planeCalibPara groundCalibPara;
//初始化成单位阵 //初始化成单位阵
@ -2427,10 +2439,7 @@ void HaiRuiMa_rotorCorePositioning_test(void)
else else
sprintf_s(_scan_file, "%s%d_result.txt", dataPath[grp], fidx); sprintf_s(_scan_file, "%s%d_result.txt", dataPath[grp], fidx);
std::vector<WD_objArea2D> objROIs; std::vector<WD_objArea2D> objROIs;
if( ((grp == 0) && (fidx <= 9)) || ((grp >=3)&&(grp<=4))) vzReadObj2DROI(_scan_file, objROIs);
vzReadObj2DROI(_scan_file, objROIs);
else
vzReadObj2DROI_1(_scan_file, objROIs);
SWD_Cylinder workpieceParam; //圆柱形工件的标称半径和高度 SWD_Cylinder workpieceParam; //圆柱形工件的标称半径和高度
if (grp == 3) if (grp == 3)
@ -2451,7 +2460,7 @@ void HaiRuiMa_rotorCorePositioning_test(void)
SVzNLSizeD spacerParam; //隔板参数:长和宽 SVzNLSizeD spacerParam; //隔板参数:长和宽
spacerParam.dWidth = 720.0; spacerParam.dWidth = 720.0;
spacerParam.dHeight = 510.0; spacerParam.dHeight = 520.0;
double layerRatio = 0.5; //分层系数,分层门限=分层系数*工件高度;当两个工件的高度差大于分层门限时,判断为在不同层 double layerRatio = 0.5; //分层系数,分层门限=分层系数*工件高度;当两个工件的高度差大于分层门限时,判断为在不同层
const double distToSideRatio = 1.1; //边距系数,边距门限=边距系数*工件直径;当工件距边的距离大于边距门限时,判断为边上的工件 const double distToSideRatio = 1.1; //边距系数,边距门限=边距系数*工件直径;当工件距边的距离大于边距门限时,判断为边上的工件

View File

@ -24,7 +24,8 @@
//version 1.3.11 : 转子钢芯, 将边距系数由内部参数转为输入参数 //version 1.3.11 : 转子钢芯, 将边距系数由内部参数转为输入参数
//version 1.4.0 : 转子钢芯, 添加了隔板的识别和定位。 当定位隔板时,工件类型为9 //version 1.4.0 : 转子钢芯, 添加了隔板的识别和定位。 当定位隔板时,工件类型为9
//version 1.4.1 : 转子钢芯, 每个输出结果添加了2D图像坐标 //version 1.4.1 : 转子钢芯, 每个输出结果添加了2D图像坐标
std::string m_strVersion = "HybridPositioning 1.4.1"; //version 1.4.2 : 转子钢芯, 优化了点云中垂直部分去除的门限
std::string m_strVersion = "HybridPositioning 1.4.2";
const char* wd_hybridPositioningVersion(void) const char* wd_hybridPositioningVersion(void)
{ {
return m_strVersion.c_str(); return m_strVersion.c_str();
@ -400,7 +401,7 @@ WD_workpieceInfo _computeWorkpiecePose(
std::vector<std::vector<SWD_indexingSeg>> vScanLineSegs; std::vector<std::vector<SWD_indexingSeg>> vScanLineSegs;
for (int line = 0; line < lineNum; line++) for (int line = 0; line < lineNum; line++)
{ {
if (line == 83) if (line == 62)
int kkk = 1; int kkk = 1;
//分段 //分段
std::vector<SSG_RUN> simpleSegs; std::vector<SSG_RUN> simpleSegs;
@ -1570,7 +1571,7 @@ void wd_HRM_RotorCorePositioning(
SSG_cornerParam removeVertialPara; SSG_cornerParam removeVertialPara;
memset(&removeVertialPara, 0, sizeof(SSG_cornerParam)); memset(&removeVertialPara, 0, sizeof(SSG_cornerParam));
removeVertialPara.scale = 3.0; removeVertialPara.scale = 3.0;
removeVertialPara.cornerTh = 60; removeVertialPara.cornerTh = 45;
std::vector<std::vector<int>> flags; std::vector<std::vector<int>> flags;
flags.resize(lineNum); flags.resize(lineNum);