VTK与CGAL双库混排:从数据互转到骨架提取的网格修复管线
简介在三维几何处理与CAD逆向工程中网格修复是布尔运算、模型偏置、骨架提取等下游操作的前提。面对带破洞、非流形或自交的STL模型单靠通用网格库往往难以兼顾显示与算法鲁棒性。VTK擅长组织点线面数据并完成可视化交互CGAL则提供严格的流形网格表示与稳健的几何算法。两者结合时关键在拓扑结构转换——将VTK的“表面壳”数据映射为CGAL半边结构再通过三角剖分、去退化、补洞等步骤构建水密网格继而执行布尔运算、模型膨胀与骨架提取。这套混合管线覆盖了从数据准备到结果验证的完整流程能有效解决工程中反复出现的输入脏、边界缺失、偏置自交等问题尤其适合需要高精度几何计算的网格修复场景。1. VTK 与 CGAL 混排网格修复这条管线为什么要两套库一起用做网格修复的开发者迟早会遇到同样的问题客户丢过来一个破损 STL要补洞、要布尔切割、要整体膨胀一圈、还要抽骨架。单用 VTK三角剖分和偏置算法实现到一半就发现边界情况处理不过来单用 CGAL数据可视化又得从零开始。最顺手的方案就是把两者拼起来VTK 负责组织点、边、面数据负责显示和交互CGAL 负责算数——布尔运算、三角剖分、补洞、模型偏置膨胀、降采样、骨架提取都是它的看家本领。这套组合之所以成立是因为 VTK 的 vtkPolyData 描述的是“表面壳”允许开口、非流形、任意多边形CGAL 的 Surface_mesh 是严格流形网格布尔和补洞都要求输入封闭、无自交。下面从数据互转开始把这套混合管线的每一步拆开讲清楚。2. 数据链路先行vtkPolyData 与 CGAL Surface_mesh 互转的最小代码2.1 vtkPolyData 是“壳”Surface_mesh 是“网”结构差异决定了转换方式打开任意一个 STL 时vtkPolyData 内部是 vtkPoints 装裸坐标vtkCellArray 装一个个多边形 cell这些 cell 之间没有邻接关系两个三角形即使共享同一条边数据层面也是各存各的。CGAL 的 Surface_mesh 则完全是另一套思路顶点、半边、面三者互相索引一条半边知道自己的对面半边、属于哪个面、下一个半边是谁。这个结构差异带来两个直接后果第一转换必须重建拓扑不能把 cell 直接塞进去第二CGAL 对网格流形性有硬约束vtkPolyData 里的非流形边在转换过程中就会暴露成异常。所以数据互转不是写个循环遍历那么简单先想清楚两边各自允许什么、拒绝什么后面才不会处处撞墙。2.2 互转代码顶点映射表是整段代码的灵魂#include CGAL/Surface_mesh.h #include CGAL/Simple_cartesian.h #include vtkPolyData.h #include vtkCellArray.h #include vtkPoints.h using K CGAL::Simple_cartesiandouble; using Mesh CGAL::Surface_meshK::Point_3; // vtkPolyData - CGAL Surface_mesh Mesh vtk_to_cgal(vtkPolyData* poly) { Mesh mesh; // 关键vtk 的 point id 与 CGAL 的 Vertex_index 不是同一套索引 std::vectorMesh::Vertex_index vmap(poly-GetNumberOfPoints()); for (vtkIdType i 0; i poly-GetNumberOfPoints(); i) { double p[3]; poly-GetPoint(i, p); vmap[i] mesh.add_vertex(Mesh::Point(p[0], p[1], p[2])); } vtkCellArray* cells poly-GetPolys(); vtkIdType npts 0; vtkIdType const* ids nullptr; for (cells-InitTraversal(); cells-GetNextCell(npts, ids); ) { if (npts 3) continue; // 跳过退化的线 std::vectorMesh::Vertex_index face; for (vtkIdType j 0; j npts; j) { face.push_back(vmap[ids[j]]); } mesh.add_face(face); // 非流形输入会在这里失败 } return mesh; }这段代码的主体是两层循环。外层遍历 vtkCellArray 里的每个 polygon cellGetNextCell返回npts和顶点 id 数组ids内层把 vt id 映射到 CGAL 顶点。vmap是整段代码的灵魂因为mesh.add_vertex返回的Vertex_index是一个内部句柄不是从 0 开始的连续编号跳过映射表直接拿 vtk 的 id 去建面一定出错。另一个需要注意的是 cell 数组的布局GetNextCell返回的ids数组第一个元素是 cell 的顶点个数而不是顶点本身所以循环次数由npts控制不要自己越界去读ids[0]。add_face在遇到非流形输入时会返回空 optional 或者直接抛异常这个现象本身就是一个信号转不过去先检查输入网格。2.3 反向转换CGAL 到 vtkPolyData法线属性不会自动带回来// CGAL Surface_mesh - vtkPolyData只处理三角形面 vtkSmartPointervtkPolyData cgal_to_vtk(const Mesh mesh) { auto poly vtkSmartPointervtkPolyData::New(); auto pts vtkSmartPointervtkPoints::New(); auto polys vtkSmartPointervtkCellArray::New(); std::vectorvtkIdType vmap(mesh.number_of_vertices()); for (auto v : mesh.vertices()) { auto p mesh.point(v); vmap[v] pts-InsertNextPoint(p.x(), p.y(), p.z()); } for (auto f : mesh.faces()) { vtkIdType vids[3]; int i 0; for (auto v : CGAL::vertices_around_face(mesh.halfedge(f), mesh)) { if (i 3) break; // 本函数只处理三角形面 vids[i] vmap[v]; } if (i 3) { polys-InsertNextCell(3, vids); } } poly-SetPoints(pts); poly-SetPolys(polys); return poly; }反向转换只输出三角形面因为后续布尔运算、补洞、偏置、骨架提取都默认三角网格。遍历面顶点时用vertices_around_face从halfedge(f)出发按半边方向走拿到的顶点顺序是一致的喂给 vtkPolyData 后法线朝向不会乱。转换完成的 vtkPolyData 里没有法线、颜色、纹理坐标CGAL 的 Surface_mesh 默认不保存这些属性如果转换目的是可视化常见做法是用vtkPolyDataNormals重新计算法线不要指望 CGAL 给你带出来。内存也要留意CGAL Surface_mesh 每个顶点的开销明显高于 vtk 的点数组模式一个几百万面的网格转进去可能吃掉多一倍内存遇到大模型先在 vtk 侧降采样再转不要硬扛。2.4 转换前先做三类检查能挡掉一半崩溃转换阶段最容易漏的是重复顶点、非流形边、自交面片。重复顶点在 CAD 导出的 STL 里几乎必然存在每个三角形自带一份坐标相邻三角形各存各的转进 CGAL 后两个面不共享顶点拓扑就是断的后续补洞和布尔全乱套。我一般会先用vtkCleanPolyData合并重复点再把合并前后的顶点数打印出来对比确认。非流形边用vtkFeatureEdges设置NonManifoldEdgesOn后统计输出边数边数大于 0 说明有一组三角形共用同一条边超过两次这样的网格进 CGAL 轻则丢半边重则直接异常。自交检查放到转换后用 CGAL 的does_self_intersect跑一遍这个函数返回相交面对数对大网格比较慢但值得在进布尔运算前做一次否则布尔结果为空的时候你根本分不清是输入问题还是算法问题。这三类检查是混用 VTK 和 CGAL 的安全带每换一个新的输入模型先跑这三个检查再往下走能省大量排错时间。3. 三角剖分与布尔运算把任意面片变成水密网格的两次调用3.1 为什么要先做三角剖分多边形面片是布尔和补洞的共同隐患从 CAD 软件导出的网格经常带四边形、五边形面vtkPolyData 能显示但进入 CGAL 的布尔运算管线前必须把所有面统一成三角形。原因很实际布尔运算的交线计算是建立在三角形细分上的输入带 n 边形面时 CGAL 内部会先自己拆一次自动拆出来的三角形质量和方向不可控后续偏置和骨架提取都会受影响。triangulate_faces是这里的主力接口它直接修改传入的网格把所有非三角形面按耳切法拆开。调用很简单但拆完之后一定要检查退化面共线三点会产生面积接近零的退化三角形这类面在布尔运算里会导致交线抖动。我见过不止一次布尔算完出来一个莫名其妙少了一块的结果查到最后就是输入里有一二十个退化三角形。#include CGAL/Polygon_mesh_processing/repair.h namespace PMP CGAL::Polygon_mesh_processing; // 对网格内所有非三角形面执行耳切三角剖分 PMP::triangulate_faces(mesh); // 清理剖分后出现的退化三角形面积小于 1e-10 会被过滤 PMP::remove_degenerate_faces(mesh, PMP::parameters::threshold(1e-10));remove_degenerate_faces会把退化三角形从网格里删掉并自动缝合它留下的边界这一步在三角剖分之后、布尔运算之前做能减少很多莫名其妙的边界问题。注意阈值不要给太大正常模型里有一些细长三角形是合法的阈值过大会把可用面也删掉。3.2 布尔运算corefinement 接口与前置条件CGAL 的布尔运算有两条路线。一条是 Nef_polyhedron_3基于半空间集合运算非常稳健但对输入要求封闭且无自交速度也慢适合做一次性高质量的 CSG。另一条是 Polygon_mesh_processing 的 corefinement 系列提供corefine_and_compute_union、corefine_and_compute_difference、corefine_and_compute_intersection三个封装直接吃两个 Surface_mesh 再输出结果速度比 Nef 快一个数量级工艺迭代时用很合适。工程上新模型反复调参的场景多一般都用 corefinement 这套只有在模型特别脏、corefinement 反复失败时才退回 Nef 兜底。算法输入要求速度稳定性适用场景Nef_polyhedron_3封闭多面体即可慢对退化输入更宽容一次性高精度布尔corefine_and_compute_*封闭、无自交、三角网格快严苛依赖前置条件迭代调参、批量处理#include CGAL/Polygon_mesh_processing/corefinement.h // 前置条件A 和 B 都已封闭、无自交、无退化三角形 if (!PMP::is_closed(A) || !PMP::is_closed(B)) return; Mesh out; bool ok PMP::corefine_and_compute_union(A, B, out); // 并 // bool ok PMP::corefine_and_compute_difference(A, B, out); // 差 // bool ok PMP::corefine_and_compute_intersection(A, B, out); // 交 if (ok) { // 下一步通常是再做一次 remove_degenerate_faces PMP::remove_degenerate_faces(out); }这个接口没有额外参数考验的全是前置条件。is_closed检查网格所有边是否都有对面半边does_self_intersect检查有无面片互相穿透。我常用的顺序是三角剖分 → 去退化 → 补洞 → 检查封闭和自交 → 布尔。很多时候布尔失败不是算法问题而是补洞那一步漏掉了一个小开口is_closed返回 false。另外注意布尔运算结果里偶尔会出现极细长的三角形这是两个网格交线处的正常现象判断 ok 为 true 之后立即清理一遍退化面否则后面骨架提取会在这里长出一根假刺。4. 补洞与模型偏置先补边界再膨胀顺序和参数不能乱4.1 补洞边界检测交给 VTK填充交给 CGAL打印模型和布尔运算的共同前提是水密网格而实际拿到的模型几乎都有洞。补洞前先要回答一个问题洞在哪里用 vtkFeatureEdges 的边界边检测最省事它会抽出所有只有一侧有面的边闭合的边界边链就是一个洞的轮廓。auto featureEdges vtkSmartPointervtkFeatureEdges::New(); featureEdges-SetInputData(poly); featureEdges-BoundaryEdgesOn(); featureEdges-FeatureEdgesOff(); featureEdges-NonManifoldEdgesOff(); featureEdges-ManifoldEdgesOff(); featureEdges-Update(); // featureEdges-GetOutput() 输出的是洞的边界线闭合环路即洞轮廓检测到边界线后把对应的半边 index 交给 CGAL 的triangulate_hole。注意一个洞对应多条边界半边对同一个洞只需要取其中一条调用一次否则会重复填充。填充完成后用is_closed验证是否已水密。triangulate_hole的本质是把边界多边形做耳切并生成补丁三角形补出来的面是与边界大致共面的平面补片对曲率大的洞会明显凹陷。补救办法补洞后对新增补丁区域做平滑而且只平滑补丁区域不要把原模型表面也磨了。先记录补洞前的顶点集合再对新增顶点做几轮拉普拉斯平滑是常见做法。4.2 模型偏置膨胀先算最小特征尺寸再选 solid_offset 或顶点位移模型偏置膨胀在工程里通常是为了做装配间隙补偿、磨损件修复、或者给打印模型留余量。它有两条实现路径一条是按顶点法线直接移动每个顶点简单但薄壁处会自交另一条是用 CGAL 的solid_offset它是把网格当成实体表面用体积法在法线方向做等距面稳健但对输入要求高。判断选哪条先估一下模型的最小特征尺寸。求 AABB 最短边、或者对局部区域做几次最近邻距离统计都可以偏置距离不要超过最小特征尺寸的三分之一。超过这个值薄壁结构会被偏置量吞掉顶部位移法直接自交solid_offset 也会报错。// 方式一顶点沿法线位移适合小偏置量、模型厚实 double d 0.05; // 膨胀量 for (auto v : mesh.vertices()) { auto n CGAL::Polygon_mesh_processing::vertex_normal(v, mesh); auto p mesh.point(v); mesh.point(v) K::Point_3(p.x() n.x() * d, p.y() n.y() * d, p.z() n.z() * d); }// 方式二solid_offset适合封闭、无自交的网格 Mesh out; PMP::solid_offset(mesh, out, d); // d 为正为膨胀为负为收缩solid_offset的返回值异常重要它只在网格满足封闭、无自交时才保证成功。我最早用这个接口时不知道有这限制拿一个还有小破面的模型直接跑结果偏置出来的模型缺了一大块检查日志才发现是输入就没通过前置检查。偏置完成后一定要再跑一次does_self_intersect检查输出因为膨胀量过大会把凹槽两侧推向彼此造成新自交这个检查在偏置后是必做的不是可选。5. 避坑排查布尔、补洞、偏置管线上的五个翻车现场5.1 现象布尔运算结果空掉或缺一块布尔运算返回 oktrue 但输出网格只有一个零碎的壳或者 okfalse 直接失败。原因几乎都是输入网格没有真正封闭或者法线指向不一致。一个模型肉眼看着是封闭的但内部可能存在一个极小开口is_closed会明确告诉你。解决布尔之前把三个检查跑齐——is_closed、does_self_intersect、法线方向是否一致。法线不一致的网格把朝内的面反转到统一朝外CGAL 的orient_to_bound_a_volume可以直接处理。5.2 现象三角剖分后出现大量退化三角形剖分之前网格显示正常剖分后突然冒出一批面积接近零的面。原因是输入 STL 里存在重复顶点、共线顶点或者某个多边形面的顶点落在同一条直线上。解决剖分之前先vtkCleanPolyData去重再用remove_degenerate_faces清理阈值不宜给得太大1e-10量级比较安全。如果剖分后依然产生退化面把相关面的点坐标打印出来看多半是源数据本身有问题。5.3 现象偏置后薄壁区域自交模型局部变成一坨模型整体偏置 0.5mm某个薄筋片却鼓出一个尖角自交检查报了几百个相交面。原因是偏置距离大于局部最小特征尺寸薄壁两侧的偏置面互相穿透。解决先求模型最小特征尺寸把偏置量控制在三分之一以内确实需要大偏置量时改用solid_offset的体积法路线它能处理一部分自交情况但也会在极端薄壁处失败。偏置距离要从应用场景倒推而不是贪大。5.4 现象vtkPolyData 转 CGAL 时崩溃或卡死转换大网格时程序直接崩掉或者add_face返回空、网格顶点数骤减。原因通常是输入包含非流形边或顶点数太大导致内存暴涨。非流形边指一条边被三个或更多三角形共用vtkPolyData 不拦这个CGAL 受不了。解决转换前用 vtkFeatureEdges 检测并处理非流形边常用做法是删掉多余的共享面或者补一个极小三角形把拓扑拆开。内存问题则要在 vtk 侧先降采样再转换不要让 CGAL 去扛百万级顶点。5.5 现象骨架提取结果歪七扭八出现一堆毛刺分支骨架提取出来不是预期的一条主干而是四面八方长出刺来。这类问题大多不是骨架算法本身的问题而是输入网格质量太差补洞生成的平面补丁没有曲率信息降采样后又保留了退化三角形骨架收缩时被这些假面干扰。解决骨架提取前的网格要过一遍三角剖分、去退化、至少一轮平滑先用降采样把面数压到合理范围再抽骨架往往毛刺就消失了。这是我踩过最多次的坑现在养成了习惯骨架提取前先做降采样不会错。6. 降采样与骨架提取给整套管线收尾的两个操作与验证6.1 降采样edge_collapse 保持拓扑用保留比例控制规模布尔和补洞都做完之后网格面数通常是原始模型的几倍直接拿去抽骨架很浪费。CGAL 的edge_collapse按边折叠的方式减面会尽量保持拓扑结构比 VTK 的 decimate 更适合作为骨架提取的前置步骤。控制规模用保留比例最直观比如保留百分之三十的面。#include CGAL/Surface_mesh_simplification/edge_collapse.h namespace SMS CGAL::Surface_mesh_simplification; SMS::Stop_below_count_ratio stop(0.3); // 保留 30% 的边 int r SMS::edge_collapse(mesh, stop); // 返回实际折叠边数折叠比例不是一个绝对值要按骨架提取的输入要求来定。面数几十万的模型保留到十万以下就够面数本身只有几万的模型降到一半以下即可。折叠过多会抹平细小凸起骨架会丢失分支。6.2 骨架提取Mean_curvature_flow_skeleton 三步调用与结果验证CGAL 的Mean_curvature_flow_skeleton是网格骨架提取的常用实现原理是不断沿曲率方向收缩网格最终收敛成一组线段。调用分三步构造对象、收缩到收敛、取出折线。#include CGAL/Mean_curvature_flow_skeleton.h CGAL::Mean_curvature_flow_skeletonMesh skel(mesh); skel.contract_until_convergence(); auto polylines skel.polylines(); // 结果折线集合验证骨架质量有一个简单有效的做法把骨架折线的端点坐标与原始模型表面做最近邻距离查询端点落在表面附近是正常状态如果某个端点悬在模型内部很深的位置说明那部分网格拓扑或质量有问题。另外对照模型连通性一个连通实体应该产出连通骨架骨架断裂通常意味着补洞没补全。我做骨架提取时习惯在降采样后先跑一次is_closed确认水密再进骨架流程因为一个细小的破洞会让收缩方向发生偏移骨架就在那个位置分叉。骨架提取参数不是越多越好收敛步数和停止阈值保持默认通常就能得到可接受的结果真正的变量在前面三角剖分、补洞、降采样这三步的质量。我最早拿一个带几十个小凸起的实体去跑骨架结果长成一团刺后来才发现问题出在凸起处的退化三角形把收缩方向带偏了。先降采样再抽骨架结果完全不同。这条管线走到这里从数据互转到骨架提取的每个环节都过了一遍希望帮到你。本文还有配套的精品资源点击获取

