216 lines
6.2 KiB
C++
216 lines
6.2 KiB
C++
|
|
#include <vector>
|
|||
|
|
#include "SG_baseDataType.h"
|
|||
|
|
#include "SG_baseAlgo_Export.h"
|
|||
|
|
#include "SX_lapWeldDetection_Export.h"
|
|||
|
|
#include <opencv2/opencv.hpp>
|
|||
|
|
#include <limits>
|
|||
|
|
|
|||
|
|
//<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>
|
|||
|
|
SSG_planeCalibPara sx_getBaseCalibPara(
|
|||
|
|
std::vector< std::vector<SVzNL3DPosition>>& scanLines)
|
|||
|
|
{
|
|||
|
|
return sg_getPlaneCalibPara2(scanLines);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̬<EFBFBD><CCAC>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void sx_lineDataR(
|
|||
|
|
std::vector< SVzNL3DPosition>& a_line,
|
|||
|
|
const double* camPoseR,
|
|||
|
|
double groundH)
|
|||
|
|
{
|
|||
|
|
lineDataRT_vector(a_line, camPoseR, groundH);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD>
|
|||
|
|
void sx_getLapWeldPostion(
|
|||
|
|
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
|
|||
|
|
const SSG_cornerParam cornerPara,
|
|||
|
|
SSG_treeGrowParam growParam,
|
|||
|
|
SSX_lapWeldParam lapWeldParam,
|
|||
|
|
std::vector<std::vector<SVzNL3DPoint>>& objOps,
|
|||
|
|
int* errCode)
|
|||
|
|
{
|
|||
|
|
*errCode = 0;
|
|||
|
|
int lineNum = (int)scanLines.size();
|
|||
|
|
if (lineNum == 0)
|
|||
|
|
{
|
|||
|
|
*errCode = SG_ERR_3D_DATA_NULL;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int linePtNum = (int)scanLines[0].size();
|
|||
|
|
bool isGridData = true;
|
|||
|
|
//<2F><>ֱarc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ
|
|||
|
|
std::vector<std::vector<SSG_basicFeature1D>> jumpFeatures_v;
|
|||
|
|
for (int line = 0; line < lineNum; line++)
|
|||
|
|
{
|
|||
|
|
if (line == 400)
|
|||
|
|
int kkk = 1;
|
|||
|
|
|
|||
|
|
std::vector<SVzNL3DPosition>& lineData = scanLines[line];
|
|||
|
|
if (linePtNum != (int)lineData.size())
|
|||
|
|
isGridData = false;
|
|||
|
|
|
|||
|
|
std::vector<SSG_basicFeature1D> a_line_features;
|
|||
|
|
int dataSize = (int)lineData.size();
|
|||
|
|
sg_getLineJumpFeature_cornerMethod(
|
|||
|
|
&scanLines[line][0],
|
|||
|
|
dataSize,
|
|||
|
|
line,
|
|||
|
|
cornerPara, //scaleͨ<65><CDA8>ȡbagH<67><48>1/4
|
|||
|
|
a_line_features);
|
|||
|
|
jumpFeatures_v.push_back(a_line_features);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (false == isGridData)//<2F><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
|
|||
|
|
{
|
|||
|
|
*errCode = SG_ERR_NOT_GRID_FORMAT;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ˮƽɨ<C6BD><C9A8>
|
|||
|
|
std::vector<std::vector<SVzNL3DPosition>> hLines;
|
|||
|
|
hLines.resize(linePtNum);
|
|||
|
|
for (int i = 0; i < linePtNum; i++)
|
|||
|
|
hLines[i].resize(lineNum);
|
|||
|
|
for (int line = 0; line < lineNum; line++)
|
|||
|
|
{
|
|||
|
|
for (int j = 0; j < linePtNum; j++)
|
|||
|
|
{
|
|||
|
|
scanLines[line][j].nPointIdx = 0; //<2F><>ԭʼ<D4AD><CABC><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ʹ<EFBFBD>ã<EFBFBD>
|
|||
|
|
hLines[j][line] = scanLines[line][j];
|
|||
|
|
hLines[j][line].pt3D.x = scanLines[line][j].pt3D.y;
|
|||
|
|
hLines[j][line].pt3D.y = scanLines[line][j].pt3D.x;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//ˮƽarc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ
|
|||
|
|
std::vector<std::vector<SSG_basicFeature1D>> jumpFeatures_h;
|
|||
|
|
int lineNum_h = (int)hLines.size();
|
|||
|
|
for (int line = 0; line < lineNum_h; line++)
|
|||
|
|
{
|
|||
|
|
std::vector<SVzNL3DPosition>& lineData = hLines[line];
|
|||
|
|
|
|||
|
|
std::vector<SSG_basicFeature1D> a_line_features;
|
|||
|
|
int dataSize = (int)lineData.size();
|
|||
|
|
sg_getLineJumpFeature_cornerMethod(
|
|||
|
|
&hLines[line][0],
|
|||
|
|
dataSize,
|
|||
|
|
line,
|
|||
|
|
cornerPara, //scaleͨ<65><CDA8>ȡbagH<67><48>1/4
|
|||
|
|
a_line_features);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5>
|
|||
|
|
jumpFeatures_h.push_back(a_line_features);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
std::vector<SSG_featureTree> v_trees;
|
|||
|
|
for (int line = 0; line < lineNum; line++)
|
|||
|
|
{
|
|||
|
|
bool isLastLine = false;
|
|||
|
|
if (line == lineNum - 1)
|
|||
|
|
isLastLine = true;
|
|||
|
|
std::vector<SSG_basicFeature1D>& a_lineJumpFeature = jumpFeatures_v[line];
|
|||
|
|
sg_lineFeaturesGrowing(
|
|||
|
|
line,
|
|||
|
|
isLastLine,
|
|||
|
|
a_lineJumpFeature,
|
|||
|
|
v_trees,
|
|||
|
|
growParam);
|
|||
|
|
}
|
|||
|
|
//ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD>˶<EFBFBD><CBB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
std::vector<SSG_featureTree> h_trees;
|
|||
|
|
for (int line = 0; line < lineNum_h; line++)
|
|||
|
|
{
|
|||
|
|
if (line == 650)
|
|||
|
|
int kkk = 1;
|
|||
|
|
bool isLastLine = false;
|
|||
|
|
if (line == lineNum_h - 1)
|
|||
|
|
isLastLine = true;
|
|||
|
|
std::vector<SSG_basicFeature1D>& a_lineJumpFeature = jumpFeatures_h[line];
|
|||
|
|
sg_lineFeaturesGrowing(
|
|||
|
|
line,
|
|||
|
|
isLastLine,
|
|||
|
|
a_lineJumpFeature,
|
|||
|
|
h_trees,
|
|||
|
|
growParam);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//tree<65><65>Ϣ
|
|||
|
|
std::vector<SSG_treeInfo> allTreesInfo; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD>
|
|||
|
|
SSG_treeInfo a_nullTree;
|
|||
|
|
memset(&a_nullTree, 0, sizeof(SSG_treeInfo));
|
|||
|
|
allTreesInfo.push_back(a_nullTree); //<2F><><EFBFBD>ִ洢λ<E6B4A2><CEBB><EFBFBD><EFBFBD>treeIdx<64><78>ͬλ<CDAC>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//<2F><><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>ע
|
|||
|
|
int hvTreeIdx = 1;
|
|||
|
|
for (int i = 0, i_max = (int)v_trees.size(); i < i_max; i++)
|
|||
|
|
{
|
|||
|
|
SSG_featureTree* a_vTree = &v_trees[i];
|
|||
|
|
|
|||
|
|
//<2F><>¼Tree<65><65><EFBFBD><EFBFBD>Ϣ
|
|||
|
|
SSG_treeInfo a_treeInfo;
|
|||
|
|
a_treeInfo.vTreeFlag = 1;
|
|||
|
|
a_treeInfo.treeIdx = hvTreeIdx;
|
|||
|
|
a_treeInfo.treeType = a_vTree->treeType;
|
|||
|
|
a_treeInfo.sLineIdx = a_vTree->sLineIdx;
|
|||
|
|
a_treeInfo.eLineIdx = a_vTree->eLineIdx;
|
|||
|
|
a_treeInfo.roi = a_vTree->roi;
|
|||
|
|
allTreesInfo.push_back(a_treeInfo);
|
|||
|
|
//<2F><>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1>ǣ<EFBFBD>ͬʱ<CDAC><CAB1>Mask<73>ϱ<EFBFBD><CFB1><EFBFBD>
|
|||
|
|
for (int j = 0, j_max = (int)a_vTree->treeNodes.size(); j < j_max; j++)
|
|||
|
|
{
|
|||
|
|
SSG_basicFeature1D* a_feature = &a_vTree->treeNodes[j];
|
|||
|
|
if (scanLines[a_feature->jumpPos2D.x][a_feature->jumpPos2D.y].pt3D.z > 1e-4)//<2F><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
|||
|
|
{
|
|||
|
|
int existEdgeId = scanLines[a_feature->jumpPos2D.x][a_feature->jumpPos2D.y].nPointIdx >> 16;
|
|||
|
|
if (existEdgeId == 0)
|
|||
|
|
{
|
|||
|
|
scanLines[a_feature->jumpPos2D.x][a_feature->jumpPos2D.y].nPointIdx = a_feature->featureType;
|
|||
|
|
scanLines[a_feature->jumpPos2D.x][a_feature->jumpPos2D.y].nPointIdx &= 0xffff;
|
|||
|
|
scanLines[a_feature->jumpPos2D.x][a_feature->jumpPos2D.y].nPointIdx += hvTreeIdx << 16;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
hvTreeIdx++;
|
|||
|
|
}
|
|||
|
|
int hTreeStart = hvTreeIdx;
|
|||
|
|
////<2F><>ע:ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>
|
|||
|
|
for (int i = 0, i_max = (int)h_trees.size(); i < i_max; i++)
|
|||
|
|
{
|
|||
|
|
SSG_featureTree* a_hTree = &h_trees[i];
|
|||
|
|
//<2F><>¼Tree<65><65><EFBFBD><EFBFBD>Ϣ
|
|||
|
|
SSG_treeInfo a_treeInfo;
|
|||
|
|
a_treeInfo.vTreeFlag = 0;
|
|||
|
|
a_treeInfo.treeIdx = hvTreeIdx;
|
|||
|
|
a_treeInfo.treeType = a_hTree->treeType;
|
|||
|
|
a_treeInfo.sLineIdx = a_hTree->sLineIdx;
|
|||
|
|
a_treeInfo.eLineIdx = a_hTree->eLineIdx;
|
|||
|
|
a_treeInfo.roi.left = a_hTree->roi.top; //ˮƽɨ<C6BD><C9A8>xy<78>ǽ<EFBFBD><C7BD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
a_treeInfo.roi.right = a_hTree->roi.bottom;
|
|||
|
|
a_treeInfo.roi.top = a_hTree->roi.left;
|
|||
|
|
a_treeInfo.roi.bottom = a_hTree->roi.right;
|
|||
|
|
allTreesInfo.push_back(a_treeInfo);
|
|||
|
|
//<2F><>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD><CFB1>ǣ<EFBFBD>ͬʱ<CDAC><CAB1>Mask<73>ϱ<EFBFBD><CFB1><EFBFBD>
|
|||
|
|
for (int j = 0, j_max = (int)a_hTree->treeNodes.size(); j < j_max; j++)
|
|||
|
|
{
|
|||
|
|
SSG_basicFeature1D* a_feature = &a_hTree->treeNodes[j];
|
|||
|
|
if (scanLines[a_feature->jumpPos2D.y][a_feature->jumpPos2D.x].pt3D.z > 1e-4)//<2F><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
|||
|
|
{
|
|||
|
|
int existEdgeId = scanLines[a_feature->jumpPos2D.y][a_feature->jumpPos2D.x].nPointIdx >> 16;
|
|||
|
|
if (existEdgeId == 0)
|
|||
|
|
{
|
|||
|
|
scanLines[a_feature->jumpPos2D.y][a_feature->jumpPos2D.x].nPointIdx += a_feature->featureType << 4;
|
|||
|
|
scanLines[a_feature->jumpPos2D.y][a_feature->jumpPos2D.x].nPointIdx &= 0xffff;
|
|||
|
|
scanLines[a_feature->jumpPos2D.y][a_feature->jumpPos2D.x].nPointIdx += hvTreeIdx << 16;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
hvTreeIdx++;
|
|||
|
|
}
|
|||
|
|
int hvTreeSize = hvTreeIdx;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|