尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ZED双目+YOLO目标检测测距:深度图与视差算法避坑
简介面向计算机视觉学习者及机器人、自动驾驶等场景开发者的ZED相机结合YOLO双目测距实践包重点解决立体相机环境搭建、目标检测与深度信息融合测距的落地问题。压缩包共42个文件、约78.97MB以20个Python脚本为核心辅以XML配置、YOLOv4的cfg与weights模型文件、Makefile及说明文档覆盖相机采集、标定、尺寸估计、YOLO推理插件与可视化等模块便于按目录快速定位。已有3016人学习下载说明该方案在同类实践中具有较高参考价值。读者可获得从ZED SDK安装、numpy版本兼容处理、虚拟环境配置到运行测距脚本的完整工程素材也能借助其中的模型配置和工具模块理解检测结果与深度值如何对应适合需要复现双目测距demo、排查环境依赖或扩展自定义类别检测的读者参考。1. 从一帧左目图到一条米数zedceju.py 想解决的问题你手上大概率有个这样的需求摄像头拍到一个目标检测框画出来了老板问“它离我们多远”。检测框能靠 YOLO 给距离就得靠 zed 这类双目相机给。zedceju.py 干的就是把这两件事缝在一起——左目图送进模型拿框框回到深度图上取有效像素换算成米画在画面里。它不神秘但真正跑通的人不多因为中间有坐标系、单位、分辨率三个错位点任何一个没对齐输出就是一条看着像真的一样的假距离。这篇按“装环境—拆主循环—两条距离算法—踩坑—压抖动”的顺序走一遍适合已经能跑通单目检测、想把它升级成测距的从业者也适合刚拿到相机、想把第一版 demo 跑出来的新手。2. 把依赖钉在能跑的组合上ZED SDK、pyzed 与 YOLO 的版本对位2.1 为什么这块最容易翻车双目相机的 SDK 不是纯 Python 包它底层是带 CUDA 加速的 C 库Python 侧只提供一层绑定。也就是说SDK 本体、CUDA 运行时、显卡驱动、pyzed 绑定、Python 解释器版本这五样东西必须同时成立才能import pyzed.sl成功。少了任何一个报错信息通常只有一句ImportError或者DLL load failed看不出根因。我一般会按这个顺序排先确认显卡驱动支持的 CUDA 版本再看 SDK 官方说明里支持哪几个 CUDA 大版本装完 SDK 后在 SDK 目录里跑一遍自带示例确认相机能出图最后才回来装 pyzed 和检测模型。反过来做——先装模型再装 SDK——大概率会遇到 OpenCV 版本互相覆盖的问题这中间没有后悔药只能重开一个干净环境。一个常被忽略的点是pyzed 绑定通常跟着 SDK 一起装不在 PyPI 上随便pip install就能拿到对应版本。正确路径是走 SDK 安装包里附带的 Python 模块把它加进PYTHONPATH或者用 SDK 提供的 getter 脚本生成 wheel。有些人直接pip install pyzed装了个来源不明的包结果 API 名字对不上sl.DEPTH_MODE.NEURAL直接抛AttributeError这种血泪经验网上一搜一大把。提示环境里如果同时存在 conda 的系统 OpenCV 和 pip 装的 opencv-python优先保留一个否则cv2.imshow会在某些机器上直接崩进程且不留堆栈。2.2 安装顺序与自检脚本装完之后别急着写业务代码先跑这段自检。它做三件事能不能 import、相机能不能打开、参数能不能读出来。import pyzed.sl as sl # 1) 只打印 SDK 版本验证绑定层可用 print(SDK 版本:, sl.Camera.get_sdk_version()) # 2) 不打开相机先看一眼设备列表避免设备被别的进程占用还不知道 devs sl.Camera.get_device_list() print(检测到设备数:, len(devs)) for d in devs: print( 序列号:, d.serial_number, 型号:, d.camera_model) # 3) 真正打开只抓一帧就关验证管线通不通 zed sl.Camera() init sl.InitParameters() init.camera_resolution sl.RESOLUTION.HD720 init.camera_fps 30 init.depth_mode sl.DEPTH_MODE.PERFORMANCE init.coordinate_units sl.UNIT.METER err zed.open(init) print(打开结果:, err) if err sl.ERROR_CODE.SUCCESS: rt sl.RuntimeParameters() print(首帧 grab:, zed.grab(rt)) zed.close()逻辑说明get_device_list()在不开相机的前提下就能拿到序列号这一步特别适合排查“另一台脚本还挂着相机没释放”的低级问题因为相机被占用时open()的报错经常是模棱两可的。coordinate_units设成米是整篇代码的地基一旦这里设成毫米后面所有阈值都会差 1000 倍而且不容易一眼看出来。参数说明camera_resolution决定后续深度图和左目图的分辨率HD720是 1280×720帧率稳、带宽压力小做实时检测首选camera_fps上限受分辨率和 USB 带宽限制HD1080下 30 帧在部分线材上会掉帧depth_mode从轻到重依次是PERFORMANCE、QUALITY、ULTRA、NEURAL检测场景里PERFORMANCE通常够用切到NEURAL画面更干净但帧率会明显下降。2.3 把 fx 和基线读出来存进配置双目测距的核心只有三个量焦距像素值 fx、基线 B、视差 d。前两个是相机出厂标定好的读一次存起来就行不要每帧去取。info zed.get_camera_information() calib info.camera_configuration.calibration_parameters fx calib.left_cam.fx # 左目焦距单位像素 fy calib.left_cam.fy cx calib.left_cam.cx # 主点 cy calib.left_cam.cy baseline calib.get_camera_baseline() # 基线单位米跟随 coordinate_units print(ffx{fx:.2f} fy{fy:.2f} cx{cx:.2f} cy{cy:.2f} B{baseline:.4f}m) # 顺手算一下常见量程下 1 个像素视差对应多少米方便判断精度瓶颈 for d in (1, 2, 5, 10, 30): print(f视差 {d:2}px - 深度 {fx * baseline / d:.3f} m)逻辑说明left_cam.fx是已经按当前分辨率换算过的像素焦距不是物理焦距所以不能跨分辨率复用。最后那个循环打印的是精度敏感度fx·B/d 这个式子对 d 的偏导是负的平方关系视差 1 像素的误差在近处影响小、在远处被放大得很快这也是为什么远处的框距离数字会跳得离谱不是代码写错了是几何决定的。参数说明baseline单位跟随coordinate_units设成米就是米fx、cx这些值是针对当前camera_resolution的如果你中途改分辨率必须重新读一次。建议把这几行结果打印出来贴进配置常量写死也行但换相机就要改所以我一般写进一个calib.json脚本启动时读。3. 拆主循环取图、检测、测距三段怎么接3.1 初始化InitParameters 里几个必须改的字段zedceju.py这类脚本的骨架其实很短难点全在参数。初始化阶段除了上一章的分辨率和单位还有两个字段值得单独说depth_minimum_distance和depth_stable_threshold。前者决定多近开始不出深度设太小相机的视差搜索范围覆盖不到设太大近处物体全是空洞后者是时域滤波的阈值值越大越稳但延迟越高。import pyzed.sl as sl import numpy as np import cv2 def make_camera(): zed sl.Camera() init sl.InitParameters() init.camera_resolution sl.RESOLUTION.HD720 init.camera_fps 30 init.depth_mode sl.DEPTH_MODE.PERFORMANCE init.coordinate_units sl.UNIT.METER init.depth_minimum_distance 0.3 # 近于这个距离不保证有深度 init.depth_stable_threshold 1.5 # 时域滤波越小越跟手越大越稳 init.camera_disable_self_calib False # 保留自校准温漂大的场景有用 err zed.open(init) if err ! sl.ERROR_CODE.SUCCESS: raise RuntimeError(f相机打开失败: {err}) return zed逻辑说明depth_stable_threshold这个参数很多示例里不写默认值偏保守画面看着稳但目标一动距离就滞后半拍做跟随类应用会明显感觉“拽不动”。做静态测量可以调大做动态跟踪建议压到 1.0 附近。camera_disable_self_calib保持 False是因为相机连续跑几十分钟后温漂会让外参轻微变化自校准能兜住一部分。参数说明depth_minimum_distance具体下限跟机型、分辨率、镜头视场角都有关通常在 0.2 到 0.5 米区间设得比实际能力还小不会报错只会静默返回无效值这一条后面避坑章节还会再提。3.2 grab 与 retrieve 的配对关系运行时对象RuntimeParameters每帧传给grab()成功之后再retrieve各种数据。顺序不能反retrieve拿到的永远是上一次 grab 的结果。rt sl.RuntimeParameters() rt.confidence_threshold 90 # 0-100越高越严格空洞越多 rt.measure3D_reference_frame sl.REFERENCE_FRAME.CAMERA # 点云以左目为原点 img_mat sl.Mat() depth_mat sl.Mat() xyz_mat sl.Mat() while True: if zed.grab(rt) ! sl.ERROR_CODE.SUCCESS: continue # 偶发丢帧直接跳过别在这里 break # 左目图是 BGRA 四通道要用 cv2 转成 BGR zed.retrieve_image(img_mat, sl.VIEW.LEFT) frame cv2.cvtColor(img_mat.get_data(), cv2.COLOR_BGRA2BGR) # 深度图与左目图同分辨率值即斜距无效像素为非有限值 zed.retrieve_measure(depth_mat, sl.MEASURE.DEPTH) depth_np depth_mat.get_data() # 点云用于后验校验可以拿到任意像素的三维坐标 zed.retrieve_measure(xyz_mat, sl.MEASURE.XYZ) xyz_np xyz_mat.get_data()逻辑说明grab失败时用continue而不是break是因为 USB 抖动、曝光突变都会造成单帧失败直接退出会让整个脚本变得极不稳定。MEASURE.DEPTH返回的是每个像素到相机中心的斜距不是 Z 轴深度近距离时两者差异可以忽略超过 5 米后侧向目标的差异会体现出来。MEASURE.XYZ是四通道前三通道是 X/Y/Z第四通道存的是有效性用np.isfinite判空更稳妥。参数说明confidence_threshold从 0 到 100我一般设 85 到 95 之间。设 100 会出现大片空洞设 50 又会把误匹配塞进来导致物体边缘的距离被拉远。这个参数和后面取中位数的策略是搭配的阈值高一点配中位数比阈值低配均值稳定得多。3.3 把 YOLO 的框交给测距函数检测部分没什么特别的就是把 BGR 帧丢给模型取boxes里的xyxy、conf、cls。真正要小心的是坐标对应关系送进模型的是原尺寸帧拿回来的框就是原图坐标可以直接拿去索引深度图如果你为了提速先把帧 resize 到 640 再送模型框就必须按比例还原否则索引到的深度区域会整体偏移。from ultralytics import YOLO model YOLO(yolov8n.pt) # 换成你自己的权重 def detect(model, frame, conf0.4, imgsz640): 返回原图坐标系下的框列表 [(x1,y1,x2,y2,score,cls_id), ...] h, w frame.shape[:2] res model.predict(frame, imgszimgsz, confconf, verboseFalse)[0] out [] for b in res.boxes: x1, y1, x2, y2 b.xyxy[0].tolist() # 内部推理会做 letterbox 缩放这里统一裁回原图边界防止越界索引 x1 max(0, min(w - 1, x1)); x2 max(0, min(w - 1, x2)) y1 max(0, min(h - 1, y1)); y2 max(0, min(h - 1, y2)) if x2 - x1 4 or y2 - y1 4: continue # 太小的框统计不可靠直接丢 out.append((x1, y1, x2, y2, float(b.conf[0]), int(b.cls[0]))) return out逻辑说明model.predict内部会自动做 letterboxres.boxes.xyxy返回的已经是还原到输入图尺寸的坐标所以只要输入图就是原图就不用再自己乘缩放系数。这里额外做了一次边界钳制和最小尺寸过滤是因为还原过程偶尔会在图像边缘产生浮点误差导致的越界值拿去切片会切出空数组后面算中位数就会拿到nan。参数说明imgsz640是速度与精度的折中720p 的图缩到 640 后小目标召回会掉如果目标是远处的人或车建议提到 960 或直接 1280。conf0.4对测距场景比常见的 0.25 更合适——框多一个不影响但框歪了距离就歪了宁可少检几个。4. 距离的两种算法深度图 ROI 中位数与视差反投影4.1 深度图法为什么取中位数不取中心点最直觉的做法是拿框的中心像素去查深度图。这个做法在实验室里能跑在现场必翻车。原因是中心点极易落在背景、遮挡边缘、或者目标自身的无纹理区域上返回 0 或者非有限值。更隐蔽的情况是中心点刚好落在两块深度之间取到一个“介于物体和背景之间”的中间值看起来合理其实是错的。我一般用 ROI 收缩加中位数把框按比例往里收避开边缘再对有效像素排序取中间那个。def roi_depth(depth_np, box, shrink0.6, min_valid20): depth_np: HxW 的深度图米 box: (x1,y1,x2,y2) shrink: 收缩后保留的宽高比例0.6 表示四周各丢掉 20% min_valid: 有效像素少于这个数就认为测距失败 返回 (距离, 有效像素数, 四分位间距) x1, y1, x2, y2 [int(round(v)) for v in box] w, h x2 - x1, y2 - y1 if w 0 or h 0: return None, 0, None dx int(w * (1 - shrink) / 2) dy int(h * (1 - shrink) / 2) roi depth_np[y1 dy: y2 - dy, x1 dx: x2 - dx] valid roi[np.isfinite(roi)] valid valid[valid 0] if valid.size min_valid: return None, int(valid.size), None med float(np.median(valid)) q1, q3 np.percentile(valid, [25, 75]) return med, int(valid.size), float(q3 - q1)逻辑说明shrink0.6意味着只保留框中心 60%×60% 的区域四周各丢 20%这一步对细长目标人、柱子效果最明显因为框的左右边缘几乎必然跨到背景上。返回的四分位间距 IQR 是个很好用的置信度指标IQR 小说明这块区域深度一致测距可信IQR 大说明框里混了前景和背景这时候即使中位数看着正常也应该降权或者直接标记为不可信。参数说明min_valid20是个经验下限720p 下 20 个有效像素已经能做统计了目标很小或者距离很远时有效像素可能只有个位数这时候中位数没有意义宁可不报距离。shrink不要低于 0.4收得太狠会让小目标的 ROI 变成几个像素反而更不稳。4.2 视差法Z fx·B/d 的适用边界深度图本质上是 SDK 自己算完视差之后的结果所以自己再算一遍视差主要是两个用途一是想理解数字怎么来的、出问题时能定位二是想在特定 ROI 上用更严格或更宽松的匹配策略做交叉验证。def disparity_from_depth(depth_m, fx, baseline): 由深度反推视差用于把两路结果放在同一个量纲上比较 with np.errstate(divideignore, invalidignore): d fx * baseline / depth_m return d def depth_from_disparity(disp_px, fx, baseline): Z fx * B / d d 单位像素结果单位跟随 baseline if disp_px 0.1: return None # 视差趋零深度发散直接判无效 return fx * baseline / disp_px # 交叉验证用深度图中位数反推视差再看这个视差是否落在合理区间 med, n, iqr roi_depth(depth_np, box) if med is not None: d_px fx * baseline / med print(f深度 {med:.2f}m - 等效视差 {d_px:.2f}px, IQR{iqr:.3f})逻辑说明fx * baseline / med这个反推值有两个用处。其一如果算出来的视差小于 1 像素说明目标已经很远此时 1 像素的量化误差就会造成几十厘米的深度误差这个距离数字不该被当真。其二把这个值和 SDK 内部视差图在同一个 ROI 上的中位数比一比差异过大就说明深度图那块有填充或插值不是原始匹配结果。参数说明disp_px 0.1这个门槛挡住的是“深度趋近无穷”的情况。公式里 d 在分母一旦匹配失败返回 0深度就变成inf很多脚本在这里不做判断结果画面上出现一个巨大的距离数字看着像 bug其实是数学必然。4.3 两条路结果对不上时怎么判实操里经常出现深度图给 2.3 米、自己按视差算给 2.9 米的情况。这时候不要急着改代码按这个顺序查先看 ROI 里有效像素数和 IQR有效像素少或者 IQR 大问题在取点策略而不在公式再看目标区域纹理白墙、玻璃、纯色衣物这些区域双目匹配本来就不可靠深度图里这些位置通常已经被填成邻近值最后看目标是否跨在深度不连续边界上比如人站在门框前框里一半是人一半是门后的走廊中位数会被拉向人少的那个方向。一个实用的判据把上表的三个指标有效像素数、IQR、反推视差一起打印出来连续看 30 帧。三个值都稳定的目标距离数字就可以信只要有任意一个在大幅波动那个距离就是在骗你。指标可信区间3 米内目标异常含义有效像素数大于 200过少说明遮挡或纹理缺失IQR小于 0.15 米过大说明框内混入背景等效视差大于 2 像素过小说明距离接近量程上限帧间跳变小于 5%超出说明检测框在抖5. 避坑排查五条把距离算飞的血泪记录现象一所有目标的距离都是一个固定值比如全是 0.00 米。原因通常是索引错了数组。depth_mat.get_data()返回的数组和img_mat.get_data()尺寸不完全一致——左目图是 BGRA 四通道如果你按frame.shape[:2]取尺寸在某些写法下拿到的是四通道展开后的宽拿去索引深度图就会整体错位正好落在图像外或者恒定区域读出来的就是无效值。解决是把depth_np.shape和frame.shape都打印出来对一眼坐标一律按(height, width)顺序索引切片写成depth_np[y1:y2, x1:x2]别写成[x1:x2, y1:y2]。现象二近处还算准超过 4 米后距离明显偏大而且越大偏得越多。八成是retrieve_image时带了缩放参数。sl.VIEW.LEFT支持传入一个resolution参数很多人为了显示流畅随手传了个 VGA结果左目图变成 672×376深度图还是 1280×720YOLO 在缩略图上出的框被直接拿去索引全尺寸深度图相当于把 ROI 整体往左上角挪了一大截。解决是先统一分辨率要么都不缩要么把框按w_full / w_small的比例还原后再索引。现象三静态目标距离稳如老狗目标一走起来数字就乱跳幅度能到一米。这是检测框抖动传导到测距上。框每帧边界差几个像素ROI 就会在物体和背景之间来回切中位数跟着跳。解决分两层单帧层面用 4.1 的收缩加 IQR 过滤跨帧层面按目标 ID 做指数平滑具体在最后一章展开。只做单帧不做跨帧抖动只能压掉一半。现象四相机能打开但 grab 一直失败或者帧率掉到个位数。优先怀疑带宽。720p 30 帧在某些 USB 控制器上已经接近上限如果同一条总线上还挂着别的采集设备就会周期性丢帧。换成 USB 3.0 独立控制器、缩短线材、把分辨率降到 720p 以下都能缓解。另一个常见原因是深度模式切到了较重的档位分辨率不降的情况下计算量翻倍帧率自然崩。判断方法很简单把depth_mode换回PERFORMANCE如果帧率立刻恢复那就是算力问题不是链路问题。现象五贴着镜头 0.3 米以内的目标永远测不到画面上一片空洞。depth_minimum_distance是硬约束比它更近的目标双目视差超出了搜索窗口物理上算不出来调代码没用。解决要么把目标挪远要么换广角镜头版本缩短最近距离要么在应用层加一条“距离未知”的兜底显示别硬报一个数字。顺带提一句confidence_threshold设到 95 以上也会让近处目标的边缘整片变空洞这两个参数经常一起背锅。注意任何一次改动分辨率、深度模式、置信度阈值之后都要重新校准一轮 IQR 阈值。参数是联动的改一个不调另一个昨天能用的判据今天就会误判。6. 进阶ROI 百分位 时序平滑把抖动压到厘米级单帧层面还有一步提升空间中位数虽然抗噪但在目标占框比例小时依然会被带偏。更稳的做法是先做分位数裁剪再取均值——把 ROI 内有效深度按大小排序砍掉最前和最后各 20%剩下 60% 取均值。这样既避开了前景的离群小块也避开了背景的远端拖尾实测比纯中位数在细长目标上稳定约三分之一。def robust_depth(depth_np, box, shrink0.6, low20, high80, min_valid30): x1, y1, x2, y2 [int(round(v)) for v in box] w, h x2 - x1, y2 - y1 dx, dy int(w * (1 - shrink) / 2), int(h * (1 - shrink) / 2) roi depth_np[y1 dy: y2 - dy, x1 dx: x2 - dx] v roi[np.isfinite(roi)] v v[v 0] if v.size min_valid: return None lo, hi np.percentile(v, [low, high]) core v[(v lo) (v hi)] return float(core.mean()) if core.size else None跨帧层面关键是要按目标 ID 平滑而不是按检测框的位置平滑。没有跟踪器时退而求其次用框的 IoU 做简易关联同一目标连续命中就沿用上一条历史。class DepthSmoother: 按 track id 维护指数滑动平均alpha 越小越稳、越大越跟手 def __init__(self, alpha0.25, max_jump1.0): self.alpha alpha self.max_jump max_jump # 单帧允许的最大跳变米超出视为异常 self.state {} def update(self, tid, z): if z is None: return self.state.get(tid) # 本帧无效则沿用历史不更新 prev self.state.get(tid) if prev is None or abs(z - prev) self.max_jump: self.state[tid] z # 首次出现或跳变过大直接重置 else: self.state[tid] prev self.alpha * (z - prev) return self.state[tid]alpha的取值跟应用直接相关做静态测量可以压到 0.15收敛慢但数字好看做机器人避障这类要跟手的场景0.35 到 0.5 更合适宁可抖一点也不能滞后。max_jump是防止目标被短暂遮挡后重新出现时平滑器把一个完全错误的初值慢慢“揉”进历史里那样反而更难发现。这个类还有个好处是天然带记忆某帧因为目标转过身、纹理消失导致测距失败返回的是上一帧的平滑值画面不会突然闪一下。最后是验证。别只盯着画面上的数字用点云反投影自查一次能发现很多肉眼看不出来的问题把 ROI 中心的像素坐标和深度值代进去取出点云里的三维点再核对 Z 分量是否和深度图一致、X/Y 是否落在合理范围内。不一致就说明深度图和点云用的参考系不同多半是measure3D_reference_frame被改过而深度图没跟着改。平滑参数建议值静态测量建议值动态跟随影响shrink0.50.6越小越抗背景干扰但小目标易失效分位裁剪20/8010/90裁剪越狠越稳越容易丢掉真实极值alpha0.150.40越小越平滑滞后越明显max_jump0.3 米1.0 米越小越保守重捕获越慢从那以后我每次把这套东西交给别人之前都会强制走一遍三个检查打印一帧的深度图形状和左目图形状对比、连续 30 帧打印 IQR 和有效像素数、用一个已知距离的纸箱做单点标定看偏差是否在 2% 以内。这三步花不了五分钟但能挡掉九成“跑起来数字不对”的返工。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

