hybridPosePositioning

version 1.4.1 : 转子钢芯, 每个输出结果添加了2D图像坐标
This commit is contained in:
jerryzeng 2026-09-18 17:23:42 +08:00
parent 79a7d6c49a
commit a6f1514273
3 changed files with 52 additions and 2 deletions

View File

@ -1223,7 +1223,8 @@ void _outputWorkpieceInfo(char* fileName, std::vector< WD_workpieceInfo>& workpi
}
//sprintf_s(dataStr, 250, "工件_%d: id=%d, type=%d", i + 1, workpiecePositions[i].id, workpiecePositions[i].workpieceType);
sw << dataStr << std::endl;
sprintf_s(dataStr, 50, " imgCenter: (%d, %d)", workpiecePositions[i].imgCenter.x, workpiecePositions[i].imgCenter.y);
sw << dataStr << std::endl;
sprintf_s(dataStr, 50, " center: (%g, %g, %g)", workpiecePositions[i].center.x, workpiecePositions[i].center.y, workpiecePositions[i].center.z);
sw << dataStr << std::endl;
sprintf_s(dataStr, 50, " x_dir: (%g, %g, %g)", workpiecePositions[i].x_dir.x, workpiecePositions[i].x_dir.y, workpiecePositions[i].x_dir.z);

View File

@ -23,7 +23,8 @@
//version 1.3.10 : 转子钢芯, 将分层系数由内部参数转为输入参数
//version 1.3.11 : 转子钢芯, 将边距系数由内部参数转为输入参数
//version 1.4.0 : 转子钢芯, 添加了隔板的识别和定位。 当定位隔板时,工件类型为9
std::string m_strVersion = "HybridPositioning 1.4.0";
//version 1.4.1 : 转子钢芯, 每个输出结果添加了2D图像坐标
std::string m_strVersion = "HybridPositioning 1.4.1";
const char* wd_hybridPositioningVersion(void)
{
return m_strVersion.c_str();
@ -1418,6 +1419,45 @@ void spacerBoardDetection(
return;
}
void _searchImgPosition(std::vector< std::vector<SVzNLPositionD>>& scanLinesInput, const SVzNL3DPoint& pos_3D, SVzNL2DPoint& pos_2D)
{
SVzNLPositionD bestPt;
memset(&bestPt, 0, sizeof(SVzNLPositionD));
double minDist = -1;
for (int line = 0; line < (int)scanLinesInput.size(); line++)
{
for (int j = 0; j < (int)scanLinesInput[line].size(); j++)
{
if (scanLinesInput[line][j].pt3D.z < 1e-4)
continue;
if (minDist < -1e-4)
{
bestPt = scanLinesInput[line][j];
minDist = abs(scanLinesInput[line][j].pt3D.x - pos_3D.x) +
abs(scanLinesInput[line][j].pt3D.y - pos_3D.y) +
abs(scanLinesInput[line][j].pt3D.z - pos_3D.z);
}
else
{
double dist = abs(scanLinesInput[line][j].pt3D.x - pos_3D.x) +
abs(scanLinesInput[line][j].pt3D.y - pos_3D.y) +
abs(scanLinesInput[line][j].pt3D.z - pos_3D.z);
if (minDist > dist)
{
bestPt = scanLinesInput[line][j];
minDist = dist;
}
}
}
}
if (minDist >= -1e-4)
pos_2D = { (int)bestPt.ptLeft2D.x, (int)bestPt.ptLeft2D.y };
else
pos_2D = { 0, 0 };
return;
}
void wd_HRM_RotorCorePositioning(
std::vector< std::vector<SVzNLPositionD>>& scanLinesInput,
std::vector<WD_objArea2D>& objROIs,
@ -1774,6 +1814,7 @@ void wd_HRM_RotorCorePositioning(
workpieceParam,
outsideEdgePtIndice,
centerPtIndice);
a_workpiece.imgCenter = { nCx, nCy };
a_workpiece.id = idx + 1;
#ifdef _OUTPUT_DEBUG_DATA
@ -1806,6 +1847,7 @@ void wd_HRM_RotorCorePositioning(
if (spacerInfo.center.z > 1e-4) //隔板
{
WD_workpieceInfo a_workpiece;
memset(&a_workpiece, 0, sizeof(WD_workpieceInfo));
a_workpiece.center = spacerInfo.center;
a_workpiece.id = 0;
a_workpiece.workpieceType = 9; //隔板
@ -1834,6 +1876,7 @@ void wd_HRM_RotorCorePositioning(
{
allWorkpiece.clear();
WD_workpieceInfo a_workpiece;
memset(&a_workpiece, 0, sizeof(WD_workpieceInfo));
a_workpiece.center = spacerInfo.center;
a_workpiece.id = 0;
a_workpiece.workpieceType = 9; //隔板
@ -2138,6 +2181,11 @@ void wd_HRM_RotorCorePositioning(
workpiecePositions[i].z_dir = rpt;
rpt = wd_ptRotate(workpiecePositions[i].x_dir, groundCalibPara.invRMatrix);
workpiecePositions[i].x_dir = rpt;
if (workpiecePositions[i].workpieceType == 9)
{
_searchImgPosition(scanLinesInput, workpiecePositions[i].center, workpiecePositions[i].imgCenter);
}
}
#ifdef _OUTPUT_DEBUG_DATA

View File

@ -16,6 +16,7 @@ typedef struct
{
int id; //序号从1开始
int workpieceType; //0:中央; 1-上边; 2-下边; 3-左边; 4-右边; 5-左上角; 6-右上角; 7-左下角; 8-右下角; 9-隔板
SVzNL2DPoint imgCenter; //ͼÏñ×ø±ê
SVzNL3DPoint center;
SVzNL3DPoint z_dir; //z方向向量(归一化)
SVzNL3DPoint y_dir; //y方向向量(归一化)