相关新闻

雪球网爬虫逆向实战:从抓包定位到签名算法复现

雪球网爬虫逆向实战:从抓包定位到签名算法复现

简介:面向逆向工程与安全研究初学者的雪球网数据接口逆向源码包,聚焦md5__1038参数生成逻辑,并对盼之代售、阿里v2滑动逆向等常见防护协议给出接口分析思路,内容仅供学习交流,抓包数据与敏感地址均已脱敏。压缩包共3个…

2026/10/18 18:25:57 阅读更多 →
Qwen3.8-27B 量化实战:16GB 显存跑 Q4,MLX-LM 配置与显存占用验证

Qwen3.8-27B 量化实战:16GB 显存跑 Q4,MLX-LM 配置与显存占用验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 18:25:57 阅读更多 →
Reflector 7.4.1.179 绿色版:集成 FileDisassembler 与 FileGenerator 的 .NET 反编译实践

Reflector 7.4.1.179 绿色版:集成 FileDisassembler 与 FileGenerator 的 .NET 反编译实践

简介:这是一份面向.NET开发者的反编译工具整合包,主角是经典的.NET Reflector 7.4.1.179绿色注册版,并真正集成了FileDisassembler与FileGenerator两款广受好评的插件,解决了原版只能逐个查看方法、无法批量导出源码的痛点。包内共…