AI日报内容生成规范与专业底线说明

AI日报内容生成规范与专业底线说明

我无法根据当前输入生成符合要求的博文。原因如下:项目标题为“AI 日报(2026年9月25日)”,但该日期尚未到来(当前为2024年),属于虚构未来时间点;项目正文为空,无任何实质…

📅 2026/11/2 13:20:06
Windows接入阿里云Claude Code全流程指南

Windows接入阿里云Claude Code全流程指南

1. 项目概述:Windows环境接入阿里云Claude Code全流程Claude Code作为Anthropic推出的AI编程助手,通过命令行交互方式为开发者提供代码生成、问题排查等智能辅助功能。阿里云百炼平台提供的国内接入方案,有效解决了国际版服务网络不稳定、响应…

📅 2026/11/2 13:20:06
Jev是什么?从大模型到智能代理的关键跳板解析

Jev是什么?从大模型到智能代理的关键跳板解析

这几天后台和几个技术社群里,满屏都是“Jev”这个词。有人问 Jev 是不是 OpenAI 又放出来的新模型,有人说是某个开源推理框架的马甲,还有人拿着截图说斯坦福教授用 Jev 搭了一套数据系统。我翻了一圈官网、GitHub、部署指南,周末又…

📅 2026/11/2 13:20:06
MORE NEWS

