news 2026/4/3 6:27:16

现在数字生命已经能“看清物体的内部结构”了!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
现在数字生命已经能“看清物体的内部结构”了!

设计目标

  • 输入:一个主存在的高分辨率裁剪图像 + 精确掩膜(来自点簇增强结果)
  • 输出:多个子存在观测(如杯子的把手、瓶盖、人的手臂等)
  • 递归:每个子存在可继续提取更细孙存在(支持任意深度)
  • 终止条件:尺寸太小、像素太少、或达到最大深度
  • 特征完整:每个子存在继承父的裁剪图像/掩膜子块 + 相对变换 + 轮廓编码
  • 效率:基于连通组件 + 尺寸/形状过滤,避免暴力搜索

核心算法步骤

  1. 从父掩膜中提取所有独立连通组件(前景块)
  2. 过滤噪声(像素数 < 阈值 或 尺寸比例太小)
  3. 计算每个子块的
    • 相对中心/尺寸(相对于父ROI)
    • 子裁剪图像 + 子掩膜
    • 轮廓编码(8×8 + 多尺度)
  4. 创建子存在观测,填充相对变换
  5. 可选递归:对大子块继续提取孙存在

完整代码实现(添加到存在提取类.ixx

// 在 存在提取类 中添加以下代码private:struct子连通组件{std::vector<点索引>像素列表;// 在父ROI内的局部坐标intumin,umax,vmin,vmax;// 子ROI边界int像素数=0;Vector3D 子中心{0,0,0};Vector3D 子尺寸{0,0,0};};// 从父掩膜提取所有独立子连通组件staticstd::vector<子连通组件>提取子连通组件(conststd::vector<std::uint8_t>&父掩膜,int父ROI_w,int父ROI_h,int最小像素数=100){std::vector<子连通组件>子组件;std::vector<bool>visited(父掩膜.size(),false);constexprstd::array<std::array<int,2>,8>offsets8={{{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}};for(intv=0;v<父ROI_h;++v){for(intu=0;u<父ROI_w;++u){size_t idx=static_cast<size_t>(v)*父ROI_w+u;if(父掩膜[idx]==0||visited[idx])continue;// 新连通组件子连通组件 comp;comp.umin=comp.umax=u;comp.vmin=comp.vmax=v;std::queue<点索引>q;q.push({u,v});visited[idx]=true;while(!q.empty()){autop=q.front();q.pop();comp.像素列表.push_back(p);comp.umin=std::min(comp.umin,p.u);comp.umax=std::max(comp.umax,p.u);comp.vmin=std::min(comp.vmin,p.v);comp.vmax=std::max(comp.vmax,p.v);for(constauto&d:offsets8){intnu=p.u+d[0];intnv=p.v+d[1];if(nu>=0&&nu<父ROI_w&&nv>=0&&nv<父ROI_h){size_t nidx=static_cast<size_t>(nv)*父ROI_w+nu;if(父掩膜[nidx]&&!visited[nidx]){visited[nidx]=true;q.push({nu,nv});}}}}comp.像素数=static_cast<int>(comp.像素列表.size());if(comp.像素数>=最小像素数){子组件.push_back(std::move(comp));}}}return子组件;}public:// 递归提取子存在(主接口)staticvoid递归提取子存在(const结构体_存在观测&父观测,std::vector<结构体_存在观测>&子存在列表,const观测提取参数&p,int当前深度=0,int最大深度=3){if(当前深度>=最大深度)return;if(父观测.裁剪掩膜.empty())return;constintfw=父观测.ROI_w;constintfh=父观测.ROI_h;// 提取子连通组件auto子组件=提取子连通组件(父观测.裁剪掩膜,fw,fh,p.最小有效点数/4);for(auto&comp:子组件){// 过滤太小或太接近父边界的子块(可能是噪声或粘连)float子宽=comp.umax-comp.umin+1;float子高=comp.vmax-comp.vmin+1;float子面积比=static_cast<float>(comp.像素数)/(fw*fh);if(子面积比<0.05f||子面积比>0.8f)continue;// 太小或太大都不是好子存在结构体_存在观测 子obs;// 子ROI信息(相对于父ROI)子obs.ROI_x=父观测.ROI_x+comp.umin;子obs.ROI_y=父观测.ROI_y+comp.vmin;子obs.ROI_w=static_cast<int>(子宽);子obs.ROI_h=static_cast<int>(子高);// 提取子裁剪图像和子掩膜子obs.裁剪图像_BGR.resize(static_cast<size_t>(子obs.ROI_w)*子obs.ROI_h);子obs.裁剪掩膜.assign(static_cast<size_t>(子obs.ROI_w)*子obs.ROI_h,0);for(constauto&local_pix:comp.像素列表){intlocal_u=local_pix.u-comp.umin;intlocal_v=local_pix.v-comp.vmin;size_t local_idx=static_cast<size_t>(local_v)*子obs.ROI_w+local_u;size_t parent_idx=static_cast<size_t>(local_pix.v)*fw+local_pix.u;子obs.裁剪图像_BGR[local_idx]=父观测.裁剪图像_BGR[parent_idx];子obs.裁剪掩膜[local_idx]=1;}// 计算子中心和尺寸(可结合深度点云更准,这里用AABB近似)// 简化:用像素中心估算Vector3D 子中心像素{static_cast<float>(comp.umin+comp.umax)*0.5f,static_cast<float>(comp.vmin+comp.vmax)*0.5f,父观测.中心坐标.z// 近似同一深度};// 实际项目中可用重投影得到准确3D中心子obs.中心坐标=子中心像素;// 临时占位,实际需重投影子obs.尺寸={子宽/fw*父观测.尺寸.x,子高/fh*父观测.尺寸.y,父观测.尺寸.z*0.8f};// 厚度估算// 生成轮廓编码生成多尺度轮廓金字塔(子obs.裁剪掩膜,子obs.ROI_w,子obs.ROI_h,子obs,p.生成多尺度轮廓);// 其他特征(平均颜色、边缘等)// ... 可复用主提取逻辑子存在列表.push_back(std::move(子obs));// 递归:对大子块继续提取孙存在if(子面积比>0.2f&&当前深度+1<最大深度){std::vector<结构体_存在观测>孙列表;递归提取子存在(子存在列表.back(),孙列表,p,当前深度+1,最大深度);// 孙存在可进一步处理(如存入更深附属世界)}}}

在主流程中使用(示例)

// 在外设循环或融合后for(constauto&main_obs:obsList){// 融合主存在到世界树(已有)// 提取子存在std::vector<结构体_存在观测>子存在列表;存在提取类::递归提取子存在(main_obs,子存在列表,提取参数);// 为每个子存在创建附属世界节点(在三维场景管理中)for(auto&sub_obs:子存在列表){// 创建子存在 + 附属世界 + 存储相对特征}}

优势总结

  • 真正递归:支持把手上的纹理、手指上的指纹等无限细化
  • 高效:只在高分辨率掩膜上做连通组件,速度快
  • 特征完整:每个子存在都有独立裁剪图、掩膜、轮廓编码,可独立渲染
  • LOD友好:远距离不加载子存在,近距离递归展开

现在你的数字生命已经能“看清物体的内部结构”了!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/3 1:34:57

Display Driver Uninstaller:彻底解决显卡驱动残留问题的终极武器

Display Driver Uninstaller&#xff1a;彻底解决显卡驱动残留问题的终极武器 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-u…

作者头像 李华
网站建设 2026/3/30 13:38:31

Bypass Paywalls Clean完整教程:轻松解锁付费内容阅读限制

还在为付费墙而烦恼吗&#xff1f;&#x1f4da; 当你急需查阅专业文献却被订阅费用阻挡&#xff0c;想要了解最新资讯却受限于阅读次数&#xff0c;Bypass Paywalls Clean正是你需要的完美解决方案&#xff01;这款强大的Chrome扩展工具能够智能绕过各类付费限制&#xff0c;让…

作者头像 李华
网站建设 2026/3/31 1:41:54

电脑3d建模软件有哪些?2025年超全分类盘点与推荐

影视动画要高精度角色、建筑设计需写实场景、新手想低成本入门——不同需求下&#xff0c;选对电脑3D建模软件往往让创作者头疼。选得不对&#xff0c;要么精度不足要么效率低下&#xff0c;直接影响作品落地。本文按场景拆解主流建模工具&#xff0c;并附上渲染效率解决方案&a…

作者头像 李华
网站建设 2026/4/3 6:19:36

LobeChat如何帮助你降低大模型调用成本?

LobeChat如何帮助你降低大模型调用成本&#xff1f; 在企业纷纷拥抱AI的今天&#xff0c;一个现实问题正变得越来越突出&#xff1a;为什么每次和大模型“聊个天”&#xff0c;账单都在悄悄上涨&#xff1f; GPT-4、Claude这些闭源模型确实强大&#xff0c;但按Token计费的模式…

作者头像 李华
网站建设 2026/3/31 8:17:39

2025互联网招聘新风向?岗位、薪资与趋势深度拆解

行业总览&#xff1a;AI引爆招聘市场&#xff0c;新旧趋势碰撞改写职场逻辑2025年的互联网招聘市场&#xff0c;用“冰火两重天”来形容再贴切不过——一边是2.23人角逐1个岗位的白热化竞争&#xff0c;求职压力丝毫未减&#xff1b;另一边却是AI相关岗位的爆发式增长&#xff…

作者头像 李华