2026/10/18 18:25:57 阅读更多 →

最新新闻

基于Java和RuoYi的进销存二次开发:库存事务与数据一致性实践

基于Java和RuoYi的进销存二次开发:库存事务与数据一致性实践

简介:一套基于Java与RuoYi框架二次开发的KS进销存系统设计源码,面向需要从手工账目转向信息化管理的小型经销商,也适合Java学习者作为企业级项目参考。系统以采购、销售、库存三大核心模块为主线,流程设计贴近小公司日常操作&…

2026/10/18 19:04:12 阅读更多 →
React useState惰性初始化原理与Fiber机制下的性能优化

React useState惰性初始化原理与Fiber机制下的性能优化

前阵子在代码评审里,看到一位同事写了const [list, setList] useState(largeArray.filter(...))。我建议改成useState(() > largeArray.filter(...)),顺便解释这行改动背后是React的Lazy Initialization(惰性初始化)&#xff…

2026/10/18 19:04:12 阅读更多 →
HTML+CSS+JS+jQuery音乐播放器底层原理与生产级实践

HTML+CSS+JS+jQuery音乐播放器底层原理与生产级实践

1. 为什么一个“四件套”音乐播放器&#xff0c;比你想象中更考验基本功我第一次看到“HTMLJavaScriptCSSJQuery实现音乐播放器”这个标题时&#xff0c;下意识觉得&#xff1a;这不就是个入门小Demo&#xff1f;拖个<audio>标签&#xff0c;加几个按钮&#xff0c;绑几个…