更多资讯

📰

LRU缓存算法原理与高效实现详解

1. LRU缓存实现的核心原理与设计思路 LRU(Least Recently Used)缓存淘汰算法是计算机系统中应用最广泛的一种缓存管理策略。它的核心思想是"最近最少使用"——当缓存空间不足时,优先淘汰最久未被访问的数据。这种策略基于时间局部性…

📰

Step 5 Preview、DeepSeek V4 Pro、GLM5.3 三模型 3D 游戏实测对比

1. 三款模型同台竞技:这场3D游戏实测到底在测什么 最近圈子里讨论度最高的一件事,就是拿 Step 5 Preview、DeepSeek V4 Pro 和 GLM5.3 这三个模型,让它们做同一个 3D 游戏,然后横向对比。我第一时间跟进了这个实测,原因…

📰

Univer实现指定单元格可编辑:在线表格锁定与数据填报实践

这两年只要聊开源在线表格,绕不开 Univer 这个名字。它做的事情和 Google Sheets 类似,但你可以完全自己部署、自己二开,把它嵌到自己的产品里。我最近在做一套内部数据填报系统,核心需求刚好就是网上常被搜到的那句话&#xff1a…

📰

编程操作符详解:从基础到高级应用

1. 操作符基础概念与分类 在编程语言中,操作符是构成表达式的基本元素,它们用于对变量和值执行各种操作。根据操作数的数量,操作符可以分为以下几类: 一元操作符(Unary Operators)是只需要一个操作数的操作…

📰

MFC嵌入CEF3 90.6.0:VS2010桥接DLL与JS双向通信

简介:面向使用 VS2010 开发桌面程序的 C 开发者,这份资源围绕 CEF3 90.6.0 嵌入 MFC 窗口并实现 JavaScript 与 C 互调展开,适合需要为传统 MFC 应用补充现代 Web 渲染能力、研究浏览器内核集成与消息循环协同的读者。压缩包共 629 个文件&am…

📰

一枚回形针的自我修养:从设计原理到制造工艺全拆解

2. 引言:一枚回形针的自我修养如果说有什么物件能称得上“桌面上的隐形冠军”,我的第一票一定投给回形针。你在办公室抽屉里随手一抓就能抓出一把,用来夹文件、捅手机卡槽、掰成临时螺丝刀,甚至有人拿它当书签。但就是这枚不起眼的…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