115 lines
3.5 KiB
C++
115 lines
3.5 KiB
C++
#include "BeltTearingAlgo.h"
|
|
#include <climits>
|
|
#include <iostream>
|
|
|
|
BeltTearingAlgo::BeltTearingAlgo() {
|
|
algoParam.differnceBinTh = 1.0;
|
|
algoParam.extractPara.gapChkWin = 7;
|
|
algoParam.extractPara.sameGapTh = 20.0;
|
|
algoParam.scanXScale = 4.0;
|
|
algoParam.scanYScale = 0.6;
|
|
algoParam.tearingMinGap = 50.0; //两个同位置的纵撕的最小间隔。大于此门限视为两个撕裂
|
|
algoParam.tearingMinLen = 30.0;
|
|
lineIndex = 0;
|
|
|
|
// 初始化
|
|
ResetParameter();
|
|
}
|
|
|
|
void BeltTearingAlgo::ResetParameter() {
|
|
total_tearings.clear();
|
|
beltTearings_new.clear();
|
|
beltTearings_growing.clear();
|
|
beltTearings_ended.clear();
|
|
beltTearings_unknown.clear();
|
|
lineIndex = 0;
|
|
int errCode = 0;
|
|
sg_detectBeltTearing(
|
|
NULL, //空扫描线,用于复位内部静态变量
|
|
0,
|
|
0,
|
|
&errCode,
|
|
hLineWorkers,
|
|
beltTearings_new,
|
|
beltTearings_growing,
|
|
beltTearings_ended,
|
|
beltTearings_unknown, //未判明,应用无需处理。
|
|
algoParam);
|
|
}
|
|
|
|
void BeltTearingAlgo::Training(std::vector<SVzNL3DLaserLine> lines) {
|
|
// 本算法无需训练
|
|
}
|
|
|
|
void BeltTearingAlgo::Training(SVzNL3DLaserLine* lines) {
|
|
// 本算法无需训练
|
|
}
|
|
|
|
std::vector<SSG_beltTearingInfo> BeltTearingAlgo::Predit(SVzNL3DLaserLine* a_line, int lineId) {
|
|
total_tearings.clear();
|
|
int errCode = 0;
|
|
sg_detectBeltTearing(
|
|
a_line, //一条扫描线
|
|
lineIndex,
|
|
a_line->nPositionCnt,
|
|
&errCode,
|
|
hLineWorkers,
|
|
beltTearings_new,
|
|
beltTearings_growing,
|
|
beltTearings_ended,
|
|
beltTearings_unknown, //未判明,应用无需处理。
|
|
algoParam);
|
|
if (beltTearings_ended.size() > 0) //收集撕裂点
|
|
{
|
|
total_tearings.insert(total_tearings.end(), beltTearings_ended.begin(), beltTearings_ended.end());
|
|
}
|
|
|
|
return total_tearings;
|
|
}
|
|
|
|
std::vector<SSG_beltTearingInfo> BeltTearingAlgo::Predit(std::vector<SVzNL3DLaserLine> lines, int lineIdx) {
|
|
total_tearings.clear();
|
|
if (lines.empty()) {
|
|
return total_tearings;
|
|
}
|
|
|
|
if (lineIndex >= INT_MAX - lines.size() ) {
|
|
lineIndex = 0;
|
|
}
|
|
|
|
hLineWorkers.resize(lines[0].nPositionCnt);
|
|
int errCode = 0;
|
|
for(int i = 0; i < lines.size(); i ++) {
|
|
SVzNL3DLaserLine* a_line = &lines[i];
|
|
sg_detectBeltTearing(
|
|
a_line, //一条扫描线
|
|
lineIndex,
|
|
a_line->nPositionCnt,
|
|
&errCode,
|
|
hLineWorkers,
|
|
beltTearings_new,
|
|
beltTearings_growing,
|
|
beltTearings_ended,
|
|
beltTearings_unknown, //未判明,应用无需处理。
|
|
algoParam);
|
|
lineIndex += 1;
|
|
|
|
|
|
if (beltTearings_new.size() > 0) //收集撕裂点
|
|
{
|
|
total_tearings.insert(total_tearings.end(), beltTearings_new.begin(), beltTearings_new.end());
|
|
}
|
|
|
|
if (beltTearings_ended.size() > 0) //收集撕裂点
|
|
{
|
|
total_tearings.insert(total_tearings.end(), beltTearings_ended.begin(), beltTearings_ended.end());
|
|
}
|
|
else if (i == lines.size() - 1) //测试数据最后一条扫描线。(实际中没有)
|
|
{
|
|
total_tearings.insert(total_tearings.end(), beltTearings_growing.begin(), beltTearings_growing.end());
|
|
}
|
|
}
|
|
|
|
return total_tearings;
|
|
}
|