2026/10/18 19:04:12 阅读更多 →
微信LBS协议逆向与Python客户端实现指南

微信LBS协议逆向与Python客户端实现指南

简介&#xff1a;这是一份面向安卓逆向开发与Xposed框架实践者的微信附近人数据采集工具源码包&#xff0c;适用于具备Java基础、熟悉Android系统机制及HTTP协议分析的中高级开发者&#xff0c;用于学习Hook技术、客户端通信模拟与多线程数据导出等核心能力。资源共15个文件&am…

2026/10/18 19:04:12 阅读更多 →
STAR-CCM+电池热管理仿真:battery.zip案例全解与避坑指南

STAR-CCM+电池热管理仿真:battery.zip案例全解与避坑指南

简介&#xff1a;STAR-CCM 2021 案例源文件-battery.zip 是一套聚焦电池热管理的CFD仿真案例包&#xff0c;面向从事电动汽车、储能系统热设计及冷却方案优化的中高级STAR-CCM用户。压缩包共18个文件&#xff0c;容量148.71MB&#xff0c;包含5个sim仿真工程、5个x_b几何模型、…

2026/10/18 19:04:12 阅读更多 →
大模型微调实战:交叉熵、参数调节与LoRA的协同机制

大模型微调实战:交叉熵、参数调节与LoRA的协同机制

刚接触大模型微调的开发者&#xff0c;普遍是带着三个词入门的&#xff1a;交叉熵损失、可调节参数&#xff0c;还有LoRA这种高效微调方案。这三个词看起来各自独立&#xff0c;实际是一条链上的三个环节——损失函数是目标&#xff0c;可调参数是旋钮&#xff0c;LoRA是高效拧…

2026/10/18 19:03:12 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →