algoLib/YouJiang_sheetPositioning_test/YouJiang_sheetPositioning_test.cpp
2026-03-10 16:57:56 +08:00

1284 lines
38 KiB
C++
Raw 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.

// motorStatorPosition_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
#include <VZNL_Types.h>
#include "direct.h"
#include <string>
#include "YouJiang_sheetPositioning_Export.h"
#include <opencv2/opencv.hpp>
#include <Windows.h>
SVzNL3DPoint _ptRotate(SVzNL3DPoint pt3D, double matrix3d[9])
{
SVzNL3DPoint _r_pt;
_r_pt.x = pt3D.x * matrix3d[0] + pt3D.y * matrix3d[1] + pt3D.z * matrix3d[2];
_r_pt.y = pt3D.x * matrix3d[3] + pt3D.y * matrix3d[4] + pt3D.z * matrix3d[5];
_r_pt.z = pt3D.x * matrix3d[6] + pt3D.y * matrix3d[7] + pt3D.z * matrix3d[8];
return _r_pt;
}
#define DATA_VER_OLD 0
#define DATA_VER_NEW 1
#define DATA_VER_FROM_CUSTOM 2
#define VZ_LASER_LINE_PT_MAX_NUM 4096
SVzNLXYZRGBDLaserLine* vzReadLaserScanPointFromFile_XYZRGB(const char* fileName, int* scanLineNum, float* scanV,
int* dataCalib, int* scanMaxStamp, int* canClockUnit)
{
std::ifstream inputFile(fileName);
std::string linedata;
if (inputFile.is_open() == false)
return NULL;
SVzNLXYZRGBDLaserLine* _scanLines = NULL;
int lines = 0;
int dataElements = 4;
int firstIndex = -1;
int dataFileVer = DATA_VER_OLD;
std::getline(inputFile, linedata); //第一行
int lineNum = 0;
if (0 == strncmp("LineNum:", linedata.c_str(), 8))
{
dataFileVer = DATA_VER_NEW;
sscanf_s(linedata.c_str(), "LineNum:%d", &lines);
if (lines == 0)
return NULL;
lineNum = lines;
_scanLines = (SVzNLXYZRGBDLaserLine*)malloc(sizeof(SVzNLXYZRGBDLaserLine) * (lineNum + 1));
memset(_scanLines, 0, sizeof(SVzNLXYZRGBDLaserLine) * (lineNum + 1));
if (scanLineNum)
*scanLineNum = lines;
}
else if (0 == strncmp("LineNum_", linedata.c_str(), 8))
{
dataFileVer = DATA_VER_OLD;
sscanf_s(linedata.c_str(), "LineNum_%d", &lines);
if (lines == 0)
return NULL;
lineNum = lines;
_scanLines = (SVzNLXYZRGBDLaserLine*)malloc(sizeof(SVzNLXYZRGBDLaserLine) * (lineNum + 1));
memset(_scanLines, 0, sizeof(SVzNLXYZRGBDLaserLine) * (lineNum + 1));
if (scanLineNum)
*scanLineNum = lines;
}
if (_scanLines == NULL)
return NULL;
int ptNum = 0;
int lineIdx = -1;
int ptIdx = 0;
SVzNLPointXYZRGBA* p3DPoint = NULL;
if (dataFileVer == DATA_VER_NEW)
{
while (getline(inputFile, linedata))
{
if (0 == strncmp("ScanSpeed:", linedata.c_str(), 10))
{
double lineV = 0;
sscanf_s(linedata.c_str(), "ScanSpeed:%lf", &lineV);
if (scanV)
*scanV = (float)lineV;
}
else if (0 == strncmp("PointAdjust:", linedata.c_str(), 12))
{
int ptAdjusted = 0;
sscanf_s(linedata.c_str(), "PointAdjust:%d", &ptAdjusted);
if (dataCalib)
*dataCalib = ptAdjusted;
}
else if (0 == strncmp("MaxTimeStamp:", linedata.c_str(), 13))
{
unsigned int maxTimeStamp = 0;
unsigned int timePerStamp = 0;
sscanf_s(linedata.c_str(), "MaxTimeStamp:%u_%u", &maxTimeStamp, &timePerStamp);
if (scanMaxStamp)
*scanMaxStamp = maxTimeStamp;
if (canClockUnit)
*canClockUnit = timePerStamp;
}
else if (0 == strncmp("Line_", linedata.c_str(), 5))
{
int lineIndex;
unsigned int timeStamp;
sscanf_s(linedata.c_str(), "Line_%d_%u_%d", &lineIndex, &timeStamp, &ptNum);
if (firstIndex < 0)
firstIndex = lineIndex;
lineIndex = lineIndex - firstIndex;
if ((lineIndex < 0) || (lineIndex >= lines))
break;
//new Line
lineIdx++;
if (ptNum > 0)
{
p3DPoint = (SVzNLPointXYZRGBA*)malloc(sizeof(SVzNLPointXYZRGBA) * ptNum);
memset(p3DPoint, 0, sizeof(SVzNLPointXYZRGBA) * ptNum);
}
else
p3DPoint = NULL;
_scanLines[lineIdx].nPointCnt = 0;
_scanLines[lineIdx].nTimeStamp = timeStamp;
_scanLines[lineIdx].p3DPoint = p3DPoint;
}
else if (0 == strncmp("{", linedata.c_str(), 1))
{
float X, Y, Z;
int imageY = 0;
float leftX, leftY;
float rightX, rightY;
int r = -1, g = -1, b = -1;
sscanf_s(linedata.c_str(), "{%f,%f,%f,%f,%f,%f }-{%f,%f}-{%f,%f}", &X, &Y, &Z, &r, &g, &b, &leftX, &leftY, &rightX, &rightY);
int id = _scanLines[lineIdx].nPointCnt;
if (id < ptNum)
{
p3DPoint[id].x = X;
p3DPoint[id].y = Y;
p3DPoint[id].z = Z;
p3DPoint[id].nRGB = 0;
_scanLines[lineIdx].nPointCnt = id + 1;
}
}
}
}
else if (dataFileVer == DATA_VER_OLD)
{
while (getline(inputFile, linedata))
{
if (0 == strncmp("DataElements_", linedata.c_str(), 13))
{
sscanf_s(linedata.c_str(), "DataElements_%d", &dataElements);
if ((dataElements != 3) && (dataElements != 4))
break;
}
if (0 == strncmp("LineV_", linedata.c_str(), 6))
{
double lineV = 0;
sscanf_s(linedata.c_str(), "LineV_%lf", &lineV);
}
else if (0 == strncmp("Line_", linedata.c_str(), 5))
{
int lineIndex;
unsigned int timeStamp;
sscanf_s(linedata.c_str(), "Line_%d_%u", &lineIndex, &timeStamp);
#if 0
if (scanLineListTail == NULL)
firstIndex = lineIndex;
#endif
lineIndex = lineIndex - firstIndex;
if ((lineIndex < 0) || (lineIndex >= lines))
break;
//new Line
//new Line
lineIdx++;
p3DPoint = (SVzNLPointXYZRGBA*)malloc(sizeof(SVzNLPointXYZRGBA) * VZ_LASER_LINE_PT_MAX_NUM);
memset(p3DPoint, 0, sizeof(SVzNLPointXYZRGBA) * VZ_LASER_LINE_PT_MAX_NUM);
_scanLines[lineIdx].nPointCnt = 0;
_scanLines[lineIdx].nTimeStamp = timeStamp;
_scanLines[lineIdx].p3DPoint = p3DPoint;
}
else if (0 == strncmp("(", linedata.c_str(), 1))
{
float X, Y, Z;
int imageY = 0;
if (dataElements == 4)
sscanf_s(linedata.c_str(), "(%f,%f,%f,%d)", &X, &Y, &Z, &imageY);
else
sscanf_s(linedata.c_str(), "(%f,%f,%f)", &X, &Y, &Z);
int id = _scanLines[lineIdx].nPointCnt;
if (id < VZ_LASER_LINE_PT_MAX_NUM)
{
p3DPoint[id].x = X;
p3DPoint[id].y = Y;
p3DPoint[id].z = Z;
p3DPoint[id].nRGB = 0;
_scanLines[lineIdx].nPointCnt = id + 1;
}
}
}
}
inputFile.close();
return _scanLines;
}
SVzNL3DLaserLine* _convertToGridData_XYZRGB(SVzNLXYZRGBDLaserLine* laser3DPoints, int lineNum, double _F, double* camPoseR, int* outLineNum)
{
int min_y = 100000000;
int max_y = -10000000;
int validStartLine = -1;
int validEndLine = -1;
for (int line = 0; line < lineNum; line++)
{
if (laser3DPoints[line].nPointCnt > 0)
{
if (validStartLine < 0)
{
validStartLine = line;
validEndLine = line;
}
else
validEndLine = line;
}
for (int i = 0; i < laser3DPoints[line].nPointCnt; i++)
{
SVzNLPointXYZRGBA* a_pt = &laser3DPoints[line].p3DPoint[i];
if (a_pt->z > 1e-4)
{
double v = _F * a_pt->y / a_pt->z + 2000;
a_pt->nRGB = (int)(v + 0.5);
max_y = max_y < (int)a_pt->nRGB ? (int)a_pt->nRGB : max_y;
min_y = min_y > (int)a_pt->nRGB ? (int)a_pt->nRGB : min_y;
}
}
}
if (min_y == 100000000)
return NULL;
int vldLineNum = validEndLine - validStartLine + 1;
*outLineNum = vldLineNum;
int pt_counter = max_y - min_y + 1;
SVzNL3DLaserLine* gridData = (SVzNL3DLaserLine*)malloc(sizeof(SVzNL3DLaserLine) * (vldLineNum + 1));
memset(gridData, 0, sizeof(SVzNL3DLaserLine) * (vldLineNum + 1));
for (int line = validStartLine; line <= validEndLine; line++)
{
int gridLine = line - validStartLine;
gridData[gridLine].nPositionCnt = pt_counter;
gridData[gridLine].nTimeStamp = laser3DPoints[line].nTimeStamp;
gridData[gridLine].p3DPosition = (SVzNL3DPosition*)malloc(sizeof(SVzNL3DPosition) * pt_counter);
memset(gridData[gridLine].p3DPosition, 0, sizeof(SVzNL3DPosition) * pt_counter);
for (int i = 0; i < laser3DPoints[line].nPointCnt; i++)
{
SVzNLPointXYZRGBA a_pt = laser3DPoints[line].p3DPoint[i];
if (a_pt.z > 1e-4)
{
int pt_id = a_pt.nRGB - min_y;
SVzNL3DPoint tmp_pt = { a_pt.x, a_pt.y, a_pt.z };
SVzNL3DPoint r_pt = _ptRotate(tmp_pt, camPoseR);
gridData[gridLine].p3DPosition[pt_id].pt3D.x = r_pt.x;
gridData[gridLine].p3DPosition[pt_id].pt3D.y = r_pt.y;
gridData[gridLine].p3DPosition[pt_id].pt3D.z = r_pt.z;
}
}
}
return gridData;
}
void vzReadLaserScanPointFromFile_feihu(
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> linePoints;
linePoints.clear();
int startIdx = -1;
int ptIdx = 0;
double pre_y = DBL_MAX;
while (std::getline(inputFile, linedata))
{
if (linedata.empty())
continue;
if (0 == strncmp("{", linedata.c_str(), 1))
{
float X, Y, Z;
int imageY = 0;
float leftX, leftY;
float rightX, rightY;
int r = -1, g = -1, b = -1;
sscanf_s(linedata.c_str(), "{%f,%f,%f,%f,%f,%f }-{%f,%f}-{%f,%f}", &X, &Y, &Z, &r, &g, &b, &leftX, &leftY, &rightX, &rightY);
SVzNL3DPosition a_pt;
a_pt.nPointIdx = ptIdx;
ptIdx++;
a_pt.pt3D.x = X;
a_pt.pt3D.y = Y;
a_pt.pt3D.z = Z;
if ((Y + 5.0) < 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;
}
void _outputScanDataFile_self(char* fileName, SVzNL3DLaserLine* scanData, int lineNum,
float lineV, int maxTimeStamp, int clockPerSecond)
{
std::ofstream sw(fileName);
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++)
{
sw << "Line_" << line << "_" << scanData[line].nTimeStamp << "_" << scanData[line].nPositionCnt << std::endl;
for (int i = 0; i < scanData[line].nPositionCnt; i++)
{
SVzNL3DPosition* pt3D = &scanData[line].p3DPosition[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 vzReadLaserScanPointFromFile_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;
}
typedef struct
{
int r;
int g;
int b;
}SG_color;
void _outputScanDataFile_RGBD_obj(
char* fileName,
std::vector<std::vector< SVzNL3DPosition>>& scanData,
float lineV, int maxTimeStamp, int clockPerSecond,
std::vector<SWD_sheetGrasper>& resultObjPositions)
{
int lineNum = (int)scanData.size();
std::ofstream sw(fileName);
int realLines = lineNum;
realLines++;
sw << "LineNum:" << realLines << std::endl;
sw << "DataType: 0" << std::endl;
sw << "ScanSpeed:" << lineV << std::endl;
sw << "PointAdjust: 1" << std::endl;
sw << "MaxTimeStamp:" << maxTimeStamp << "_" << clockPerSecond << std::endl;
int maxLineIndex = 0;
int max_stamp = 0;
SG_color rgb = { 0, 0, 0 };
SG_color objColor[8] = {
{200,200,200},//淡黄色
{250,0, 0},//巧克力色
{250,250,0},//黄褐色
{0,250,250},//天蓝色
{250,235,215},//古董白
{189,252,201},//薄荷色
{221,160,221},//梅红色
{188,143,143},//玫瑰红色
};
int size = 1;
int nTimeStamp = 0;
double alpha = 0.8;
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];
int ptIdx = pt3D.nPointIdx;
ptIdx = ptIdx % 8;
rgb = objColor[ptIdx];
if (ptIdx > 0)
size = 3;
else
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 1
std::vector<SVzNL3DPoint> centerPoints;
std::vector<SVzNL3DPoint> dirPoints;
int ptNum = (int)resultObjPositions.size();
if (ptNum > 0)
{
for (int i = 0; i < ptNum; i++)
{
SVzNL3DPoint a_center = { resultObjPositions[i].opCenter.x, resultObjPositions[i].opCenter.y, resultObjPositions[i].opCenter.z };
SVzNL3DPoint a_dir = { resultObjPositions[i].opCenter.x, resultObjPositions[i].opCenter.y, resultObjPositions[i].opCenter.z - 20 };
centerPoints.push_back(a_center);
dirPoints.push_back(a_dir);
}
sw << "Line_" << lineNum << "_" << (nTimeStamp + 1000) << "_" << (ptNum + 1) << std::endl;
size = 10;
for (int i = 0; i < ptNum; i++)
{
if (i == 0) rgb = { 255, 0, 0 };
else rgb = { 255, 255, 0 };
sw << "{" << centerPoints[i].x << "," << centerPoints[i].y << "," << centerPoints[i].z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << rgb.r << "," << rgb.g << "," << rgb.b << "," << size << " }" << std::endl;
}
rgb = { 255, 0, 0 };
sw << "{" << centerPoints[0].x << "," << centerPoints[0].y << "," << centerPoints[0].z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << rgb.r << "," << rgb.g << "," << rgb.b << "," << size << " }" << std::endl;
//画出方向线
size = 3;
int lineIdx = 0;
for (int i = 0; i < ptNum; i++)
{
if (i == 0) rgb = { 255, 0, 0 };
else rgb = { 255, 255, 0 };
sw << "Poly_" << lineIdx << "_2" << std::endl;
sw << "{" << centerPoints[i].x << "," << centerPoints[i].y << "," << centerPoints[i].z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
sw << "{" << dirPoints[i].x << "," << dirPoints[i].y << "," << dirPoints[i].z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
lineIdx++;
}
rgb = { 255, 0, 0 };
sw << "Poly_" << lineIdx << "_2" << std::endl;
sw << "{" << centerPoints[0].x << "," << centerPoints[0].y << "," << centerPoints[0].z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
sw << "{" << dirPoints[0].x << "," << dirPoints[0].y << "," << dirPoints[0].z << "}-";
sw << "{0,0}-{0,0}-";
sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl;
}
#endif
sw.close();
}
void _rotateCloudPts(SVzNL3DLaserLine* scanData, int lineNum, double matrix3d[9], std::vector<std::vector< SVzNL3DPosition>>& rotateLines, SVzNLRangeD* rx_range, SVzNLRangeD* ry_range)
{
rx_range->min = 0;
rx_range->max = -1;
ry_range->min = 0;
ry_range->max = -1;
for (int line = 0; line < lineNum; line++)
{
std::vector< SVzNL3DPosition> linePts;
for (int i = 0; i < scanData[line].nPositionCnt; i++)
{
SVzNL3DPosition* pt3D = &scanData[line].p3DPosition[i];
if (pt3D->pt3D.z < 1e-4)
continue;
SVzNL3DPosition r_pt;
r_pt.pt3D = _ptRotate(pt3D->pt3D, matrix3d);
r_pt.nPointIdx = pt3D->nPointIdx;
if (rx_range->max < rx_range->min)
{
rx_range->min = r_pt.pt3D.x;
rx_range->max = r_pt.pt3D.x;
}
else
{
if (rx_range->min > r_pt.pt3D.x)
rx_range->min = r_pt.pt3D.x;
if (rx_range->max < r_pt.pt3D.x)
rx_range->max = r_pt.pt3D.x;
}
if (ry_range->max < ry_range->min)
{
ry_range->min = r_pt.pt3D.y;
ry_range->max = r_pt.pt3D.y;
}
else
{
if (ry_range->min > r_pt.pt3D.y)
ry_range->min = r_pt.pt3D.y;
if (ry_range->max < r_pt.pt3D.y)
ry_range->max = r_pt.pt3D.y;
}
linePts.push_back(r_pt);
}
rotateLines.push_back(linePts);
}
}
void _XOYprojection(cv::Mat& img, std::vector<std::vector< SVzNL3DPosition>>& dataLines,
const double x_scale, const double y_scale, const SVzNLRangeD x_range, const SVzNLRangeD y_range)
{
int x_skip = 16;
int y_skip = 16;
cv::Vec3b rgb = cv::Vec3b(0, 0, 0);
cv::Vec3b 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;
for (int line = 0; line < dataLines.size(); line++)
{
std::vector< SVzNL3DPosition>& a_line = dataLines[line];
for (int i = 0; i < a_line.size(); i++)
{
SVzNL3DPosition* pt3D = &a_line[i];
if (pt3D->pt3D.z < 1e-4)
continue;
int vType = pt3D->nPointIdx & 0xff;
int hType = vType >> 4;
int objId = (pt3D->nPointIdx >> 8) & 0xff;
vType = vType & 0x0f;
if (LINE_FEATURE_RIGHT_ANGLE_HR == vType)
{
rgb = { 255, 97, 0 };
size = 3;
}
else if (LINE_FEATURE_RIGHT_ANGLE_HF == vType)
{
rgb = { 255, 255, 0 };
size = 3;
}
else if (LINE_FEATURE_RIGHT_ANGLE_RH == vType)
{
rgb = { 255, 0, 255 };
size = 3;
}
else if (LINE_FEATURE_RIGHT_ANGLE_FH == vType)
{
rgb = { 160, 82, 45 };
size = 3;
}
else if (LINE_FEATURE_RIGHT_ANGLE_HR == hType)
{
rgb = { 0, 0, 255 };
size = 3;
}
else if (LINE_FEATURE_RIGHT_ANGLE_HF == hType)
{
rgb = { 0, 255, 255 };
size = 3;
}
else if (LINE_FEATURE_RIGHT_ANGLE_RH == hType)
{
rgb = { 0, 255, 0 };
size = 3;
}
else if (LINE_FEATURE_RIGHT_ANGLE_FH == hType)
{
rgb = { 85, 107, 47 };
size = 3;
}
else
{
rgb = { 200, 200, 200 };
size = 1;
}
double x = pt3D->pt3D.x;
double y = pt3D->pt3D.y;
int px = (int)((x - x_range.min) / x_scale + x_skip);
int py = (int)((y - y_range.min) / y_scale + y_skip);
if (size == 1)
img.at<cv::Vec3b>(py, px) = cv::Vec3b(rgb[2], rgb[1], rgb[0]);
else
cv::circle(img, cv::Point(px, py), size, cv::Scalar(rgb[2], rgb[1], rgb[0]), -1);
}
}
}
void EulerRpyToRotation1(double rpy[3], double matrix3d[9]) {
double cos0 = cos(rpy[0] * PI / 180);
double sin0 = sin(rpy[0] * PI / 180);
double cos1 = cos(rpy[1] * PI / 180);
double sin1 = sin(rpy[1] * PI / 180);
double cos2 = cos(rpy[2] * PI / 180);
double sin2 = sin(rpy[2] * PI / 180);
matrix3d[0] = cos2 * cos1;
matrix3d[1] = cos2 * sin1 * sin0 - sin2 * cos0;
matrix3d[2] = cos2 * sin1 * cos0 + sin2 * sin0;
matrix3d[3] = sin2 * cos1;
matrix3d[4] = sin2 * sin1 * sin0 + cos2 * cos0;
matrix3d[5] = sin2 * sin1 * cos0 - cos2 * sin0;
matrix3d[6] = -sin1;
matrix3d[7] = cos1 * sin0;
matrix3d[8] = cos1 * cos0;
return;
}
void _genXOYProjectionImage(cv::String& fileName, SVzNL3DLaserLine* scanData, int lineNum, double rpy[3])
{
//统计X和Y的范围
std::vector<std::vector< SVzNL3DPosition>> scan_lines;
SVzNLRangeD x_range = { 0, -1 };
SVzNLRangeD y_range = { 0, -1 };
for (int line = 0; line < lineNum; line++)
{
std::vector< SVzNL3DPosition> a_line;
for (int i = 0; i < scanData[line].nPositionCnt; i++)
{
SVzNL3DPosition* pt3D = &scanData[line].p3DPosition[i];
if (pt3D->pt3D.z < 1e-4)
continue;
a_line.push_back(*pt3D);
if (x_range.max < x_range.min)
{
x_range.min = pt3D->pt3D.x;
x_range.max = pt3D->pt3D.x;
}
else
{
if (x_range.min > pt3D->pt3D.x)
x_range.min = pt3D->pt3D.x;
if (x_range.max < pt3D->pt3D.x)
x_range.max = pt3D->pt3D.x;
}
if (y_range.max < y_range.min)
{
y_range.min = pt3D->pt3D.y;
y_range.max = pt3D->pt3D.y;
}
else
{
if (y_range.min > pt3D->pt3D.y)
y_range.min = pt3D->pt3D.y;
if (y_range.max < pt3D->pt3D.y)
y_range.max = pt3D->pt3D.y;
}
}
scan_lines.push_back(a_line);
}
int imgRows = 992;
int imgCols = 1056;
double y_rows = 960.0;
double x_cols = 1024.0;
cv::Mat img = cv::Mat::zeros(imgRows, imgCols, CV_8UC3);
//计算投影比例
double x_scale = (x_range.max - x_range.min) / x_cols;
double y_scale = (y_range.max - y_range.min) / y_rows;
_XOYprojection(img, scan_lines, x_scale, y_scale, x_range, y_range);
//旋转视角显示
double matrix3d[9];
EulerRpyToRotation1(rpy, matrix3d);
std::vector<std::vector< SVzNL3DPosition>> rotateLines;
SVzNLRangeD rx_range, ry_range;
_rotateCloudPts(scanData, lineNum, matrix3d, rotateLines, &rx_range, &ry_range);
cv::Mat r_img = cv::Mat::zeros(imgRows, imgCols, CV_8UC3);
//计算投影比例
double rx_scale = (rx_range.max - rx_range.min) / x_cols;
double ry_scale = (ry_range.max - ry_range.min) / y_rows;
_XOYprojection(r_img, rotateLines, rx_scale, ry_scale, rx_range, ry_range);
cv::Mat dis_img;
cv::hconcat(img, r_img, dis_img);
cv::imwrite(fileName, dis_img);
return;
}
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 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 _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 _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 TEST_COMPUTE_CALIB_PARA 0
#define TEST_COMPUTE_GRASP_POS 1
#define TEST_GROUP 1
void sheetPosition_test(void)
{
const char* dataPath[TEST_GROUP] = {
"F:/ShangGu/项目/冠钦项目/温州优匠工品薄片抓取/温州优匠工品薄片数据/", //0
};
SVzNLRange fileIdx[TEST_GROUP] = {
{1,73} };
#if TEST_COMPUTE_CALIB_PARA
int cvt_grp = 0;
char _calib_datafile[256];
sprintf_s(_calib_datafile, "%sLaserData_ground.txt", dataPath[cvt_grp]);
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 = { 12.0, 340.0, -310, 160 };
getROIdata(roi2D, scanLines, roiScanLines);
char calibFile[250];
sprintf_s(calibFile, "%sgroundData_ROI.txt", dataPath[cvt_grp]);
_outputScanDataFile(calibFile, roiScanLines, 0, 0, 0);
SSG_planeCalibPara calibPara = wd_sheetPosition_getBaseCalibPara(roiScanLines);
//结果进行验证
int lineNum = (int)scanLines.size();
for (int i = 0; i < lineNum; i++)
{
if (i == 14)
int kkk = 1;
//行处理
//调平,去除地面
wd_sheetPosition_lineDataR(scanLines[i], calibPara.planeCalib, -1);// calibPara.planeHeight);
}
//
sprintf_s(calibFile, "%sground_calib_para.txt", dataPath[cvt_grp]);
_outputCalibPara(calibFile, calibPara);
char _out_file[256];
sprintf_s(_out_file, "%sground_grid_calib_verify.txt", dataPath[cvt_grp]);
_outputScanDataFile(_out_file, scanLines, 0, 0, 0);
printf("%s: calib done!\n", _calib_datafile);
#if 0
for (int fidx = fileIdx[cvt_grp].nMin; fidx <= fileIdx[cvt_grp].nMax; fidx++)
{
char _scan_file[256];
sprintf_s(_scan_file, "%sLaserData%d.txt", dataPath[cvt_grp], fidx);
std::vector<std::vector< SVzNL3DPosition>> dataLines;
vzReadLaserScanPointFromFile_XYZ_vector(_scan_file, dataLines);
if (dataLines.size() == 0)
continue;
lineNum = (int)dataLines.size();
for (int i = 0; i < lineNum; i++)
{
if (i == 14)
int kkk = 1;
//行处理
//调平,去除地面
wd_sheetPosition_lineDataR(dataLines[i], calibPara.planeCalib, -1);// calibPara.planeHeight);
}
sprintf_s(_out_file, "%sLaserData%d_leveling.txt", dataPath[cvt_grp], fidx);
_outputScanDataFile(_out_file, dataLines, 0, 0, 0);
printf("%s: leveling done!\n", _out_file);
}
#endif
}
#endif
#if TEST_COMPUTE_GRASP_POS
int endGroup = TEST_GROUP - 1;
for (int grp = 0; grp <= endGroup; grp++)
{
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 = 645.0;
for (int i = 0; i < 9; i++)
poseCalibPara.invRMatrix[i] = poseCalibPara.planeCalib[i];
char calibFile[250];
#if 1
if (grp == 0)
{
sprintf_s(calibFile, "%sground_calib_para.txt", dataPath[grp]);
poseCalibPara = _readCalibPara(calibFile);
}
#endif
SWD_sheetTemplateParam sheetParam;
sheetParam.holeDiameter = 16.5; //薄片两端孔直径
sheetParam.holeDistance = 144.0; //薄片两端孔距离
sheetParam.sheetThickness = 2.3; //薄片厚度
sheetParam.centerBossHeight = 4.5; //薄片中央凸起高度
SWD_sheetAlgoParam algoParam;
memset(&algoParam, 0, sizeof(SWD_sheetAlgoParam));
algoParam.cornerParam.cornerTh = 40; //45度角
algoParam.cornerParam.scale = sheetParam.sheetThickness * 1.414; // algoParam.bagParam.bagH / 8; // 15; // algoParam.bagParam.bagH / 8;
algoParam.cornerParam.minEndingGap = 5;
algoParam.cornerParam.minEndingGap_z = sheetParam.sheetThickness * 0.5;
algoParam.cornerParam.jumpCornerTh_1 = 15; //水平角度,小于此角度视为水平
algoParam.cornerParam.jumpCornerTh_2 = 30;
SSG_outlierFilterParam filterParam;
algoParam.filterParam.continuityTh = 20.0; //噪声滤除。当相邻点的z跳变大于此门限时检查是否为噪声。若长度小于outlierLen 视为噪声
algoParam.filterParam.outlierTh = 5;
SSG_treeGrowParam growParam;
algoParam.growParam.maxLineSkipNum = 5;
algoParam.growParam.yDeviation_max = 3.0;
algoParam.growParam.maxSkipDistance = 3.0;
algoParam.growParam.zDeviation_max = 3.0;// algoParam.bagParam.bagH / 2; //袋子高度1/2
algoParam.growParam.minLTypeTreeLen = 100; //mm
algoParam.growParam.minVTypeTreeLen = 100; //mm
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
{
SWD_gripState stateMachine;
memset(&stateMachine, 0, sizeof(SWD_gripState));
//fidx = 4;
int lineNum = 0;
float lineV = 0.0f;
int dataCalib = 0;
int maxTimeStamp = 0;
int clockPerSecond = 0;
char _scan_file[256];
sprintf_s(_scan_file, "%sLaserData%d.txt", dataPath[grp], fidx);
std::vector<std::vector< SVzNL3DPosition>> scanLines;
vzReadLaserScanPointFromFile_XYZ_vector(_scan_file, scanLines);
if (scanLines.size() == 0)
continue;
long t1 = GetTickCount64();
int errCode = 0;
std::vector<SWD_sheetGrasper> resultObjPositions;
wd_YouJiang_getSheetPosition(
scanLines,
sheetParam,
poseCalibPara,
algoParam,
&stateMachine, //操作状态机。指示当前状态
&errCode,
resultObjPositions);
long t2 = GetTickCount64();
char _dbg_file[256];
#if 1
sprintf_s(_dbg_file, "%sresult\\LaserLine%d_result.txt", dataPath[grp], fidx);
_outputScanDataFile_RGBD_obj(_dbg_file, scanLines, 0, 0, 0, resultObjPositions);
sprintf_s(_dbg_file, "%sresult\\LaserLine%d_result_img.png", dataPath[grp], fidx);
cv::String imgName(_dbg_file);
double rpy[3] = { -30, 15, 0 }; //{ 0,-45, 0 }; //
//_genXOYProjectionImage(imgName, laser3DPoints, lineNum, rpy);
#endif
printf("%s: %d(ms)!\n", _scan_file, (int)(t2 - t1));
}
}
#endif
printf("all done!\n");
return;
}
void sheetKeyHeighth_test(void)
{
const char* dataPath[TEST_GROUP] = {
"F:/ShangGu/项目/吕宁项目/测高/", //0
};
SVzNLRange fileIdx[TEST_GROUP] = {
{1,6} };
#if TEST_COMPUTE_CALIB_PARA
int cvt_grp = 0;
char _calib_datafile[256];
sprintf_s(_calib_datafile, "%s样品_grid_5.txt", dataPath[cvt_grp]);
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 = { 237.0, 340.0, -60, 6.0 };
getROIdata(roi2D, scanLines, roiScanLines);
char calibFile[250];
sprintf_s(calibFile, "%sgroundData_ROI.txt", dataPath[cvt_grp]);
_outputScanDataFile(calibFile, roiScanLines, 0, 0, 0);
SSG_planeCalibPara calibPara = wd_sheetPosition_getBaseCalibPara(roiScanLines);
//结果进行验证
int lineNum = (int)scanLines.size();
for (int i = 0; i < lineNum; i++)
{
if (i == 14)
int kkk = 1;
//行处理
//调平,去除地面
wd_sheetPosition_lineDataR(scanLines[i], calibPara.planeCalib, -1);// calibPara.planeHeight);
}
//
sprintf_s(calibFile, "%sground_calib_para.txt", dataPath[cvt_grp]);
_outputCalibPara(calibFile, calibPara);
char _out_file[256];
sprintf_s(_out_file, "%sground_grid_calib_verify.txt", dataPath[cvt_grp]);
_outputScanDataFile(_out_file, scanLines, 0, 0, 0);
printf("%s: calib done!\n", _calib_datafile);
#if 1
for (int fidx = fileIdx[cvt_grp].nMin; fidx <= fileIdx[cvt_grp].nMax; fidx++)
{
char _scan_file[256];
sprintf_s(_scan_file, "%s样品_grid_%d.txt", dataPath[cvt_grp], fidx);
std::vector<std::vector< SVzNL3DPosition>> dataLines;
vzReadLaserScanPointFromFile_XYZ_vector(_scan_file, dataLines);
if (dataLines.size() == 0)
continue;
lineNum = (int)dataLines.size();
for (int i = 0; i < lineNum; i++)
{
if (i == 14)
int kkk = 1;
//行处理
//调平,去除地面
wd_sheetPosition_lineDataR(dataLines[i], calibPara.planeCalib, -1);// calibPara.planeHeight);
}
sprintf_s(_out_file, "%s样品_grid_%d_leveling.txt", dataPath[cvt_grp], fidx);
_outputScanDataFile(_out_file, dataLines, 0, 0, 0);
printf("%s: leveling done!\n", _out_file);
}
#endif
}
#endif
#if TEST_COMPUTE_GRASP_POS
int endGroup = TEST_GROUP - 1;
for (int grp = 0; grp <= endGroup; grp++)
{
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 = 645.0;
for (int i = 0; i < 9; i++)
poseCalibPara.invRMatrix[i] = poseCalibPara.planeCalib[i];
char calibFile[250];
#if 1
if (grp == 0)
{
sprintf_s(calibFile, "%sground_calib_para.txt", dataPath[grp]);
poseCalibPara = _readCalibPara(calibFile);
}
#endif
SWD_sheetKeyParam sheetKeyParam;
sheetKeyParam.keySize = {8.0, 6.0}; //薄片按键大小
sheetKeyParam.sheetSize = {41.0,11.0}; //薄片大小
sheetKeyParam.keyToEdgeDistance = 8.0; //薄片按键距离最近的边的距离
sheetKeyParam.sheetThickness = 0.4; //薄片厚度0.4mm
sheetKeyParam.nominalKeyHeight = 0.5;
SWD_sheetAlgoParam algoParam;
memset(&algoParam, 0, sizeof(SWD_sheetAlgoParam));
algoParam.cornerParam.cornerTh = 40; //45度角
algoParam.cornerParam.scale = sheetKeyParam.sheetThickness*1.25; // algoParam.bagParam.bagH / 8; // 15; // algoParam.bagParam.bagH / 8;
algoParam.cornerParam.minEndingGap = 5;
algoParam.cornerParam.minEndingGap_z = sheetKeyParam.sheetThickness * 0.5;
algoParam.cornerParam.jumpCornerTh_1 = 15; //水平角度,小于此角度视为水平
algoParam.cornerParam.jumpCornerTh_2 = 30;
SSG_outlierFilterParam filterParam;
algoParam.filterParam.continuityTh = 20.0; //噪声滤除。当相邻点的z跳变大于此门限时检查是否为噪声。若长度小于outlierLen 视为噪声
algoParam.filterParam.outlierTh = 5;
SSG_treeGrowParam growParam;
algoParam.growParam.maxLineSkipNum = 5;
algoParam.growParam.yDeviation_max = 3.0;
algoParam.growParam.maxSkipDistance = 3.0;
algoParam.growParam.zDeviation_max = 3.0;// algoParam.bagParam.bagH / 2; //袋子高度1/2
algoParam.growParam.minLTypeTreeLen = 100; //mm
algoParam.growParam.minVTypeTreeLen = 100; //mm
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
{
SWD_gripState stateMachine;
memset(&stateMachine, 0, sizeof(SWD_gripState));
//fidx = 4;
int lineNum = 0;
float lineV = 0.0f;
int dataCalib = 0;
int maxTimeStamp = 0;
int clockPerSecond = 0;
char _scan_file[256];
sprintf_s(_scan_file, "%s样品_grid_%d.txt", dataPath[grp], fidx);
std::vector<std::vector< SVzNL3DPosition>> scanLines;
vzReadLaserScanPointFromFile_XYZ_vector(_scan_file, scanLines);
if (scanLines.size() == 0)
continue;
long t1 = GetTickCount64();
int errCode = 0;
std::vector<SWD_sheetGrasper> resultObjPositions;
wd_computeSheetKeyHeigth(
scanLines,
sheetKeyParam,
poseCalibPara,
algoParam,
&stateMachine, //操作状态机。指示当前状态
&errCode,
resultObjPositions);
long t2 = GetTickCount64();
char _dbg_file[256];
#if 1
sprintf_s(_dbg_file, "%sresult\\样品_grid_%d_result.txt", dataPath[grp], fidx);
_outputScanDataFile_RGBD_obj(_dbg_file, scanLines, 0, 0, 0, resultObjPositions);
sprintf_s(_dbg_file, "%sresult\\样品_grid_%d_result_img.png", dataPath[grp], fidx);
cv::String imgName(_dbg_file);
double rpy[3] = { -30, 15, 0 }; //{ 0,-45, 0 }; //
//_genXOYProjectionImage(imgName, laser3DPoints, lineNum, rpy);
#endif
printf("%s: %d(ms)!\n", _scan_file, (int)(t2 - t1));
}
}
#endif
printf("all done!\n");
}
int main()
{
#if 0
sheetPosition_test();
#else
sheetKeyHeighth_test();
#endif
return 0;
}