双相机坐标系标定原理与工程实践:从外参求解到立体校正
双相机坐标系标定这活儿听着像是个纯学术概念但只要你碰过双目测距、机械臂抓取、AGV导航、或者任何需要“两个眼睛”配合感知的视觉项目早晚要跟它正面交锋。说白了单相机标定解决的是“这一个相机看到的图像怎么换算成空间坐标”而双相机坐标系标定要解决的是两个相机各自看到的世界怎么拼成一个统一的世界——左眼看到的点和右眼看到的点到底怎么对应左相机坐标系和右相机坐标系之间隔了多远、转了多少度。这篇文章就从实际工程角度把双相机坐标系标定的原理、操作流程、以及我自己踩过的坑一起理一遍适合正在做双目视觉、手眼标定、或者相机与雷达联合标定的朋友参考。1. 双相机坐标系标定到底在标什么1.1 从一个具体的应用场景说起我最早认真研究这个是做一个双目测距的活儿。两个工业相机固定在一个横梁上需要测量前方目标物体的三维坐标和距离。刚开始以为只要把两个相机的内参标好就行结果发现左右两幅图像里的同一个特征点根本对不上——同一个螺丝孔在左图里位于中心偏右在右图里却偏左更多而且不同距离下偏差还不一样。折腾几天后终于明白内参解决的是单个相机的“成像畸变”而要把左右相机拉进同一个坐标系必须把两个相机之间的相对位置和角度关系测出来。这个相对关系就是双相机坐标系标定的核心产物——旋转矩阵R和平移向量T。类似场景其实远不止双目测距。手眼标定里机械臂末端坐标系和相机坐标系之间需要确定R和T自动驾驶里摄像头和激光雷达联合标定本质也是在求多个传感器坐标系之间的变换关系甚至产线上常见的九点标定也是在二维平面上建立像素坐标和机械坐标的映射。这些任务形态各异但底层的数学含义是相通的把一个坐标系下的点变换到另一个坐标系下需要的无非就是一个旋转加一个平移。1.2 坐标系之间的“桥梁”内参、外参、畸变聊到坐标系变换必须先把相机模型捋清楚。一个三维空间点要变成图像上的像素坐标要经历三次变换世界坐标系到相机坐标系外参决定、相机坐标系到图像物理坐标系针孔投影决定、图像物理坐标系到像素坐标系内参中的焦距和主点决定。内参矩阵长这样fx 0 cx 0 fy cy 0 0 1fx、fy是焦距单位是像素cx、cy是光轴中心主点在像素坐标系下的位置。畸变系数一般是五个径向畸变k1、k2、k3和切向畸变p1、p2。外参则是相机坐标系相对世界坐标系的旋转和平移。双相机标定里通常把左相机坐标系当作基准右相机相对左相机的变换矩阵就是双目的外参。这个外参一旦标定出来左右相机就算是“绑定”到一个统一的坐标系里了。以后不管相机装在哪里只要相对位置不变这个外参就能一直用。1.3 为什么不能只看单目标定结果这是很多新手栽跟头的地方。单目标定做完每个相机都能单独把像素点还原成该相机坐标系下的射线方向但两个相机各自的世界坐标系根本不是同一个——除非两个相机摆放位置完全相同这不现实。双相机系统里更合理的做法是把两个相机的内参、畸变一起参与优化同时求出一个能最小化左右重投影误差的R和T。单独标定两个相机再分别求世界坐标误差会叠得很难看。举一个直观的类比你左眼看世界右眼看世界看到的都是同一个场景但你的左眼和右眼之间有大约6厘米的眼距。大脑知道这个眼距信息所以能把两幅图像融合出深度感。双相机外参R和T就是给机器“大脑”提供的眼距和角度信息。2. 核心原理从针孔模型到对极几何2.1 针孔模型与张正友标定法回顾张正友标定法是目前最普及的相机标定方案它用一个平面棋盘格或圆点阵列板在不同姿态下成像通过单应性矩阵约束来求解内参和外参。核心思想是平面标定板上的特征点在世界坐标系下坐标已知一般把Z0它们在图像上的投影与像素坐标之间构成一个单应矩阵H而H K * [r1, r2, t]。通过多张不同姿态的图像利用旋转向量正交性约束就能解出内参K。这个方法最妙的地方在于它不需要昂贵的三维标定块一张打印出来的棋盘格用在不同角度拍20张图就能用。我在实际中用的就是A4纸打印的棋盘格贴平板上配合OpenCV的findChessboardCorners和calibrateCamera单目标定的重投影误差都能控制在0.1像素以内。不过打印的标定板有个前提——纸必须贴得很平否则标定板本身的褶皱会直接变成误差源。2.2 双相机外参标定的数学本质双目标定在单目基础上多了一步同时观察同一个标定板分别得到左右相机各自的外参左相机相对标定板的位姿、右相机相对标定板的位姿。因为同一个标定板在两个相机看来有各自的变换矩阵而标定板自身是一个刚体所以左右相机之间可以通过“等式联立”求出相对变换假设标定板坐标系为W左相机坐标系为L右相机坐标系为R。左相机相对标定板的外参是T_W-L右相机相对标定板的外参是T_W-R那么左相机和右相机之间的变换就是T_L-R T_W-R * (T_W-L)^(-1)用每张图片都能算出一个R和T但单张图片总有噪声所以实际用多张图像联立优化最终得到使重投影误差最小的R和T。这个优化过程OpenCV的stereoCalibrate已经封装好了但它内置的优化策略对初始值、标志位的选择仍然敏感后面我会讲到参数怎么配。另外要提一下本质矩阵E和基础矩阵F。在没有标定板的场景下我们可以通过左右图像上的匹配点对来估计这两个矩阵再分解出R和T。E t^ * R本质矩阵只和内参无关的归一化坐标有关F K^(-T) * E * K^(-1)基础矩阵直接作用在像素坐标上。8点法或5点法就是干这个的。不过工程实践里用标定板做双目标定比纯靠特征点匹配更稳定因为标定板提供的点对分布更可控、精度更高。2.3 立体校正让两幅图像“水平对齐”双目标定完成后还有一个非常关键的后续步骤——立体校正。校正的目的之一是把左右相机图像重新投影到一个共同的平面上使得同一特征点在两幅图像上的纵坐标一致行对齐这样后续的立体匹配和视差计算就能在一维搜索空间内完成大幅降低计算量。这一步用的是Bouguet算法把右相机相对左相机的旋转矩阵R分解成两半左相机转一半、右相机转一半使两个光轴方向平行然后再构造一个使极点移到无穷远的矩阵让极线水平。OpenCV里通过stereoRectify和initUndistortRectifyMap生成左右两个映射表再用remap完成图像变换。我提醒一句立体校正后的图像“看起来”像是一个平移相机拍摄的但前提是原始标定结果足够准。如果标定外参偏了校正后左右图像的行对齐会失败视差图上会出现明显的横向条纹或空洞这时候别急着调匹配算法的参数回头重新检查标定结果更高效。3. 实操流程OpenCV双目标定全记录3.1 标定板选择与图像采集要点先聊标定板。我日常工作里用过棋盘格、圆点阵列板、以及Charuco板。棋盘格OpenCV检测稳定角点定位精度高。打印方便。但对遮挡敏感边缘不完整时容易失败。圆点阵列板对运动模糊更鲁棒工业场景常用。但圆心提取在透视变形明显时会有系统偏差。Charuco板结合了棋盘格和ArUco码的优点允许部分遮挡适合大视野和标定板不能完整入镜的场景。图像采集是整个标定流程中决定成败的一环。我的建议准备20~30对不同姿态的左右图像对不要少于15对。保证标定板在画面中占据1/4到1/2以上的面积太小会导致角点亚像素定位不稳。姿态要“全”正对、左右倾斜、上下倾斜、远近交错都要有。正对图像可以有但不能全是正对。调整光源避免反光棋盘格白格过曝会导致角点周围梯度失真。两个相机必须同步采集或者场景静止否则左右图像不是同一时刻的位姿外参解算必然失败。如果两个相机是异步触发而场景中有人走动那采集过程就得特别小心。我曾经在实验台上做标定旁边同事走动导致同一组图像里标定板在一张图中是清晰的、另一张图中带了残影最后标出来的外参明显异常。后来改用同步触发信号硬件线连或者同一个软件触发源才把这个问题根治。3.2 代码实现检测角点、标定、校正我用OpenCV C和Python都跑过下面以Python为例把核心链路捋一遍。假设左右相机图像路径分别存在left/和right/目录下图像名为1、2、3...共N对。第一步读取图像并检测棋盘格角点import cv2 import numpy as np # 棋盘格内角点数不是格数 pattern_size (9, 6) # 例如9x6个内角点 criteria (cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6) objp np.zeros((pattern_size[0] * pattern_size[1], 3), np.float32) objp[:, :2] np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) obj_points [] # 世界坐标系下的棋盘格角点 left_points [] # 左图像角点 right_points [] # 右图像角点 N 25 for i in range(1, N 1): left cv2.imread(fleft/{i}.jpg) right cv2.imread(fright/{i}.jpg) gray_l cv2.cvtColor(left, cv2.COLOR_BGR2GRAY) gray_r cv2.cvtColor(right, cv2.COLOR_BGR2GRAY) ret_l, corners_l cv2.findChessboardCorners(gray_l, pattern_size, None) ret_r, corners_r cv2.findChessboardCorners(gray_r, pattern_size, None) if ret_l and ret_r: corners_l cv2.cornerSubPix(gray_l, corners_l, (11, 11), (-1, -1), criteria) corners_r cv2.cornerSubPix(gray_r, corners_r, (11, 11), (-1, -1), criteria) obj_points.append(objp) left_points.append(corners_l) right_points.append(corners_r)注意棋盘格的“内角点数”不是格子的数量比如一张8x7格的棋盘格内角点是7x6个。这个搞错后面的所有结果都作废。第二步分别对两个相机做单目标定得到内参K1、K2和畸变系数dist1、dist2。这一步也可以直接用stereoCalibrate的初始值选项CALIB_USE_INTRINSIC_GUESS但更稳妥的做法是先单独标一遍至少可以得到比较可靠的初始内参。ret_l, mtx_l, dist_l, rvecs_l, tvecs_l cv2.calibrateCamera(obj_points, left_points, gray_l.shape[::-1], None, None) ret_r, mtx_r, dist_r, rvecs_r, tvecs_r cv2.calibrateCamera(obj_points, right_points, gray_r.shape[::-1], None, None)第三步双目标定求外参flags 0 flags | cv2.CALIB_FIX_INTRINSIC # 如果你信任单目标定的结果可以固定内参。否则可以用CALIB_USE_INTRINSIC_GUESS做联合优化。 ret_stereo, mtx_l, dist_l, mtx_r, dist_r, R, T, E, F cv2.stereoCalibrate( obj_points, left_points, right_points, mtx_l, dist_l, mtx_r, dist_r, gray_l.shape[::-1], criteria(cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 100, 1e-6), flagsflags )R是右相机相对左相机的旋转矩阵T是右相机相对左相机的平移向量。到这里双相机坐标系之间的变换关系就出来了。第四步立体校正和映射表R1, R2, P1, P2, Q, roi1, roi2 cv2.stereoRectify( mtx_l, dist_l, mtx_r, dist_r, gray_l.shape[::-1], R, T, flagscv2.CALIB_ZERO_DISPARITY, alpha0 ) map1_l, map2_l cv2.initUndistortRectifyMap(mtx_l, dist_l, R1, P1, gray_l.shape[::-1], cv2.CV_32FC1) map1_r, map2_r cv2.initUndistortRectifyMap(mtx_r, dist_r, R2, P2, gray_r.shape[::-1], cv2.CV_32FC1) rectified_left cv2.remap(left, map1_l, map2_l, cv2.INTER_LINEAR) rectified_right cv2.remap(right, map1_r, map2_r, cv2.INTER_LINEAR)3.3 结果验证重投影误差与极线约束标定结束不等于完事重要的是验证结果质量。两个关键指标要盯住第一立体标定的重投影误差。stereoCalibrate返回的ret_stereo就是所有角点投影的平均误差单位是像素。我的经验是良好标定结果通常在0.1~0.3像素之间。如果超过0.5说明图像质量或初值有问题必须排查后重标。第二极线校正效果。把校正后的左右图像并排显示用鼠标或者代码在左图选中一个点找到它在右图对应行上的匹配点观察两者纵坐标差。如果校正到位任意匹配点的纵坐标差应该在1像素以内。我通常会批量取几十个点做统计画出纵坐标差的直方图比肉眼观察靠谱得多。另外还可以用Q矩阵stereoRectify输出的深度映射矩阵把校正后的视差图转成三维点云和标定板的实际几何尺寸做对比。比如标定板是30cm的算出来的尺度对不对基本能判断平移向量的单位是否正确。对双目标定给的T没有绝对尺度信息——它是以标定板方格边长作为尺度基准的所以拍标定板时方格的实际物理边长必须测量准确否则三维重建出来就是个“缩了水”或“放大了”的世界。4. 衍生场景双相机与其它传感器的坐标系关系4.1 手眼标定相机装在机械臂上双相机坐标系标定的思想一旦吃透扩展到其它传感器就顺了。最常见的扩展是手眼标定。机械臂末端装一个相机眼在手上或相机固定在某处看机械臂眼在手外需要求相机坐标系和机械臂末端坐标系或基座坐标系之间的变换。数学形式是AX XB——A是机械臂末端在两次位姿之间的相对变换B是相机在两次位姿之间观察到的标定板相对变换X就是我们要求的手眼矩阵。我接触过的方案里opencv有calibrateHandEye接口支持Tsai、Park等经典解法。此外还有easy_handeye这个ROS包可以半自动完成数据采集和求解。但实际用起来有几点要格外注意机械臂位姿变化要“有旋转有平移”如果只是纯平移或纯旋转方程会退化——这一点和双目标定里“标定板姿态要全”是同一个道理。标定板固定在机械臂工作空间内不能动。相机每次变换位姿后标定板要完整出现在视野里。机械臂末端的位姿精度直接影响手眼标定结果如果机器人绝对定位误差大手眼标定结果也会很飘。4.2 双相机与IMU、激光雷达联合标定多传感器融合是现在智能设备的大趋势相机和IMU、激光雷达的外参标定其实也是“坐标系变换”问题只不过变换关系发生在异构传感器之间。比如视觉-激光雷达联合标定常见的方案是Autoware里的calibration_camera_lidar工具以及lidar_camera_calibration这类开源包。核心做法是把棋盘格放在激光雷达和相机共同视野中激光点云上拟合出标定板平面同时相机图像上检测标定板角点通过点-面对应关系或平面-平面对应关系求解相机坐标系到雷达坐标系的R和T。相机-IMU标定如Kalibr、IMU-Camera Calibration需要采集连续运动数据利用视觉特征和IMU积分的一致性来估计相对位姿以及IMU的零偏、尺度等。这种标定比纯视觉标定更复杂但它解决的问题还是同一件事——把一个坐标系下的观测映射到另一个坐标系下。我说得直白一点你把这套坐标系变换的思想装进脑子里以后遇到任何“A设备和B设备数据怎么对齐”的问题第一反应就会是先查它们的外参标定流程而不是一头扎进匹配算法里调参。4.3 工程简化技巧九点标定与旋转中心标定在纯2D平面场景比如桌面抓取、丝网印刷定位不用搞复杂的双目标定用九点标定就够了。本质上是建立像素坐标系到运动平台坐标系的二维仿射或透视变换关系。做法很简单在运动平台的机械行程范围内均匀取九个点机械手/平台移动到每个点时记录机械坐标同时相机识别该点得到像素坐标然后用cv2.estimateAffine2D或findHomography求解变换矩阵。这里有一个很多人忽略的细节如果相机固定不动、平台运动完成取点那么相机和平台的相对位置必须始终保持平行否则不同高度下变换矩阵不一样。而如果相机装在运动轴Z轴上那还要先做旋转中心标定——在某些视觉引导的贴合设备上相机随旋转轴转动必须知道旋转中心在像素坐标系下的位置否则角度补偿根本无从谈起。我建议凡是涉及旋转轴、平台运动、机械臂抓取的视觉项目先想清楚到底有几个自由度需要标定再选择对应的标定方案。双目标定不是万能的但坐标系变换的思想是贯通的。5. 常见问题与避坑实录5.1 重投影误差大先查图像再查初值标定结果误差大最常犯的错是把锅甩给算法其实问题往往出在数据上。我把排查顺序固定为图像是否清晰运动模糊、失焦、压缩失真都会导致角点亚像素定位偏。标定板是否平整贴在不平的板子上棋盘的直线都弯了标定自然不行。图像数量够不够、姿态全不全20张几乎相同角度的图等价于只有1张有效姿态。角点检测是否全部准确把每个检测到的角点画出来人工扫一遍比看任何数值都直观。初值是否合理双目标定如果选择联合优化内参初值乱给会收敛到局部极小。5.2 立体校正后图像扭曲严重校正后图像如果边缘扭曲得很厉害通常是alpha参数设得不对。stereoRectify的alpha参数控制校正后图像保留的像素范围alpha0只保留有效区域图像被裁剪得多alpha1保留所有像素黑边较多。如果你后续还要用校正图做特征提取alpha0更合适如果你要可视化或确保不丢失边缘信息alpha可以设到0.5~1。另外还要检查是不是内参标定不准导致的。如果畸变校正不彻底校正后图像里的直线还是弯的那问题根源在单目标定阶段而不是立体校正阶段。5.3 一张速查表我常用的标定参数和判断标准检查项合格参考不合格时优先排查单目重投影误差 0.1像素图像模糊、标定板不平、角点检测错双目标定重投影误差 0.3像素初值、图像同步性、内参是否可靠立体校正行对齐误差 1像素外参R和T偏差、畸变参数不准深度尺度与真实尺度误差 2%标定板方格尺寸测量不准左右图像亮度一致性差异不可过大曝光时间、光圈不一致采集参数不影响外参但影响匹配这张表不是教科书标准是我长期实践下来的工程经验值。不同项目精度要求不一样比如高精度测量可能要求重投影误差低于0.05像素而普通的视觉定位系统0.3像素也能用。关键是建立“标定结果需要量化评估”的意识而不是拿起来就跑。5.4 关于标定的几条经验心得标定做得多了自然有几个体会。第一条标定板方格尺寸一定要测准。很多项目里用的是打印棋盘格打印完直接拿尺子量方格边长量出来的值差个1毫米重建出来的尺度就跟着差1毫米。如果你需要高精度尺度建议用工业级玻璃陶瓷标定板或者用激光测距仪精确测量。第二条两个相机的视野重叠区域决定了可用范围。双目标定的区域只在两相机共同可视的区域内可靠。超出重叠区就算有外参两个相机各自看到的点也无法形成有效匹配。所以安装相机时要根据工作距离算好基线长度和视场角。第三条环境温湿度会影响标定稳定性。工业相机装在金属架上温度变化会导致机械结构微小变形标定参数就会偏移。我见过一个项目白天标完晚上工艺现场温度降了十几度系统精度直接掉了。这种场景下要么选择热稳定系数好的安装支架要么定期重新标定。结尾一个小技巧最后分享一个我后来一直沿用的习惯标定完成后把R和T保存成配置文件同时把当时的环境信息相机型号、镜头焦距、安装距离、标定板方格尺寸一起记录。这样现场如果出了精度问题我能很快判断是环境变了、镜头动了、还是参数文件被误改。标定这件事一次搞定不难难的是让标定结果在真实产线上持续可靠——多留一份记录就能少一次返工。

