双目视觉三维重建:摄像头标定到点云体积计算全流程解析
简介一项聚焦三维重建完整流程的优质项目工程面向计算机视觉、机器人导航及工业测量方向的开发者和学习者覆盖摄像头标定、双目立体校正、视差计算、点云生成与体积计算等关键环节帮助从零掌握双目视觉的技术链路。压缩包体积仅12KB共含5个文件以3个cpp源码文件为主另有1个头文件与1个说明文档分别对应单目标定、立体校正与匹配等核心模块结构紧凑且便于阅读运行。目前已有137人学习作为小巧而完整的技术案例颇具参考价值。项目通过具体案例演示了从相机内外参计算、畸变校正、立体匹配生成深度图到基于点云数据计算物体体积的完整流程代码模块划分清晰配合说明文档可快速复现实验尤其适合需要手写标定与立体匹配算法的进阶学习者。对于材料切割优化、产品容积分析等工业场景也具有直接借鉴意义。1. 三维重建为什么卡在标定从摄像头到点云体积的完整链路做三维重建最容易翻车的地方不是点云算法而是最前面的摄像头标定。很多人把双目相机一接跑完立体匹配后看到视差图还算像样结果测出来的物体体积跟实际差了 30% 以上——问题几乎都出在标定环节内参外参带病、极线校正不到位、Q 矩阵尺度没对齐。这套项目从单目摄像头标定、双目立体校正、视差计算到点云体积统计给出了一条完整的可落地链路。不管你是做毕设需要一套能交付的方案还是工作中要接一个体积测量需求都可以直接照着这条流程搭。标定不是玄学它是后面所有计算的数学前提这一篇就把这条链路拆开讲透。2. 摄像头标定设计内参外参与畸变系数的单目实现摄像头标定是整个三维重建的地基。地基要是歪了后面的立体校正、视差匹配、点云生成全是白算。这一章我们从标定的数学原理出发落到项目里single_calib.h和single_calib.cpp的具体实现上再把标定结果的质量判断方法讲清楚。2.1 标定的数学原理与棋盘格数据准备摄像头标定本质上是在解一个投影方程空间中的三维点 P 经过外参旋转矩阵 R 和平移向量 t变换到相机坐标系再经过内参矩阵 K 投影到像素坐标系。写成齐次坐标形式s * [u, v, 1]^T K * [R | t] * [X, Y, Z, 1]^T内参矩阵 K 包含四个核心参数焦距 fx、fy主点 cx、cy。畸变系数则包括径向畸变 k1、k2、k3 和切向畸变 p1、p2。这些参数共同决定了三维点投影到二维图像上的准确位置。标定板之所以用棋盘格是因为角点检测稳定、相邻格子共面性好能同时约束内参和外参。数据准备这一步直接决定标定成败。我一般会打印一张 9×6 的棋盘格标定板注意 9×6 指的是内角点数量不是格子数量方格边长取 25mm用 A4 纸打印后贴在硬纸板上。采集图像时让标定板出现在画面的四个角落和中心各拍几张同时保证标定板有不同程度的倾斜角度。简单说就是让标定板在相机视场里跑满把畸变最明显的边缘区域也覆盖到。拍个 15 到 20 张就够用了多了反而容易出现模糊帧拖累整体精度。2.2 用 OpenCV 实现单目标定项目里的single_calib模块把标定逻辑独立封装核心流程分三步检测角点、亚像素细化、调用calibrateCamera求解。下面这段代码是标定主流程的关键部分// single_calib.cpp 核心标定流程 std::vectorcv::Point3f objectCorners; std::vectorcv::Point2f imageCorners; std::vectorstd::vectorcv::Point3f objectPoints; std::vectorstd::vectorcv::Point2f imagePoints; // 生成棋盘格三维坐标z 恒为 0单位为 mm for (int i 0; i boardHeight; i) { for (int j 0; j boardWidth; j) { objectCorners.push_back( cv::Point3f(j * squareSize, i * squareSize, 0.0f)); } } for (auto file : imageFiles) { cv::Mat img cv::imread(file); std::vectorcv::Point2f corners; bool found cv::findChessboardCorners(img, cv::Size(9, 6), corners); if (!found) { std::cout 角点检测失败跳过: file std::endl; continue; } // 亚像素细化把角点精度从像素级提升到亚像素级 cv::Mat gray; cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY); cv::cornerSubPix(gray, corners, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(cv::TermCriteria::EPS cv::TermCriteria::COUNT, 30, 0.001)); imagePoints.push_back(corners); objectPoints.push_back(objectCorners); } cv::Mat K, D; std::vectorcv::Mat rvecs, tvecs; double reprojError cv::calibrateCamera( objectPoints, imagePoints, cv::Size(640, 480), K, D, rvecs, tvecs, cv::CALIB_FIX_ASPECT_RATIO);代码里的findChessboardCorners如果返回false最常见的原因就是内角点数量写错。很多人数的时候把格子数当成角点数9×6 的格子数对应的是 8×5 的内角点这里极易踩坑。cornerSubPix的窗口大小设为 11×11迭代 30 次精度阈值 0.001 像素这些参数是经过多次试出来的稳妥值。窗口开太小收敛慢开太大容易被旁边格子干扰。2.3 标定结果的质量评估与参数保存calibrateCamera返回的重投影误差是衡量标定质量的最直接指标。这个数值的含义是把标定板的三维角点重新投影回图像平面与检测到的角点之间的平均像素距离。我的经验判断标准是重投影误差低于 0.3 像素这套标定参数是健康的0.5 像素左右勉强能用超过 1 像素就别往下走了重新采集标定图像更省时间强行用下去后面全是坑。标定结果需要保存下来供后续双目标定使用通常的做法是用cv::FileStorage写成 yml 格式把内参 K、畸变系数 D 和图像尺寸一起存进去。这里有一个容易被忽略的点保存的图像尺寸必须和采集图像的尺寸严格一致否则后面立体校正时initUndistortRectifyMap拿到的映射表尺寸对不上校正出来整个画面都是歪的。我一般会在 yml 里额外存一行image_size字段加载时做个校验省得后面排查半天。3. 双目立体校正与视差极线约束下的匹配计算单目标定拿到的是左右相机各自的内参和畸变但三维重建需要的是左右两幅图之间的几何关系。这一章处理双目标定、立体校正和视差计算对应项目里的stereo_calib_match.cpp。核心思路是把左右图像校正到同一个平面上让对应的像素点落在同一条水平线上这样视差搜索就从二维降到了二维匹配效率和精度都大幅提升。3.1 双目标定与立体校正原理双目标定的任务是求左右相机坐标系之间的相对位姿即旋转矩阵 R 和平移向量 t。OpenCV 的stereoCalibrate会同时优化左右内参和相对外参输出 R、t、本质矩阵 E 和基础矩阵 F。拿到这些之后stereoRectify会把左右相机分别旋转一半让两个成像平面严格共面且行对齐同时输出左右校正映射矩阵 R1、R2投影矩阵 P1、P2以及重投影矩阵 Q。Q 矩阵是整个立体视觉里的关键角色它长这样Q [1 0 0 -cx_l 0 1 0 -cy 0 0 0 f 0 0 -1/Tx (cx_l - cx_r)/Tx]注意 Q 矩阵第三行第四列和第四行第三列都包含基线长度Tx这个值直接决定了后面深度计算的尺度。如果左右相机的摆放顺序和代码里的顺序不一致Tx会变负导致算出来的深度全部为负值。这个问题在第四章的避坑清单里会重点展开。立体校正的实际操作是先用stereoRectify拿到映射矩阵再用initUndistortRectifyMap分别生成左右图的映射表最后用remap把原始图像重采样到校正后的坐标。这一套流程跑完左右图像上同一物体点的像素行坐标应该一致这就是极线约束。3.2 立体匹配从 SGBM 到视差图立体匹配的目标是在校正后的左右图上找到对应像素计算视差。项目里用的是 OpenCV 的StereoSGBM它基于半全局匹配算法兼顾速度和精度。下面这段代码是 SGBM 参数配置和视差图生成的标准写法// stereo_calib_match.cpp 立体匹配核心配置 cv::Ptrcv::StereoMatcher sgbm cv::StereoSGBM::create( 0, // minDisparity 最小视差通常为 0 96, // numDisparities 视差搜索范围必须是 16 的倍数 9, // blockSize 匹配窗口大小取奇数 8 * 9 * 9, // P1 视差平滑惩罚项控制小幅度视差变化 32 * 9 * 9, // P2 视差平滑惩罚项控制视差不连续 1, // disp12MaxDiff 左右一致性检查最大差异 63, // preFilterCap 预处理滤波截断值 10, // uniquenessRatio 唯一性比率 100, // speckleWindowSize 斑点滤波窗口 2, // speckleRange 斑点滤波范围 cv::StereoSGBM::MODE_SGBM); cv::Mat disp16, disp8; sgbm-compute(leftRectified, rightRectified, disp16); disp16.convertTo(disp8, CV_8U, 1.0 / 16.0);SGBM 这里有一堆参数但真正需要反复调的就三个numDisparities、blockSize和P1/P2。numDisparities决定能测到的最远距离范围越大能测的深度越远但计算量也线性增长blockSize越大视差图越平滑但物体边缘会被糊掉P1、P2控制视差平滑度P1 太小会产生大量噪点P2 太大会把细小的深度变化全部抹平。我的经验是先固定numDisparities96、blockSize9把视差图跑出来看效果再根据场景纹理丰富程度微调 P1/P2。disp16是 SGBM 输出的定点格式视差图真实视差值需要除以 16。这一步很多人会忘直接用disp16当视差拿去算深度结果深度全部缩小 16 倍测出来物体变小一大圈——这种低级翻车在实际调试里非常常见。3.3 视差转深度与 Q 矩阵的尺度关系视差图算出来之后深度和视差的关系是反比depth f * b / disparity其中 f 是焦距b 是基线长度。这就是为什么标定精度如此重要——如果标定得到的焦距偏离真实值 1%最终深度测量误差也会放大约 1%而体积是三维尺寸的乘积误差会被放大到三次方量级。用 OpenCV 的reprojectImageTo3D可以直接把视差图加 Q 矩阵重投影为三维点云省去手写深度公式。但这里有个单位陷阱如果标定时的棋盘格边长用的是毫米那么 Q 矩阵里的焦距和基线单位也是毫米生成的Point3f坐标单位就是毫米。后面算体积的时候如果混用了厘米和毫米体积结果会差 1000 倍。这就是为什么我说标定和重建的每个环节都要盯紧单位单位错了比算法错了更致命。4. 点云生成与体积计算从视差图到可量测的三维模型拿到视差的深度信息后三维重建进入最后一段生成点云并从点云计算出物体体积。项目里的test.cpp把这段流程串了起来从重投影到点云去噪再到体积统计。这一章的关键是理解点云里每个点是怎么来的以及体积计算的方法选择如何直接影响最终结果的可靠性。4.1 点云生成与预处理reprojectImageTo3D是生成点云最直接的入口它把视差图里的每一个像素结合 Q 矩阵还原出一个三维坐标点// test.cpp 中三维点云生成流程 cv::Mat points3D; cv::reprojectImageTo3D(disp8, points3D, Q, true); std::vectorcv::Point3f cloud; for (int row 0; row points3D.rows; row) { for (int col 0; col points3D.cols; col) { cv::Vec3f pt points3D.atcv::Vec3f(row, col); // 剔除无效点z 为最大值表示该处视差无效 if (pt[2] 10000 || pt[2] 0) continue; cloud.push_back(cv::Point3f(pt[0], pt[1], pt[2])); } }生成后的点云通常带着两类噪声一类是视差无效区域产生的离群点z 值异常大或负另一类是物体边缘由于遮挡产生的飞点。第一步过滤掉 z 轴无效值是必须的第二步我一般会加一个统计滤波计算每个点的 k 近邻平均距离距离超过全局均值加两倍标准差的点直接干掉。这套预处理做完点云才具备体积计算的资格。注意reprojectImageTo3D的第四个参数设为true表示把无效像素点的坐标值置为 10000这个判断阈值可以按场景最大测量距离调整。4.2 体积计算的三种方法与选型思路点云体积计算没有一个通用的标准答案不同物体形态要用不同方法这是整个方案里最需要结合实际需求判断的地方。第一种是轴对齐包围盒法直接算出点云在 x、y、z 三个轴向上的最大值和最小值体积就是三个轴向长度的乘积。这个方法只适合测量长方体之类的规则物体任何倾斜摆放都会导致体积偏大而且点云里只要混入一个离群点包围盒就被撑大一圈。第二种是凸包法用三维凸包算法求出包裹点云的最小凸多面体体积由多面体顶点组成的三棱锥累加得到。这个方法适合类球状、块状的凸物体但对表面有明显凹陷的物体凸包会把凹陷部分填平体积偏大。第三种是体素法把包围盒空间划分成均匀的三维网格统计被点云占据的体素数量乘以单位体素体积得到结果。这个方法最接近真实的离散体积概念对凹物体也能处理是工程里用得最多的做法。代价是要选好体素分辨率——太粗会把精细结构淹没太细会让噪声点贡献虚假体积。我一般会在方案里同时算凸包体积和体素体积两个结果做个交叉验证。如果两者差异超过 10%说明点云质量或者体素参数出了问题先回头检查点云预处理而不是急着改算法。这种双保险思路遇到答辩提问时也很有说服力。4.3 体素法的体积计算实现下面这段代码是体素法体积计算的关键实现思路清晰且可以直接复用// test.cpp 体素法体积计算 double computeVolumeByVoxel(const std::vectorcv::Point3f cloud, float voxelSize) { if (cloud.empty()) return 0.0; // 先求点云包围盒 float minX 1e9, minY 1e9, minZ 1e9; float maxX -1e9, maxY -1e9, maxZ -1e9; for (auto p : cloud) { minX std::min(minX, p.x); maxX std::max(maxX, p.x); minY std::min(minY, p.y); maxY std::max(maxY, p.y); minZ std::min(minZ, p.z); maxZ std::max(maxZ, p.z); } int nx (int)std::ceil((maxX - minX) / voxelSize); int ny (int)std::ceil((maxY - minY) / voxelSize); int nz (int)std::ceil((maxZ - minZ) / voxelSize); std::vectorchar occupied(nx * ny * nz, 0); int count 0; for (auto p : cloud) { int ix (int)((p.x - minX) / voxelSize); int iy (int)((p.y - minY) / voxelSize); int iz (int)((p.z - minZ) / voxelSize); // 防止索引越界 ix std::min(ix, nx - 1); iy std::min(iy, ny - 1); iz std::min(iz, nz - 1); int idx iz * nx * ny iy * nx ix; if (!occupied[idx]) { occupied[idx] 1; count; } } return count * voxelSize * voxelSize * voxelSize; }体素尺寸的选取是这段代码的成败关键。我把点云里所有相邻点的间距做个统计取中位数的两倍作为voxelSize这样既能覆盖点云疏密不均带来的空洞又不至于把细节全抹平。如果点云平均点距是 2mm体素取 4mm 左右比较稳妥。代码里的索引计算用了一维数组展开的写法比三维 vector 省内存点云规模大的时候性能差异很明显。最终算出来的体积单位由点云坐标单位决定毫米坐标算出的体积是立方毫米除以 1000 才是立方厘米。5. 常见问题与排查标定和重建中最容易翻车的五个点这套流程我从头到尾跑过很多遍每一步都有踩坑的记录。这一章把最容易翻车的五个场景写出来每个按现象 → 原因 → 解决的排查思路展开照着查比自己瞎试效率高得多。5.1 棋盘格角点检测一直失败现象findChessboardCorners频繁返回false能用于标定的图像数量凑不够导致标定结果不稳定。原因最常见的是boardSize设置的内角点数量和实际棋盘格对不上。9×6 的格子对应内角点是 8×5很多人直接写成 9×6 就会持续报错。另一个原因是曝光过度或反光让角点对比度太低检测算法找不到角点。解决先数清楚棋盘格的行列格子数然后各减一填入cv::Size。拍摄时避免强反光标定板稍微压低曝光让黑白格子边界清晰锐利。如果画面里标定板占的面积太小角点像素距离过近也会失败确保标定板长度至少占画面宽度的四分之一。5.2 立体校正后图像边缘黑边和扭曲严重现象remap之后的左右图像在画面边缘出现大面积黑色区域或者物体线条明显弯曲变形。原因畸变系数拟合过度。标定采集时如果标定板总在画面正中央边缘区域的畸变约束不足拟合出的 k1、k2 会偏离真实值导致校正时边缘被过度拉伸或压缩。解决重新采集标定图像时专门让标定板出现在画面的四个角落让边缘区域的畸变信息参与拟合。这个操作看起来不起眼但往往能让黑边范围缩小一大半。如果畸变真的太大可以考虑提高标定板拍摄张数到 20 张以上。5.3 视差图大面积空洞物体边缘全黑现象生成的点云在物体边缘有大片空白视差图上对应位置像素值为 0。原因SGBM 的blockSize设得太大导致边缘区域的匹配窗口跨越了前景和背景视差搜索失效或者numDisparities太小视差范围没覆盖到物体的实际视差范围。解决把blockSize从 9 往下调到 5 或 3边缘会清晰很多。同时把numDisparities调大直到视差图的深度范围覆盖场景里的最近和最远物体。调参时坚持每次只改一个参数的原则记下每组参数对应的视差图效果不然出了问题根本不知道是哪个参数拖的后腿。5.4 深度测量尺度和真实距离明显对不上现象物体放在距相机 30cm 的位置测出来的深度是 45cm整体系统地偏大。原因单位混用是最常见的原因。标定棋盘格边长如果用毫米Q 矩阵的基线就是毫米但点云处理和量化分析时有人换成了厘米导致深度整体放大 10 倍。还有一种情况是左右图像的顺序反了Q 矩阵的Tx为负深度变成负数。解决标定、校正、点云三个环节统一用同一种单位。代码里写个常量标注单位比如const float UNIT_SCALE 1.0f; // 1.0 mm防止后面忘记。顺序问题通过打印 Q 矩阵第 4 行第 3 列的符号来检查如果为负交换左右图像顺序重新校正。5.5 体积计算结果比真实值系统性偏大现象标准块的体积用排水法实测是 100cm³点云算出来是 120cm³误差稳定在 20% 左右。原因点云预处理不够干净。背景点没有剔除干净或者离群点滤波的阈值放太宽一个飞点就可能把包围盒撑大凸包体积也会被少数远点拉大。解决先按深度范围裁剪点云只保留目标物体所在的前景区域再做统计滤波把远离主点云的孤立点干掉。体积计算时对比凸包法和体素法的结果如果差异超过 10%先回头处理点云而不是改算法。我通常会用一个已知体积的立方体做标定验证体积误差率控制在 5% 以内才认为流程是可靠的。6. 验收与答辩怎么证明你的三维重建流程可靠方案做到最后能不能让人信服取决于你拿什么指标来验收。裸跑一遍流程说效果不错没有说服力得量化。我这里给一张验收表每一项目标值都来自实际工程经验照着测就行。验收环节我一般会放一个已知尺寸的立方体标准件放在相机前方 300mm 处分别测深度和体积。几项核心指标如下验收指标目标值测量方法单目标定重投影误差 0.3 像素calibrateCamera返回结果立体校正极线残差 1 像素校正图对应特征点行坐标差300mm 处深度测量误差 2mm与卷尺/激光测距仪对比标准件体积误差率 5%与排水法/精密量具对比答辩时的状态和你平时调试的状态完全不同被问到体积误差哪来的如果你答不上来前面说的一切都会被怀疑。我常用的一个应答思路是把误差来源拆成三块标定残差带来深度误差深度误差在体积上是三次方放大立体匹配对视差值按整数像素做离散化深度精度天然受限体素法本身是对连续体积的离散近似分辨率越粗误差越大。这样拆开讲导师或评审会觉得你对方案的理解是透的而不是碰巧调通了参数。如果再被追问体素分辨率怎么定我的回答口径是点云的平均点距中位数乘以 2 作为体素边长这个值兼顾了噪声抑制和细节保留。误差率如果超过了 5%优先检查点云预处理其次再考虑减小体素。这套排查顺序从系统角度解释了误差来源而不是绕圈子。从那以后我每次做三维体积测量类的项目都强制先走一遍标定自检三件套重投影误差、极线残差、标准件体积比对。三项都过了结果才敢往外拿。希望帮到你也祝你的三维重建项目一次跑通。本文还有配套的精品资源点击获取

相关新闻

从零开始学木作:artcraft完整实践指南,从工具选型到打磨上油

从零开始学木作:artcraft完整实践指南,从工具选型到打磨上油

第一次见到 artcraft 这个名字,是在一张随手拍的工作台照片上。台面上散着刨花和木屑,一把曲线锯压在毛料上,旁边是刚磨完还没上油的半成品。当时我还没想明白,一个天天和文字打交道的人,为什么会在一块木头上耗掉整个…

2026/10/19 11:09:09 阅读更多 →
diagram-design实战:从架构图布局到节点语义的完整设计体系

diagram-design实战:从架构图布局到节点语义的完整设计体系

1. 项目概述:diagram-design 到底在解决什么问题 我最早接触的 diagram 设计,是给某跨平台系统画一张架构图。当时我在某个工作群里扔出第一版草图,结构大概是:前端、后端、数据库各占一块,箭头指向混乱,连…

2026/10/19 11:09:09 阅读更多 →
UiPath调用Python全攻略:RPA与Python脚本集成实践

UiPath调用Python全攻略:RPA与Python脚本集成实践

如果你在UiPath流程里处理过那种套了三层的嵌套JSON,应该能理解我当时想把电脑砸了的冲动——选择器定位还算简单,真正要命的是那几个字符串拆分表达式,正则写了一行又一行,勉强能跑,一换数据格式就全面翻车。后来在一…

2026/10/19 11:09:09 阅读更多 →

最新新闻

Godot 2D游戏开发第5期:打通场景切换、敌人AI与UI音效的可玩闭环

Godot 2D游戏开发第5期:打通场景切换、敌人AI与UI音效的可玩闭环

做2D游戏做到第五期,最容易遇上的状态就是:玩家已经能跑能跳了,但游戏还不像游戏。前四期我们一路把角色动画、基础TileMap关卡、金币收集勉强拼了出来,可一旦想打通从"进入关卡"到"死亡重来"再到"结算展…

2026/10/20 2:36:35 阅读更多 →
AI辅助论文平台全拆解:五类能力画像与六周实战工作流

AI辅助论文平台全拆解:五类能力画像与六周实战工作流

如果你最近在准备毕业论文,一定已经发现:事情的关键往往不是“写不出来”,而是“不知道写到什么程度才算够”。我随手翻过某工科院系33份开题报告,其中24份在资料搜集阶段用过AI辅助工具,但最后能顺利过盲审的只有6份。…

2026/10/20 2:36:35 阅读更多 →
RAG查询优化实战:查询转换与分解提升检索命中率

RAG查询优化实战:查询转换与分解提升检索命中率

做过RAG落地的人应该都有这种体验:检索链路搭好了、向量化了、TopK也调了,但用户一问某些问题,召回结果就是不对味。比如用户问“那个能折叠的蓝牙键盘多少钱”,文档里明明写着“便携式折叠键盘,支持蓝牙连接&#xff…

2026/10/20 2:36:35 阅读更多 →
Coze技能上架全流程:从OpenAPI设计到商店审核与运营实战

Coze技能上架全流程:从OpenAPI设计到商店审核与运营实战

说实话,多数人第一次接触Coze商店里的Skills技能,都是从“用”开始的——在Bot编辑页面挑一个现成技能,填几个参数就完事,完全没想过这东西还能自己造。直到我自己把第一个自用的查询工具封装成技能、提交审核、正式上架之后&…

2026/10/20 2:36:35 阅读更多 →
WinForm医院挂号系统设计与实现:业务闭环驱动的毕设优选方案

WinForm医院挂号系统设计与实现:业务闭环驱动的毕设优选方案

简介:这是一套基于C# WinForm开发的医院挂号管理系统源码,面向.NET初学者与课程设计学习者,解决中小型医疗机构挂号流程数字化、用户权限分级管理及基础数据可视化等实际问题。资源包共185个文件,含64个核心C#业务逻辑与界面代码文…

2026/10/20 2:36:35 阅读更多 →
STM32飞控寄存器级开发:硬实时PID与传感器同步采样实战

STM32飞控寄存器级开发:硬实时PID与传感器同步采样实战

简介:本资源是一套基于STM32微控制器(明确指向F1/F4系列)开发的无人机飞行控制系统完整工程包,面向嵌入式初学者、飞控爱好者及高校电子/自动化专业学生,解决从硬件驱动到姿态控制算法落地的全链路实践难题。压缩包共2…

2026/10/20 2:35:35 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →