C++三维点云底面简单识别和修补

C++三维点云底面简单识别和修补,第1张

概述本文章向大家介绍C++三维点云底面简单识别修补,主要包括C++三维点云底面简单识别和修补使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

@H_301_1@C++三维点云底面简单识别和修补

前言

三维点云的应用中,经常需要识别底面(如体积计算的参考平面、基坑测量等);而底面点云如果出现缺损、空洞时,又会影响计算,就需要进行修补。

本文通过最简单的方式,快速找到底面并进行修补。当然,由于过于简单,存在着很多限制,比如底面必须位于Z轴最下端,或者可以旋转到Z轴;又比如底面必须是平面。

底面识别

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

定义统计信息;

// 统计信息

struct data

{

public:

data()

{

i = 0;

j = 0;

count = 0;

}

int i; // X坐标索引

int j; // Y坐标索引

int count; // 统计点数,用于过滤孤立点

float min; // 统计X、Y坐标索引范围内点云Z的最小值

float max; // 统计X、Y坐标索引范围内点云Z的最大值

float mean; // 统计X、Y坐标索引范围内点云Z的平均值

};

处理点云,统计分块点云信息;

// 统计信息

vector vecdata;

// 取x和y的整数部分作为索引,相当于将点云分成1m*1m的块

int indexX = tmp_x;

int indexY = tmp_y;

bool found = false;

for(int n = 0; n < vecdata.size(); n++)

{

if (vecdata[n].i == indexX && vecdata[n].j == indexY)// 队列中已经存在的块

{

// 更新统计值

vecdata[n].count = vecdata[n].count + 1;

vecdata[n].min = (vecdata[n].min > tmp_z) ? tmp_z : vecdata[n].min;

vecdata[n].max = (vecdata[n].max < tmp_z) ? tmp_z : vecdata[n].max;

vecdata[n].mean = (vecdata[n].mean * (vecdata[n].count - 1) + tmp_z) / vecdata[n].count ;

found = true;

}

}

// 队列中不存在的块

if (!found)

{

data d;

d.i = tmp_x;

d.j = tmp_y;

d.count = 1;

d.min = tmp_z;

d.max = tmp_z;

d.mean = tmp_z;

vecdata.push_back(d);

}

根据统计的点云信息,找到底面

// 查找最低平面的Z值

float minZ = 1000;

for(int k = 0; k < vecdata.size(); k++)

{

// 根据点数、最大值、最小值判断是否为有效平面

if (vecdata[k].count > 100 && vecdata[k].max - vecdata[k].min < 0.1)

{

minZ = (minZ > vecdata[k].mean) ? vecdata[k].mean : minZ;

}

}

平面修补

按照一定的分辨率,使用找到的最小Z值修补平面

float VirtualX = -20;// x范围(本例为-20到0)

float VirtualY = -40;// y范围(本例为-40到0)

while(VirtualY < 0)

{

while(VirtualX < 0)

{

// 模拟点云

float x = VirtualX;

float y = VirtualY;

float z = minZ;

VirtualX += 0.1;// 按照0.1m的分辨率填充

}

VirtualX = -20;

VirtualY += 0.1;// 按照0.1m的分辨率填充

}

说明

平面修补改为for循环可能更容易理解;

平面修补范围可以任意设置,可以CreatepolygonRgn函数进行多边形修补。

效果图

修补前


修补后


总结

以上是内存溢出为你收集整理的C++三维点云底面简单识别和修补全部内容,希望文章能够帮你解决C++三维点云底面简单识别和修补所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1264609.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存