相关新闻

雪球行情接口实战:从协议拆解到Python量化监控脚本

雪球行情接口实战:从协议拆解到Python量化监控脚本

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

2026/10/4 6:25:24 阅读更多 →
R包XVector报错parallelSlotNames?Bioconductor版本错配排查与修复

R包XVector报错parallelSlotNames?Bioconductor版本错配排查与修复

如果你在加载XVector时撞上这样一行报错:“Found non-S4 generic function ‘parallelSlotNames’ while exporting methods from namespace ‘XVector’”,中文环境里通常显示为“在从名字空间‘XVector’中出口方法时发现了不是S4通用的函数‘parallel…

2026/10/4 6:25:24 阅读更多 →
智能零售柜商品识别数据集:5000张VOC与YOLO双格式实战指南

智能零售柜商品识别数据集:5000张VOC与YOLO双格式实战指南

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

2026/10/4 6:24:24 阅读更多 →

最新新闻

Git分支管理规范:六类分支职责、合并方向与git flow落地指南

Git分支管理规范:六类分支职责、合并方向与git flow落地指南

简介:面向开发团队的Git分支流程开发规范文档,提供了一套标准化的分支管理方案,其核心价值是解决多人在同一仓库协作时的分支混乱与合并冲突问题。资源共包含一个Word文档,压缩包仅239KB,内容精炼,便于随时…

2026/10/4 7:34:03 阅读更多 →
MRAM与Cortex-M7结合:工业设备掉电保护与无限次写入方案

MRAM与Cortex-M7结合:工业设备掉电保护与无限次写入方案

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

2026/10/4 7:34:03 阅读更多 →
C语言多文件链表模块化开发实战

C语言多文件链表模块化开发实战

1. 为什么“多.c文件链表”是C语言工程能力的分水岭刚学完单个.c文件里写个链表,很多人会觉得“不就malloc几个节点、改改next指针嘛”,但真正把链表拆到多个源文件里编译链接,才是从“能跑通”迈向“能干活”的关键一跃。我带过几十个嵌入式…

2026/10/4 7:34:03 阅读更多 →
AI编程工具插件加载失败的根源与解决路径

AI编程工具插件加载失败的根源与解决路径

1. “plugins”不是功能菜单,而是现代AI编程工具的神经突触你点开Cursor、ZCode、Codex这些工具的设置页,看到“Plugins”那一栏时,大概率会下意识把它当成VS Code里那种“装了就能用”的扩展商店——点安装、重启、生效。但实际踩过坑的人很…

2026/10/4 7:34:03 阅读更多 →
MATLAB Arduino支持包本质与协议级故障排查指南

MATLAB Arduino支持包本质与协议级故障排查指南

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

2026/10/4 7:34:03 阅读更多 →
24天16万行代码:用Claude Code从零构建K12教育产品的实战工作流

24天16万行代码:用Claude Code从零构建K12教育产品的实战工作流

1. 先聊聊这个项目到底在做什么24 天,630 次提交,16 万行代码。这三个数字放在一起,任何一个写过代码的人都会先愣一下——平均每天 26 次提交、6600 多行代码产出,而且是在不到一个月的时间里从零搭出一个 K12 教育产品。如果这是…

2026/10/4 7:33:03 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

月新闻

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