algoLib/bagThreadPositioning_Export/bagThreadPositioning_test.cpp
jerryzeng 8ac9065383 bagThreadPositioning version 1.1.1 :
优化了标定柱检出。标定柱同时为扫描线端点时能够检出
2026-02-09 00:51:35 +08:00

783 lines
24 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// gasFillingPortPosition_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
#include <VZNL_Types.h>
#include "direct.h"
#include <string>
#include "bagThreadPositioning_Export.h"
#include <opencv2/opencv.hpp>
#include <Windows.h>
#include <limits>
typedef struct
{
int r;
int g;
int b;
}SG_color;
typedef struct
{
int nPointIdx;
double x;
double y;
double z;
float r;
float g;
float b;
} SPointXYZRGB;
void vzReadLaserScanPointFromFile_encodePlyTxt(
const char* fileName,
double lineStep,
double baseZ,
std::vector<std::vector< SVzNL3DPosition>>& scanData)
{
std::ifstream inputFile(fileName);
std::string linedata;
if (inputFile.is_open() == false)
return;
std::vector< SVzNL3DPosition> linePoints;
linePoints.clear();
int startIdx = -1;
int ptIdx = 0;
double pre_y = DBL_MAX;
while (std::getline(inputFile, linedata))
{
if (linedata.empty())
continue;
int X;
double Y, Z, tmp;
sscanf_s(linedata.c_str(), "%d,%lf,%lf", &X, &Y, &Z);
if (startIdx < 0)
startIdx = X;
SVzNL3DPosition a_pt;
a_pt.nPointIdx = ptIdx;
ptIdx++;
a_pt.pt3D.x = (double)(X - startIdx) * lineStep;
a_pt.pt3D.y = Y;
a_pt.pt3D.z = baseZ - Z;
if (Z < -9990.0)
{
a_pt.pt3D = { 0, 0, 0 };
}
if (Y < pre_y)
{
//新行
if(linePoints.size() > 0)
scanData.push_back(linePoints);
linePoints.clear();
ptIdx = 0;
}
linePoints.push_back(a_pt);
pre_y = Y;
}
if(linePoints.size() > 0)
scanData.push_back(linePoints);
return;
}
bool checkGridFormat(std::vector<std::vector< SVzNL3DPosition>>& scanData)
{
if (scanData.size() == 0)
return false;
int linePtNum = (int)scanData[0].size();
for (int i = 1; i < (int)scanData.size(); i++)
{
if (linePtNum != (int)scanData[i].size())
return false;
}
return true;
}
void downSampleGridData(std::vector<std::vector< SVzNL3DPosition>>& scanData, int dwnSampleRatio, std::vector<std::vector< SVzNL3DPosition>>& sampleData)
{
int lines = (int)scanData.size();
for (int i = 0; i < lines; i++)
{
if ((i % dwnSampleRatio) == 0)
sampleData.push_back(scanData[i]);
}
return;
}
int counterValidPts(std::vector< SVzNL3DPosition>& a_line)
{
int ptNum = (int)a_line.size();
int validNum = 0;
for (int i = 0; i < ptNum; i++)
{
if (a_line[i].pt3D.z > 1e-4)
validNum++;
}
return validNum;
}
void removeNullLines(std::vector<std::vector< SVzNL3DPosition>>& scanData)
{
if (scanData.size() == 0)
return;
int lineNum = (int)scanData.size();
int startLineIdx = -1;
int endLineIdx = 0;
for (int i = 0; i < lineNum; i++)
{
int validPtNum = counterValidPts(scanData[i]);
if (validPtNum > 0)
{
if (startLineIdx < 0)
startLineIdx = i;
endLineIdx = i;
}
}
if( (endLineIdx < lineNum-1) && (endLineIdx > 0))
scanData.erase(scanData.begin() + endLineIdx+1, scanData.end());
if (startLineIdx > 0)
scanData.erase(scanData.begin(), scanData.begin() + startLineIdx);
return;
}
void wdReadLaserScanPointFromFile_XYZ_vector(const char* fileName, std::vector<std::vector< SVzNL3DPosition>>& scanData)
{
std::ifstream inputFile(fileName);
std::string linedata;
if (inputFile.is_open() == false)
return;
std::vector< SVzNL3DPosition> a_line;
int ptIdx = 0;
while (getline(inputFile, linedata))
{
if (0 == strncmp("Line_", linedata.c_str(), 5))
{
int ptSize = (int)a_line.size();
if (ptSize > 0)
{
scanData.push_back(a_line);
}
a_line.clear();
ptIdx = 0;
}
else if (0 == strncmp("{", linedata.c_str(), 1))
{
float X, Y, Z;
int imageY = 0;
float leftX, leftY;
float rightX, rightY;
sscanf_s(linedata.c_str(), "{%f,%f,%f}-{%f,%f}-{%f,%f}", &X, &Y, &Z, &leftX, &leftY, &rightX, &rightY);
SVzNL3DPosition a_pt;
a_pt.pt3D.x = X;
a_pt.pt3D.y = Y;
a_pt.pt3D.z = Z;
a_pt.nPointIdx = ptIdx;
ptIdx++;
a_line.push_back(a_pt);
}
}
//last line
int ptSize = (int)a_line.size();
if (ptSize > 0)
{
scanData.push_back(a_line);
a_line.clear();
}
inputFile.close();
return;
}
void wd_gridScan_GetROIData(std::vector<std::vector< SVzNL3DPosition>>& scanData, SVzNLRangeD roi_y, std::vector<std::vector< SVzNL3DPosition>>& roiData)
{
int lineNum = (int)scanData.size();
int linePtNum = (int)scanData[0].size();
int globalPtStart = INT_MAX;
int globalPtEnd = 0;
int lineStart = INT_MAX;
int lineEnd = 0;
for (int line = 0; line < lineNum; line++)
{
std::vector< SVzNL3DPosition >& lineData = scanData[line];
int ptSize = (int)lineData.size();
int vldNum = 0;
int ptStart = INT_MAX;
int ptEnd = 0;
for (int i = 0; i < ptSize; i++)
{
if (lineData[i].pt3D.z > 1e-4)
{
if ((lineData[i].pt3D.y < roi_y.min) || (lineData[i].pt3D.y > roi_y.max))
lineData[i].pt3D = { 0.0, 0.0, 0.0 };
}
if (lineData[i].pt3D.z > 1e-4)
{
if (ptStart > i)
ptStart = i;
ptEnd = i;
vldNum++;
}
}
if (vldNum > 0)
{
if (globalPtStart > ptStart)
globalPtStart = ptStart;
if (globalPtEnd < ptEnd)
globalPtEnd = ptEnd;
if (lineStart > line)
lineStart = line;
lineEnd = line;
}
}
int vldLineNum = lineEnd - lineStart + 1;
int vldPtNum = globalPtEnd - globalPtStart + 1;
roiData.resize(vldLineNum);
for (int line = 0; line < vldLineNum; line++)
{
roiData[line].resize(vldPtNum);
for (int i = 0; i < vldPtNum; i++)
roiData[line][i] = scanData[line + lineStart][i + globalPtStart];
}
return;
}
void _outputScanDataFile(char* fileName, std::vector<std::vector< SVzNL3DPosition>>& scanData,
float lineV, int maxTimeStamp, int clockPerSecond)
{
std::ofstream sw(fileName);
int lineNum = (int)scanData.size();
sw << "LineNum:" << lineNum << std::endl;
sw << "DataType: 0" << std::endl;
sw << "ScanSpeed:" << lineV << std::endl;
sw << "PointAdjust: 1" << std::endl;
sw << "MaxTimeStamp:" << maxTimeStamp << "_" << clockPerSecond << std::endl;
for (int line = 0; line < lineNum; line++)
{
int nPositionCnt = (int)scanData[line].size();
sw << "Line_" << line << "_0_" << nPositionCnt << std::endl;
for (int i = 0; i < nPositionCnt; i++)
{
SVzNL3DPosition& pt3D = scanData[line][i];
float x = (float)pt3D.pt3D.x;
float y = (float)pt3D.pt3D.y;
float z = (float)pt3D.pt3D.z;
sw << "{ " << x << "," << y << "," << z << " }-";
sw << "{0,0}-{0,0}" << std::endl;
}
}
sw.close();
}
void _outputChanneltInfo(char* fileName, std::vector<SSX_bagThreadInfo>& threadInfo)
{
std::ofstream sw(fileName);
char dataStr[250];
int objNum = (int)threadInfo.size();
for (int i = 0; i < objNum; i++)
{
sprintf_s(dataStr, 250, "线头_%d: 位置( %g, %g, %g ), 下刀位置_( %g, %g, %g ), 角度_%g",
i + 1, threadInfo[i].threadPos.x, threadInfo[i].threadPos.y, threadInfo[i].threadPos.z,
threadInfo[i].operatePos.x, threadInfo[i].operatePos.y, threadInfo[i].operatePos.z, threadInfo[i].rotateAngle);
sw << dataStr << std::endl;
}
sw.close();
}
void _outputRGBDScan_RGBD(
char* fileName,
std::vector<std::vector<SVzNL3DPosition>>& scanLines,
std::vector<SSX_bagThreadInfo>& threadInfo,
std::vector< SVzNL3DPoint>& markPoints
)
{
int lineNum = (int)scanLines.size();
std::ofstream sw(fileName);
int realLines = lineNum;
int objNum = (int)threadInfo.size();
if (objNum > 0)
realLines += 1;
sw << "LineNum:" << realLines << std::endl;
sw << "DataType: 0" << std::endl;
sw << "ScanSpeed: 0" << std::endl;
sw << "PointAdjust: 1" << std::endl;
sw << "MaxTimeStamp: 0_0" << std::endl;
int maxLineIndex = 0;
int max_stamp = 0;
SG_color rgb = { 0, 0, 0 };
SG_color objColor[8] = {
{245,222,179},//淡黄色
{210,105, 30},//巧克力色
{240,230,140},//黄褐色
{135,206,235},//天蓝色
{250,235,215},//古董白
{189,252,201},//薄荷色
{221,160,221},//梅红色
{188,143,143},//玫瑰红色
};
int size = 1;
int lineIdx = 0;
for (int line = 0; line < lineNum; line++)
{
int linePtNum = (int)scanLines[line].size();
if (linePtNum == 0)
continue;
sw << "Line_" << lineIdx << "_0_" << linePtNum << std::endl;
lineIdx++;
for (int i = 0; i < linePtNum; i++)
{
SVzNL3DPosition* pt3D = &scanLines[line][i];
if (pt3D->nPointIdx == 1)
{
rgb = objColor[pt3D->nPointIdx];
size = 3;
}
else if (pt3D->nPointIdx == 2)
{
rgb = { 250, 0, 0 };
size = 3;
}
else if (pt3D->nPointIdx == 3)
{
rgb = { 250, 250, 0 };
size = 3;
}
else if (pt3D->nPointIdx == 4)
{
rgb = { 0, 250, 250 };
size = 3;
}
else //if (pt3D->nPointIdx == 0)
{
rgb = { 200, 200, 200 };
size = 1;
}
float x = (float)pt3D->pt3D.x;
float y = (float)pt3D->pt3D.y;
float z = (float)pt3D->pt3D.z;
sw << "{" << x << "," << y << "," << z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << rgb.r << "," << rgb.g << "," << rgb.b << "," << size << " }" << std::endl;
}
}
if (objNum > 0)
{
int markNum = (int)markPoints.size();
sw << "Line_" << lineIdx << "_0_" << (objNum*2 + markNum) << std::endl;
size = 10;
for (int i = 0; i < objNum; i++)
{
rgb = { 250, 0, 0 };
float x = (float)threadInfo[i].threadPos.x;
float y = (float)threadInfo[i].threadPos.y;
float z = (float)threadInfo[i].threadPos.z;
sw << "{" << x << "," << y << "," << z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << rgb.r << "," << rgb.g << "," << rgb.b << "," << size << " }" << std::endl;
rgb = { 250, 250, 0 };
x = (float)threadInfo[i].operatePos.x;
y = (float)threadInfo[i].operatePos.y;
z = (float)threadInfo[i].operatePos.z;
sw << "{" << x << "," << y << "," << z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << rgb.r << "," << rgb.g << "," << rgb.b << "," << size << " }" << std::endl;
}
for (int i = 0; i < markNum; i++)
{
rgb = { 250, 0, 0 };
float x = (float)markPoints[i].x;
float y = (float)markPoints[i].y;
float z = (float)markPoints[i].z;
sw << "{" << x << "," << y << "," << z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << rgb.r << "," << rgb.g << "," << rgb.b << "," << size << " }" << std::endl;
}
//多输出一个修正显示工具bug
rgb = { 250, 0, 0 };
float x = (float)threadInfo[0].threadPos.x;
float y = (float)threadInfo[0].threadPos.y;
float z = (float)threadInfo[0].threadPos.z;
sw << "{" << x << "," << y << "," << z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << rgb.r << "," << rgb.g << "," << rgb.b << "," << size << " }" << std::endl;
//输出法向
size = 1;
double len = 60;
lineIdx = 0;
for (int i = 0; i < objNum; i++)
{
SVzNL3DPoint pt0 = threadInfo[i].threadPos;
SVzNL3DPoint pt1 = threadInfo[i].operatePos;
//显示法向量
sw << "Poly_" << lineIdx << "_2" << std::endl;
sw << "{" << (float)pt0.x << "," << (float)pt0.y << "," << (float)pt0.z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
sw << "{" << pt1.x << "," << pt1.y << "," << pt1.z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
lineIdx++;
}
//多输出一个修正显示工具bug
SVzNL3DPoint pt0 = threadInfo[0].threadPos;
SVzNL3DPoint pt1 = threadInfo[0].operatePos;
//显示法向量
sw << "Poly_" << lineIdx << "_2" << std::endl;
sw << "{" << (float)pt0.x << "," << (float)pt0.y << "," << (float)pt0.z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
sw << "{" << pt1.x << "," << pt1.y << "," << pt1.z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
lineIdx++;
}
sw.close();
}
void getROIdata(SSG_ROIRectD roi2D,
std::vector<std::vector< SVzNL3DPosition>>& srcLines,
std::vector<std::vector< SVzNL3DPosition>>& dstLines)
{
int lineNum = (int)srcLines.size();
dstLines.resize(lineNum);
for (int line = 0; line < lineNum; line++)
{
std::vector< SVzNL3DPosition>& a_line = srcLines[line];
int ptNum = (int)a_line.size();
dstLines[line].resize(ptNum);
for (int j = 0; j < ptNum; j++)
{
dstLines[line][j] = a_line[j];
if (a_line[j].pt3D.z > 1e-4)
{
if ((a_line[j].pt3D.x < roi2D.left) || (a_line[j].pt3D.x > roi2D.right) ||
(a_line[j].pt3D.y < roi2D.top) || (a_line[j].pt3D.y > roi2D.bottom))
dstLines[line][j].pt3D = { 0, 0, 0 };
}
}
}
return;
}
void _outputCalibPara(char* fileName, SSG_planeCalibPara calibPara)
{
std::ofstream sw(fileName);
char dataStr[250];
//调平矩阵
sprintf_s(dataStr, 250, "%g, %g, %g", calibPara.planeCalib[0], calibPara.planeCalib[1], calibPara.planeCalib[2]);
sw << dataStr << std::endl;
sprintf_s(dataStr, 250, "%g, %g, %g", calibPara.planeCalib[3], calibPara.planeCalib[4], calibPara.planeCalib[5]);
sw << dataStr << std::endl;
sprintf_s(dataStr, 250, "%g, %g, %g", calibPara.planeCalib[6], calibPara.planeCalib[7], calibPara.planeCalib[8]);
sw << dataStr << std::endl;
//地面高度
sprintf_s(dataStr, 250, "%g", calibPara.planeHeight);
sw << dataStr << std::endl;
//反向旋转矩阵
sprintf_s(dataStr, 250, "%g, %g, %g", calibPara.invRMatrix[0], calibPara.invRMatrix[1], calibPara.invRMatrix[2]);
sw << dataStr << std::endl;
sprintf_s(dataStr, 250, "%g, %g, %g", calibPara.invRMatrix[3], calibPara.invRMatrix[4], calibPara.invRMatrix[5]);
sw << dataStr << std::endl;
sprintf_s(dataStr, 250, "%g, %g, %g", calibPara.invRMatrix[6], calibPara.invRMatrix[7], calibPara.invRMatrix[8]);
sw << dataStr << std::endl;
sw.close();
}
SSG_planeCalibPara _readCalibPara(char* fileName)
{
//设置初始结果
double initCalib[9] = {
1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0 };
SSG_planeCalibPara planePara;
for (int i = 0; i < 9; i++)
planePara.planeCalib[i] = initCalib[i];
planePara.planeHeight = -1.0;
for (int i = 0; i < 9; i++)
planePara.invRMatrix[i] = initCalib[i];
std::ifstream inputFile(fileName);
std::string linedata;
if (inputFile.is_open() == false)
return planePara;
//调平矩阵
std::getline(inputFile, linedata);
sscanf_s(linedata.c_str(), "%lf, %lf, %lf", &planePara.planeCalib[0], &planePara.planeCalib[1], &planePara.planeCalib[2]);
std::getline(inputFile, linedata);
sscanf_s(linedata.c_str(), "%lf, %lf, %lf", &planePara.planeCalib[3], &planePara.planeCalib[4], &planePara.planeCalib[5]);
std::getline(inputFile, linedata);
sscanf_s(linedata.c_str(), "%lf, %lf, %lf", &planePara.planeCalib[6], &planePara.planeCalib[7], &planePara.planeCalib[8]);
//地面高度
std::getline(inputFile, linedata);
sscanf_s(linedata.c_str(), "%lf", &planePara.planeHeight);
//反向旋转矩阵
std::getline(inputFile, linedata);
sscanf_s(linedata.c_str(), "%lf, %lf, %lf", &planePara.invRMatrix[0], &planePara.invRMatrix[1], &planePara.invRMatrix[2]);
std::getline(inputFile, linedata);
sscanf_s(linedata.c_str(), "%lf, %lf, %lf", &planePara.invRMatrix[3], &planePara.invRMatrix[4], &planePara.invRMatrix[5]);
std::getline(inputFile, linedata);
sscanf_s(linedata.c_str(), "%lf, %lf, %lf", &planePara.invRMatrix[6], &planePara.invRMatrix[7], &planePara.invRMatrix[8]);
inputFile.close();
return planePara;
}
#define CONVERT_TO_GRID 0
#define COMPUTE_CALIB_PARA 0
#define BAG_THREAD_POSITIONING 1
#define TEST_GROUP 3
int main()
{
const char* dataPath[TEST_GROUP] = {
"F:/ShangGu/项目/吕宁项目/袋子拆线/模拟数据/", //0
"F:/ShangGu/项目/吕宁项目/袋子拆线/现场数据/", //1
"F:/ShangGu/项目/吕宁项目/袋子拆线/袋子3D数据/", //2
};
SVzNLRange fileIdx[TEST_GROUP] = {
{1,13},
{2,5},
{1,10}
};
const char* ver = wd_bagThreadPositioningVersion();
printf("ver:%s\n", ver);
#if CONVERT_TO_GRID
int convertGrp = 2;
for (int fidx = 1; fidx <= 10; fidx++)
{
char _scan_file[256];
sprintf_s(_scan_file, "%s%dheightline_mm.txt", dataPath[convertGrp], fidx);
std::vector<std::vector< SVzNL3DPosition>> scanData;
double lineStep = 0.032;
double baseZ = 350.0;
vzReadLaserScanPointFromFile_encodePlyTxt(_scan_file, lineStep, baseZ, scanData);
bool isGridData = checkGridFormat(scanData);
int gridFormat = (true == isGridData) ? 1 : 0;
printf("%s: 栅格格式=%d\n", _scan_file, gridFormat);
removeNullLines(scanData);
std::vector<std::vector< SVzNL3DPosition>> sampleData;
downSampleGridData(scanData, 3, sampleData);
//将数据恢复为按扫描线存储格式
sprintf_s(_scan_file, "%s袋子_grid_%d.txt", dataPath[convertGrp], fidx);
_outputScanDataFile(_scan_file, sampleData,0, 0, 0);
printf("%s: done.\n", _scan_file);
}
char _scan_file[256];
sprintf_s(_scan_file, "%sgroundData.txt", dataPath[convertGrp]);
std::vector<std::vector< SVzNL3DPosition>> scanData;
double lineStep = 0.032;
double baseZ = 350.0;
vzReadLaserScanPointFromFile_encodePlyTxt(_scan_file, lineStep, baseZ, scanData);
bool isGridData = checkGridFormat(scanData);
int gridFormat = (true == isGridData) ? 1 : 0;
printf("%s: 栅格格式=%d\n", _scan_file, gridFormat);
removeNullLines(scanData);
std::vector<std::vector< SVzNL3DPosition>> sampleData;
downSampleGridData(scanData, 3, sampleData);
//将数据恢复为按扫描线存储格式
sprintf_s(_scan_file, "%sgroundData_grid.txt", dataPath[convertGrp]);
_outputScanDataFile(_scan_file, sampleData, 0, 0, 0);
printf("%s: done.\n", _scan_file);
#endif
#if COMPUTE_CALIB_PARA
char _calib_datafile[256];
sprintf_s(_calib_datafile, "F:/ShangGu/项目/吕宁项目/袋子拆线/袋子3D数据/groundData_grid.txt");
std::vector<std::vector< SVzNL3DPosition>> scanLines;
wdReadLaserScanPointFromFile_XYZ_vector(_calib_datafile, scanLines);
if (scanLines.size() > 0)
{
//getROIdata
std::vector<std::vector< SVzNL3DPosition>> roiScanLines;
SSG_ROIRectD roi2D = {91.0, 190.0, -10, 37};
getROIdata(roi2D, scanLines, roiScanLines);
char calibFile[250];
sprintf_s(calibFile, "F:/ShangGu/项目/吕宁项目/袋子拆线/袋子3D数据/groundData_grid_ROI.txt");
_outputScanDataFile(calibFile, roiScanLines, 0, 0, 0);
SSG_planeCalibPara calibPara = wd_bagThread_getBaseCalibPara(roiScanLines);
//结果进行验证
int lineNum = (int)scanLines.size();
for (int i = 0; i < lineNum; i++)
{
if (i == 14)
int kkk = 1;
//行处理
//调平,去除地面
wd_bagThread_lineDataR(scanLines[i], calibPara.planeCalib, -1);// calibPara.planeHeight);
}
//
sprintf_s(calibFile, "F:/ShangGu/项目/吕宁项目/袋子拆线/袋子3D数据/ground_calib_para.txt");
_outputCalibPara(calibFile, calibPara);
char _out_file[256];
sprintf_s(_out_file, "F:/ShangGu/项目/吕宁项目/袋子拆线/袋子3D数据/ground_grid_calib_verify.txt");
_outputScanDataFile(_out_file, scanLines, 0, 0, 0);
printf("%s: calib done!\n", _calib_datafile);
}
#endif
#if BAG_THREAD_POSITIONING
for (int grp = 2; grp <= 2; grp++)
{
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
{
char _scan_file[256];
SSG_planeCalibPara poseCalibPara;
//初始化成单位阵
poseCalibPara.planeCalib[0] = 1.0;
poseCalibPara.planeCalib[1] = 0.0;
poseCalibPara.planeCalib[2] = 0.0;
poseCalibPara.planeCalib[3] = 0.0;
poseCalibPara.planeCalib[4] = 1.0;
poseCalibPara.planeCalib[5] = 0.0;
poseCalibPara.planeCalib[6] = 0.0;
poseCalibPara.planeCalib[7] = 0.0;
poseCalibPara.planeCalib[8] = 1.0;
poseCalibPara.planeHeight = 2600.0;
for (int i = 0; i < 9; i++)
poseCalibPara.invRMatrix[i] = poseCalibPara.planeCalib[i];
if (grp == 2)
{
sprintf_s(_scan_file, "%sground_calib_para.txt", dataPath[grp]);
poseCalibPara = _readCalibPara(_scan_file);
}
sprintf_s(_scan_file, "%s袋子_grid_%d.txt", dataPath[grp], fidx);
std::vector<std::vector< SVzNL3DPosition>> scanLines;
wdReadLaserScanPointFromFile_XYZ_vector(_scan_file, scanLines);
long t1 = (long)GetTickCount64();//统计时间
SSG_cornerParam cornerParam;
cornerParam.cornerTh = 90;
cornerParam.scale = 4; //袋子缝的尺度1.5mm比较合适
cornerParam.minEndingGap = 1.0; //
cornerParam.minEndingGap_z = 3.5;
cornerParam.jumpCornerTh_1 = 15; //水平角度,小于此角度视为水平
cornerParam.jumpCornerTh_2 = 60;
SSG_raisedFeatureParam raisedFeatureParam;
raisedFeatureParam.minJumpZ = 1.5;
raisedFeatureParam.minK = 2.0; //对应63度
raisedFeatureParam.widthRange.min = 1.0;
raisedFeatureParam.widthRange.max = 4.0;
SSG_outlierFilterParam filterParam;
filterParam.continuityTh = 3.0; //噪声滤除。当相邻点的z跳变大于此门限时检查是否为噪声。若长度小于outlierLen 视为噪声
filterParam.outlierTh = 3;
SSG_treeGrowParam growParam;
growParam.maxLineSkipNum = -1; //对于轮廓仪线间隔很小使用扫描线数的物理意义不清晰使用maxSkipDistance
growParam.maxSkipDistance = 5.0;
growParam.yDeviation_max = 1.0;
growParam.zDeviation_max = 1.0;//
growParam.minLTypeTreeLen = 10; //mm,
growParam.minVTypeTreeLen = 10; //mm
SSX_ScanInfo scanInfo;
if (grp == 1)
{
scanInfo.isHorizonScan = false; //true:激光线平行线缝false:激光线垂直线缝
scanInfo.scanFromThreadHead = true; //true:线袋子线缝头部开始扫描。
scanInfo.stitchWidth = 1.0; //mm线头扫描后的最小宽度
scanInfo.operateDist = 3.0; //mm下刀位置距离线头位置
scanInfo.mark_diameter = 6.0; //mark外径
scanInfo.mark_height = 3.5;//mark高
scanInfo.mark_distance = 53.0; //两个Mark的距离
}
else if(grp == 2 )
{
scanInfo.isHorizonScan = false; //true:激光线平行线缝false:激光线垂直线缝
scanInfo.scanFromThreadHead = true; //true:线袋子线缝头部开始扫描。
scanInfo.stitchWidth = 1.0; //mm线头扫描后的最小宽度
scanInfo.operateDist = 3.0; //mm下刀位置距离线头位置
scanInfo.mark_diameter = 18.0; //mark外径
scanInfo.mark_height = 18.0;//mark高
scanInfo.mark_distance = 39.0; //两个Mark的距离
}
else
{
scanInfo.isHorizonScan = false; //true:激光线平行线缝false:激光线垂直线缝
scanInfo.scanFromThreadHead = true; //true:线袋子线缝头部开始扫描。
scanInfo.stitchWidth = 1.0; //mm线头扫描后的最小宽度
scanInfo.operateDist = 3.0; //mm下刀位置距离线头位置
scanInfo.mark_diameter = 18.0; //mark外径
scanInfo.mark_height = 16.5;//mark高
scanInfo.mark_distance = 39.0; //两个Mark的距离
}
int errCode = 0;
std::vector<SSX_bagThreadInfo> bagThreadInfo;
std::vector<SSX_bagThreadInfo> bagThreadInfo_relative; //相对于Mark的坐标
std::vector<SVzNL3DPoint> output_markCenter;
wd_bagThreadPositioning(
scanLines,
scanInfo, //true:激光线平行线缝false:激光线垂直线缝
poseCalibPara,
filterParam, //噪点过滤参数
cornerParam, //V型特征参数
raisedFeatureParam,//线尾凸起参数
growParam, //特征生长参数
bagThreadInfo,
bagThreadInfo_relative,
output_markCenter,
&errCode);
long t2 = (long)GetTickCount64();
printf("%s: %d(ms)!\n", _scan_file, (int)(t2 - t1));
//输出测试结果
sprintf_s(_scan_file, "%sresult\\%d_result.txt", dataPath[grp], fidx);
_outputRGBDScan_RGBD(_scan_file, scanLines, bagThreadInfo, output_markCenter);
sprintf_s(_scan_file, "%sresult\\%d_screw_info.txt", dataPath[grp], fidx);
_outputChanneltInfo(_scan_file, bagThreadInfo);
}
}
#endif
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件