algoLib/sourceCode/rodAndBarDetection_Export.h

146 lines
4.5 KiB
C
Raw Normal View History

2026-01-11 17:04:06 +08:00
#pragma once
#include "SG_algo_Export.h"
#include <vector>
#define _OUTPUT_DEBUG_DATA 1
typedef struct
{
SVzNL3DPoint center; //<2F>ݸ˶˲<CBB6><CBB2><EFBFBD><EFBFBD>ĵ<EFBFBD>
SVzNL3DPoint axialDir; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}SSX_rodPoseInfo; //
typedef struct
{
SVzNL3DPoint center; //<2F>ݸ˶˲<CBB6><CBB2><EFBFBD><EFBFBD>ĵ<EFBFBD>
SVzNL3DPoint xDir;
SVzNL3DPoint yDir;
SVzNL3DPoint normalDir; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SVzNL3DPoint holeLT;
SVzNL3DPoint holeRB;
}SSX_platePoseInfo; //
2026-01-11 17:04:06 +08:00
typedef struct
{
double diameter;
double len;
}SSX_rodParam; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
typedef struct
{
int id; //<2F><><EFBFBD>Ŵ<EFBFBD>1<EFBFBD><31>ʼ
int workpieceType; //0:<3A><><EFBFBD><EFBFBD>; 1-<2D>ϱ<EFBFBD>; 2-<2D>±<EFBFBD>; 3-<2D><><EFBFBD><EFBFBD>; 4-<2D>ұ<EFBFBD>; 5-<2D><><EFBFBD>Ͻ<EFBFBD>; 6-<2D><><EFBFBD>Ͻ<EFBFBD>; 7-<2D><><EFBFBD>½<EFBFBD>; 8-<2D><><EFBFBD>½<EFBFBD>;
SVzNL3DPoint center; //<2F>ݸ˶˲<CBB6><CBB2><EFBFBD><EFBFBD>ĵ<EFBFBD>
SVzNL3DPoint axialDir; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SVzNL3DPoint normalDir; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SVzNL3DPoint startPt;
SVzNL3DPoint endPt;
}SSX_rodPositionInfo;
typedef enum
{
KeWD_WELD_CATEGORY_UNKNOWN = 0,
KeWD_WELD_CATEGPRY_I, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ÿ<EFBFBD><C3BF><EFBFBD>ֽ<D6BD><EEB6BC>֧<EFBFBD><D6A7>
KeWD_WELD_CATEGPRY_II, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸֽ<C4B8><D6BD><EFBFBD>֧<EFBFBD><D6A7>
}EWD_weldingCategory;
typedef enum
{
KeWD_WELD_UNKNOWN = 0,
KeWD_WELD_POINT, //<2F><><EFBFBD><EFBFBD>
KeWD_WELD_SEAM, //<2F><><EFBFBD><EFBFBD>
KeWD_WELD_SEAM_GAP, //<2F><><EFBFBD>죬<EFBFBD>з<EFBFBD>϶
}EWD_weldType;
typedef struct
{
EWD_weldType weldType;
SVzNL3DPoint startPt;
SVzNL3DPoint endPt;
SVzNL3DPoint center;
SVzNL3DPoint axialDir;
SVzNL3DPoint normalDir; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector< SVzNL3DPoint> centerPts;
std::vector< SVzNL3DPoint> edgePts_0;
std::vector< SVzNL3DPoint> edgePts_1;
}SSX_weldSeamInfo;
2026-01-11 17:04:06 +08:00
//<2F><><EFBFBD>汾<EFBFBD><E6B1BE>
SG_APISHARED_EXPORT const char* wd_rodAndBarDetectionVersion(void);
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>Ͳο<CDB2><CEBF><EFBFBD>ƽƽ<C6BD>棬<EFBFBD><E6A3AC><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ƽ
//<2F><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD>淨<EFBFBD><E6B7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
SG_APISHARED_EXPORT SSG_planeCalibPara sx_rodPosition_getBaseCalibPara(
std::vector< std::vector<SVzNL3DPosition>>& scanLines);
#if 1
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SG_APISHARED_EXPORT void sx_rodPosition_lineDataR(
std::vector< SVzNL3DPosition>& a_line,
const double* camPoseR,
double groundH);
#endif
2026-01-11 17:04:06 +08:00
//<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD>ݸ˶˲<CBB6><CBB2><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SG_APISHARED_EXPORT void sx_hexHeadScrewMeasure(
2026-01-11 17:04:06 +08:00
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
bool isHorizonScan, //true:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD>в۵<D0B2><DBB5><EFBFBD>false:<3A><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>ֱ<EFBFBD>۵<EFBFBD>
const SSG_cornerParam cornerPara,
const SSG_outlierFilterParam filterParam,
const SSG_treeGrowParam growParam,
double rodDiameter,
std::vector<SSX_rodPoseInfo>& screwInfo,
int* errCode);
//PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ˶˲<CBB6><CBB2><EFBFBD><EFBFBD>ĵ<EFBFBD>λ<EFBFBD><CEBB>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sx_hexHeadScrewMeasure()<29><><EFBFBD>㷨<EFBFBD>ϣ<EFBFBD>1<EFBFBD><31>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD>ˮƽ<CBAE>Σ<EFBFBD>2<EFBFBD><32>ʹ<EFBFBD><CAB9>PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SG_APISHARED_EXPORT void sx_hexHeadScrewMeasure_PCA(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
//bool isHorizonScan, //true:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD>в۵<D0B2><DBB5><EFBFBD>false:<3A><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>ֱ<EFBFBD>۵<EFBFBD>
const SSG_cornerParam cornerPara,
const SSG_outlierFilterParam filterParam,
const SSG_treeGrowParam growParam,
double rodDiameter,
std::vector<SSX_rodPoseInfo>& screwInfo,
int* errCode);
//<2F><><EFBFBD>㶨λ<E3B6A8><CEBB><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>λ<EFBFBD><CEBB>
SG_APISHARED_EXPORT SSX_platePoseInfo sx_getLocationPlatePose(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
const SSG_cornerParam cornerPara,
2026-01-11 17:04:06 +08:00
int* errCode);
//<2F>µļ<C2B5><C4BC>㶨λ<E3B6A8><CEBB><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>λ<EFBFBD>ˣ<EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>˶<EFBFBD>λ<EFBFBD>̣<EFBFBD>ֻ<EFBFBD>ж<EFBFBD>λ<EFBFBD>壩
SG_APISHARED_EXPORT SSX_platePoseInfo sx_getLocationPlatePose_new(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
const SSG_cornerParam cornerPara,
int* errCode);
//<2F><><EFBFBD><EFBFBD>ץȡ<D7A5><C8A1>λ
SG_APISHARED_EXPORT void sx_rodPositioning(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
const SSG_planeCalibPara poseCalibPara,
const SSG_cornerParam cornerPara,
const SSG_outlierFilterParam filterParam,
const SSG_treeGrowParam growParam,
const SSX_rodParam rodParam,
const double distToSideRatio, //<2F>߾<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD><DFBE><EFBFBD><EFBFBD><EFBFBD>=<3D>߾<EFBFBD>ϵ<EFBFBD><CFB5>*<2A><><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵľ<DFB5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڱ߾<DAB1><DFBE><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ϵĹ<CFB5><C4B9><EFBFBD>
const double groundRemoveOffset, //<2F>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD>Zƫ<5A>ã<EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD>߶<EFBFBD>Ϊ groundCalibPara.planeHeight - groundRemoveOffset
const double clusterNDist, //<2F>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶ȣ<DFB6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>ڴ˳߶<CBB3>ʱ<EFBFBD><CAB1> <20><><EFBFBD><EFBFBD>Ϊһ<CEAA>ࡣ<EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ܶ<EFBFBD><DCB6><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3>Ͽ<EFBFBD><CFBF><EFBFBD>Χ<EFBFBD>ĸ<EFBFBD><C4B8>š<EFBFBD>
std::vector<SSX_rodPositionInfo>& rodInfo,
SWD_BinInfo& binInfo, //<2F><><EFBFBD><EFBFBD>Bin<69><6E>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>debug<75><67>ȷ<EFBFBD><C8B7><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ
int* errCode);
//<2F><>ԣ<EFBFBD>ֽṹ<D6BD>ֽ<D6BD>춨λ
SG_APISHARED_EXPORT void sx_rebarWeldSeamPositioning(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
const SSG_planeCalibPara poseCalibPara,
const SSG_cornerParam cornerPara,
const SSG_outlierFilterParam filterParam,
const SSG_treeGrowParam growParam,
const SSX_rodParam rodParam,
const SVzNLRangeD weldSeamRange, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<D6BD><EEBDBB><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD>Сֵ<D0A1><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
EWD_weldingCategory weldCategory,
std::vector<SSX_weldSeamInfo>& weldSeamInfo,
int* errCode);