algoLib/sourceCode/WD_noiseFilter.cpp

174 lines
4.5 KiB
C++
Raw Normal View History

2025-12-05 23:04:40 +08:00
#include "SG_baseDataType.h"
#include "SG_baseAlgo_Export.h"
#include <vector>
void wd_noiseFilter(
std::vector< std::vector<SVzNL3DPosition>>& scanLines,
const SSG_outlierFilterParam filterParam,
int* errCode)
{
*errCode = 0;
int lineNum = (int)scanLines.size();
int nPointCnt = (int)scanLines[0].size();
bool vldGrid = true;
//<2F><>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < lineNum; i++)
{
if (nPointCnt != (int)scanLines[i].size())
vldGrid = false;
wd_vectorDataRemoveOutlier_overwrite(
scanLines[i],
filterParam);
}
if (false == vldGrid)
{
*errCode = SG_ERR_3D_DATA_INVLD;
return;
}
//ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int hLineNum = nPointCnt; //Grid<69><64>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD>ߵĵ<DFB5><C4B5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ˮƽɨ<C6BD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<std::vector<SVzNL3DPosition>> filterHLines;
filterHLines.resize(hLineNum);
for (int i = 0; i < hLineNum; i++)
filterHLines[i].resize(lineNum);
for (int line = 0; line < lineNum; line++)
{
for (int j = 0; j < hLineNum; j++)
{
filterHLines[j][line] = scanLines[line][j];
filterHLines[j][line].pt3D.x = scanLines[line][j].pt3D.y;
filterHLines[j][line].pt3D.y = scanLines[line][j].pt3D.x;
}
}
for (int hLine = 0; hLine < hLineNum; hLine++)
{
//<2F>˲<EFBFBD><CBB2><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><ECB3A3>
std::vector<SVzNL3DPosition> filterData;
std::vector<int> lineNoise;
sg_lineDataRemoveOutlier(
(SVzNL3DPosition*)filterHLines[hLine].data(),
(int)filterHLines[hLine].size(),
filterParam,
filterData,
lineNoise);
for (int j = 0; j < lineNoise.size(); j++)
{
int lineIdx = lineNoise[j];
scanLines[lineIdx][hLine].pt3D.z = 0;
}
}
return;
}
void wd_pointCloudHoleFilling(
std::vector< std::vector<SVzNL3DPosition>>& scanLines_src,
std::vector< std::vector<SVzNL3DPosition>>& scanLines_dst,
const int fillingHoleSize //<2F><><EFBFBD>״<EFBFBD>С
)
{
int lineNum = (int)scanLines_src.size();
scanLines_dst.resize(lineNum);
for (int line = 0; line < lineNum; line++)
{
int ptNum = (int)scanLines_src[line].size();
scanLines_dst[line].resize(ptNum);
for (int i = 0; i < ptNum; i++)
{
scanLines_dst[line][i] = scanLines_src[line][i];
scanLines_src[line][i].nPointIdx = 0; //δ<><CEB4><EFBFBD><EFBFBD>
}
}
for (int line = 0; line < lineNum; line++)
{
int ptNum = (int)scanLines_src[line].size();
for (int i = 0; i < ptNum; i++)
{
SVzNL3DPosition& a_pt = scanLines_src[line][i];
if ( (a_pt.pt3D.z < 1e-4) && (a_pt.nPointIdx == 0)) //δ<><CEB4><EFBFBD><EFBFBD><EFBFBD>Ŀհ׵<D5B0>
{
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
//ɨ<><C9A8><EFBFBD>߷<EFBFBD><DFB7><EFBFBD>
int j_top = -1;
for (int j = i - 1; j >= i - fillingHoleSize; j--)
{
if (j < 0)
break;
else if (scanLines_src[line][j].pt3D.z > 1e-4)
{
j_top = j;
break;
}
}
int j_btm = -1;
for (int j = i + 1; j <= i + fillingHoleSize; j++)
{
if (j >= ptNum)
break;
else if (scanLines_src[line][j].pt3D.z > 1e-4)
{
j_btm = j;
break;
}
}
if ((j_top >= 0) && (j_btm >= 0))
{
SVzNL3DPoint& top_pt = scanLines_src[line][j_top].pt3D;
SVzNL3DPoint& btm_pt = scanLines_src[line][j_btm].pt3D;
//<2F><>ֵ
double dist = (double)(j_btm - j_top);
for (int j = j_top + 1; j <= j_btm - 1; j++)
{
double d = (double)(j - j_top);
double k2 = d / dist;
double k1 = 1.0 - k2;
scanLines_dst[line][j].pt3D = { top_pt.x * k1 + btm_pt.x * k2, top_pt.y * k1 + btm_pt.y * k2 , top_pt.z * k1 + btm_pt.z * k2 };
scanLines_src[line][j].nPointIdx = 1;
}
}
else
{
//<2F><><EFBFBD><EFBFBD>ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>
int line_left = -1;
for (int j = line - 1; j >= line - fillingHoleSize; j--)
{
if (j < 0)
break;
else if (scanLines_src[j][i].pt3D.z > 1e-4)
{
line_left = j;
break;
}
}
int line_right = -1;
for (int j = line + 1; j <= line + fillingHoleSize; j++)
{
if (j >= lineNum)
break;
else if (scanLines_src[j][i].pt3D.z > 1e-4)
{
line_right = j;
break;
}
}
if ((line_left >= 0) && (line_right >= 0))
{
SVzNL3DPoint& left_pt = scanLines_src[line_left][i].pt3D;
SVzNL3DPoint& right_pt = scanLines_src[line_right][i].pt3D;
//<2F><>ֵ
double dist = (double)(line_right - line_left);
for (int j = line_left + 1; j <= line_right - 1; j++)
{
double d = (double)(j - line_left);
double k2 = d / dist;
double k1 = 1.0 - k2;
scanLines_dst[j][i].pt3D = { left_pt.x * k1 + right_pt.x * k2, left_pt.y * k1 + right_pt.y * k2 , left_pt.z * k1 + right_pt.z * k2 };
scanLines_src[j][i].nPointIdx = 1;
}
}
}
}
}
}
}