rodAndBarDetection version 1.3.4 : 新的定位盘中心测量功能算法优化
This commit is contained in:
parent
2d837cb108
commit
27244f17d3
@ -1142,25 +1142,26 @@ void locatingPlateTest(void)
|
||||
}
|
||||
}
|
||||
|
||||
#define NEW_LOCATING_PALTE_TEST_GROUP 1
|
||||
#define NEW_LOCATING_PALTE_TEST_GROUP 2
|
||||
void newLocatingPlateTest(void)
|
||||
{
|
||||
const char* dataPath[NEW_LOCATING_PALTE_TEST_GROUP] = {
|
||||
"F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/定位盘点云20260621/", //0
|
||||
"F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/定位盘点云20260521/", //0
|
||||
"F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/定位盘点云20260603/", //1
|
||||
};
|
||||
|
||||
SVzNLRange fileIdx[NEW_LOCATING_PALTE_TEST_GROUP] = {
|
||||
{12,13},
|
||||
{12,13}, {1,51}
|
||||
};
|
||||
|
||||
const char* ver = wd_rodAndBarDetectionVersion();
|
||||
printf("ver:%s\n", ver);
|
||||
|
||||
for (int grp = 0; grp < NEW_LOCATING_PALTE_TEST_GROUP; grp++)
|
||||
for (int grp = 1; grp < NEW_LOCATING_PALTE_TEST_GROUP; grp++)
|
||||
{
|
||||
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
|
||||
{
|
||||
//fidx =2;
|
||||
//fidx =16;
|
||||
char _scan_file[256];
|
||||
sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx);
|
||||
|
||||
@ -1734,9 +1735,9 @@ int main()
|
||||
{
|
||||
//ESG_testMode testMode = keSG_测试_配天螺杆定位;
|
||||
//ESG_testMode testMode = keSG_测试_配天定位盘定位;
|
||||
//ESG_testMode testMode = keSG_测试_配天新定位盘定位;
|
||||
ESG_testMode testMode = keSG_测试_配天新定位盘定位;
|
||||
//ESG_testMode testMode = keSG_测试_棒材抓取;
|
||||
ESG_testMode testMode = keSG_测试_筑裕钢筋焊缝定位;
|
||||
//ESG_testMode testMode = keSG_测试_筑裕钢筋焊缝定位;
|
||||
|
||||
if(keSG_测试_配天螺杆定位 == testMode)
|
||||
screwTest();
|
||||
|
||||
@ -24,7 +24,8 @@
|
||||
//version 1.3.1 : 定位盘中心测量功能添加了噪声过滤
|
||||
//version 1.3.2 : 矩森棒材抓取修正一个错误码返回错误,测试了地面调平API
|
||||
//version 1.3.3 : 筑裕钢筋焊缝提取算法改进中间版本
|
||||
std::string m_strVersion = "1.3.3";
|
||||
//version 1.3.4 : 新的定位盘中心测量功能算法优化
|
||||
std::string m_strVersion = "1.3.4";
|
||||
const char* wd_rodAndBarDetectionVersion(void)
|
||||
{
|
||||
return m_strVersion.c_str();
|
||||
@ -908,13 +909,27 @@ SVzNL3DRangeD _getPointCloudROI(std::vector<SWD3DPointPostion>& scanData)
|
||||
return;
|
||||
}
|
||||
|
||||
double _getListMeanZ(std::vector< SVzNL3DPosition>& listData)
|
||||
double _getListMeanZ(std::vector< SVzNL3DPosition>& listData, SVzNLRangeD& zRange)
|
||||
{
|
||||
if (listData.size() == 0)
|
||||
return 0;
|
||||
double meanZ = 0;
|
||||
zRange.max = -1;
|
||||
zRange.min = 0;
|
||||
for (int i = 0; i < (int)listData.size(); i++)
|
||||
{
|
||||
meanZ += listData[i].pt3D.z;
|
||||
if (zRange.max < 0)
|
||||
{
|
||||
zRange.max = listData[i].pt3D.z;
|
||||
zRange.min = listData[i].pt3D.z;
|
||||
}
|
||||
else
|
||||
{
|
||||
zRange.max = zRange.max < listData[i].pt3D.z ? listData[i].pt3D.z : zRange.max;
|
||||
zRange.min = zRange.min > listData[i].pt3D.z ? listData[i].pt3D.z : zRange.min;
|
||||
}
|
||||
}
|
||||
meanZ = meanZ / (double)listData.size();
|
||||
return meanZ;
|
||||
}
|
||||
@ -1378,7 +1393,8 @@ SSX_platePoseInfo sx_getLocationPlatePose(
|
||||
double w = a_roi.right - a_roi.left;
|
||||
double h = a_roi.bottom - a_roi.top;
|
||||
|
||||
double meanZ = _getListMeanZ(objClusters[i]);
|
||||
SVzNLRangeD zRange;
|
||||
double meanZ = _getListMeanZ(objClusters[i], zRange);
|
||||
objMeanZ[i] = meanZ;
|
||||
if ( (meanZ > 1e-4) && (w > 150) && (h > 100))
|
||||
{
|
||||
@ -2090,7 +2106,7 @@ SSX_platePoseInfo sx_getLocationPlatePose_new(
|
||||
double minObjSize_h = 150;
|
||||
|
||||
int clusterCheckWin = 5;
|
||||
double clusterDist = 5.0;
|
||||
double clusterDist = 1.5;
|
||||
int distType = 1; //0 - 2d distance; 1- 3d distance
|
||||
std::vector<std::vector< SVzNL3DPosition>> objClusters; //result
|
||||
wd_pointClustering_speedUp(
|
||||
@ -2102,10 +2118,13 @@ SSX_platePoseInfo sx_getLocationPlatePose_new(
|
||||
);
|
||||
|
||||
//保留最前面的目标
|
||||
const double topPlateMinW = 150;
|
||||
const double topPlateMinH = 150;
|
||||
const double topPlateMinW = 150.0;
|
||||
const double topPlateMinH = 150.0;
|
||||
const double topPlateMaxZRange = 100.0;
|
||||
std::vector<double> objMeanZ;
|
||||
objMeanZ.resize(objClusters.size());
|
||||
std::vector<SVzNLRangeD> objZRange;
|
||||
objMeanZ.resize(objClusters.size());
|
||||
objZRange.resize(objClusters.size());
|
||||
for (int i = 0; i < (int)objClusters.size(); i++)
|
||||
{
|
||||
SSG_ROIRectD a_roi = _getListROI(objClusters[i]);
|
||||
@ -2113,12 +2132,17 @@ SSX_platePoseInfo sx_getLocationPlatePose_new(
|
||||
double h = a_roi.bottom - a_roi.top;
|
||||
if ((w > topPlateMinW) && (h > topPlateMinH))
|
||||
{
|
||||
|
||||
double meanZ = _getListMeanZ(objClusters[i]);
|
||||
SVzNLRangeD zRange;
|
||||
double meanZ = _getListMeanZ(objClusters[i], zRange);
|
||||
objMeanZ[i] = meanZ;
|
||||
objZRange[i]= zRange;
|
||||
}
|
||||
else
|
||||
objMeanZ[i] = 0; 0;
|
||||
{
|
||||
objMeanZ[i] = 0;
|
||||
objZRange[i].max = -1.0;
|
||||
objZRange[i].min = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
//选出z最小的目标作为顶部轮廓
|
||||
@ -2126,12 +2150,16 @@ SSX_platePoseInfo sx_getLocationPlatePose_new(
|
||||
double minMeanZ = DBL_MAX;
|
||||
for (int i = 0; i < (int)objClusters.size(); i++)
|
||||
{
|
||||
if (objMeanZ[i] > 1e-4)
|
||||
if ( (objMeanZ[i] > 1e-4) && (objZRange[i].max > 0))
|
||||
{
|
||||
if (minMeanZ > objMeanZ[i])
|
||||
double range = objZRange[i].max - objZRange[i].min;
|
||||
if (range < topPlateMaxZRange)
|
||||
{
|
||||
minMeanZ = objMeanZ[i];
|
||||
objIdx = i;
|
||||
if (minMeanZ > objMeanZ[i])
|
||||
{
|
||||
minMeanZ = objMeanZ[i];
|
||||
objIdx = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user