监控摄像头可疑人员智能识别系统:Java与边缘部署实战链路
做“监控摄像头可疑人员智能识别”这套系统最容易产生的误区是以为核心难点在“把YOLO模型跑起来”。真正落地之后你会明白难题在Java工程里怎么把RTSP拉流、目标检测、行为判定、告警去重、边缘部署这些环节串成一条稳定链路。这篇文章就是这套流程的完整记录我从需求拆解讲到边缘盒子调优适合已经会写Java后台、但对模型集成和视频处理还不太熟的开发者参考。1. 监控场景的需求拆解先别急着写代码把“可疑”定义清楚1.1 “识别出人”和“判断可疑”是两码事很多需求方一开始提的要求是“识别画面里的可疑人员”但实际沟通后你会发现绝大多数监控摄像头本身就能拍下所有人识别出人并不稀缺。客户真正要的是当某个目标做了“可疑行为”时系统能自动提醒值班人员而不是把每一帧里有人的结果都报出来。这两个目标有本质差别。前者是目标检测问题模型输出一个个人框就行后者是行为判定问题要把连续帧里同一个目标的状态累计起来再套规则。比如一个陌生人走进办公园区大门是正常的但如果这个人在门口徘徊了三分钟又靠近了防尾随门这就值得关注。所以我在做这套系统时把项目拆成了“检测”和“行为”两层——检测层只负责给出人框和置信度行为层负责判断这个人是不是可疑。1.2 为什么这套链路更适合用 Java 来做我之前也考虑过用Python写检测服务再让Java后端调用接口。这个方案开发快但偏偏监控类项目大多数要对接客户现有的运维体系、告警平台、工单系统这些后端大量是Java技术栈。多一个Python服务就意味着多一个部署单元、多一套日志、多一种进程守护方式现场交付时会多出不少麻烦。所以这个项目我决定直接在一个Java进程里集成全部链路。JavaCV负责拉RTSP流和图像格式转换OpenCV DNN模块加载ONNX模型做推理再用纯Java写一个轻量级跟踪器和规则引擎。这样整个系统只需要一个可执行Jar放到边缘盒子上就能跑日志和运维体系完全复用现有的。1.3 整体模块划分以及每条数据流怎么走整个系统我分成四层编码时也是按这个边界拆包的接入层负责RTSP拉流、抽帧、图像缩放和格式转换。检测层负责模型加载、推理、置信度过滤、NMS后处理。行为层负责目标跟踪、轨迹更新、规则判断、报警状态管理。输出层负责报警截图、本地记录、HTTP Webhook推送。数据流很简单但每一步都要理解清楚摄像头画面进入接入层之后不是一个线程从头跑到尾而是采集线程把Mat帧交给推理线程推理线程把检测结果交给行为线程行为线程再把最终报警事件交给输出线程。模块之间的数据缓冲我用的阻塞队列但队列里放的不是对象引用而是经过“轻量化”之后的检测结果列表避免把摄像头原始帧层层传递。这样做的好处是每个环节都可以单独调参数。采集线程可以稳定跑15帧但推理线程只处理其中5帧行为线程只在有检测结果时才计算不空转。边缘设备上CPU资源有限分层解耦后哪里慢就优化哪里非常方便。2. 边缘部署的技术基座模型导出、拉流和工程依赖2.1 选什么样的YOLO模型以及怎么导出ONNX我选的是YOLO家族里偏轻量的模型比如YOLOv5s或者YOLOv8n这一档因为最终要放在边缘盒子上跑模型大小和推理速度比那一两个点精度重要得多。预训练模型在COCO数据集上有person类别可以直接用来检测人但如果你要识别的是特殊视角比如俯视闸机、远距离围墙强烈建议用现场数据微调一个专用模型通用模型在这种视角下漏检会很明显。模型导出我统一转成ONNX格式。原因很现实ONNX是开放的中间格式OpenCV DNN模块和多种Java推理引擎都直接支持部署时不挑环境。导出时固定输入尺寸为640x640如果同时要兼顾小目标可以导出960x960的版本但边缘盒子的算力往往扛不住先用640。导出之后的模型文件我一般还要在本地Python环境里验证一遍输出维度确保是类似[1, 84, 8400]的形状。如果发现某些算子导出来有问题就在导出阶段关掉一些融合优化或者换成带后缀的导出模式这个坑在后面“排查链路”里会细说。2.2 摄像头接入RTSP拉流要处理哪些细节绝大多数监控摄像头都支持RTSP协议接入层我直接用JavaCV的FFmpegFrameGrabber拉流。最核心的一点是设置rtsp_transport为TCP默认的UDP在弱网环境里会频繁丢包画面花屏检测效果直接受影响。还有一项容易被忽略摄像头输出的分辨率通常很高200万像素甚至400万像素但模型输入只需要640x640。直接在拉流端就把分辨率限制到1280x720或960x540能明显降低解码和缩放的开销。帧率也不一定拉到满很多摄像头支持15帧就够用行为判定里我用的是时间戳而不是单纯的帧序号所以偶尔丢几帧不会影响驻留时间的计算。我还会在接入层加一个“心跳机制”。每过10秒检查一次最近是否成功拉到帧如果超过20秒没有新帧就主动断开并延时重启抓取器。RTSP流有一个特点断流之后不能只在同一个对象上反复读必须stop()后重新start()或者干脆重新创建抓取器否则会一直卡在读帧超时上。2.3 Java工程中最基础的依赖和第一段可运行代码这个Java工程在普通Spring Boot工程基础上增加了JavaCV依赖。下面是最核心的依赖引入dependency groupIdorg.bytedeco/groupId artifactIdjavacv-platform/artifactId version1.5.9/version /dependency这个依赖会带进OpenCV Java绑定和FFmpeg绑定。如果你已经另外装了OpenCV可以不用javacv-platform而用更精简的javacv加上对应平台依赖但为了现场部署省心直接用全量依赖最稳。拉流的第一段代码大概是这样的FFmpegFrameGrabber grabber new FFmpegFrameGrabber(rtspUrl); grabber.setOption(rtsp_transport, tcp); grabber.setImageWidth(1280); grabber.setImageHeight(720); grabber.start(); OpenCVFrameConverter.ToMat converter new OpenCVFrameConverter.ToMat(); while (running) { Frame frame grabber.grabImage(); if (frame null) { restarted reconnect(grabber, rtspUrl); continue; } Mat mat converter.convert(frame); // 投递给推理线程 detectQueue.offer(mat); }注意converter.convert(frame)返回的Mat和Frame共享内存空间所以不能把mat拿出去用完之后不释放。投递给推理线程之后谁消费谁负责调用mat.release()否则堆外内存会持续增长这在Java里不容易被发现但会让进程内存暴涨后面踩坑里会细讲。3. 检测层落地把ONNX模型跑进Java推理流程3.1 图像预处理letterbox和归一化的作用YOLO模型训练时使用了letterbox变换也就是保持图像宽高比不变把长边缩放到640短边用灰边补齐。推理时也必须做同样的操作否则模型看到的图像内容和你训练时不匹配检测效果会明显下降。我直接写了一个工具方法private Mat letterbox(Mat src, int targetSize) { int width src.cols(); int height src.rows(); double scale Math.min((double) targetSize / width, (double) targetSize / height); int newWidth (int) Math.round(width * scale); int newHeight (int) Math.round(height * scale); Mat resized new Mat(); Imgproc.resize(src, resized, new Size(newWidth, newHeight)); Mat canvas new Mat(targetSize, targetSize, src.type(), new Scalar(114, 114, 114)); Rect roi new Rect((targetSize - newWidth) / 2, (targetSize - newHeight) / 2, newWidth, newHeight); resized.copyTo(canvas.submat(roi)); resized.release(); return canvas; }归一化这一步直接交给Dnn.blobFromImage处理把RGB通道顺序、缩放因子、均值都传进去。注意这里如果模型和代码里的通道顺序不一致画面上就会掉半边框这个细节我调了半小时才反应过来。3.2 YOLO输出的后处理置信度过滤与NMS模型推理的核心调用很短Net net Dnn.readNetFromONNX(yolov8n.onnx); Mat blob Dnn.blobFromImage(letterboxMat, 1.0 / 255.0, new Size(640, 640), new Scalar(0, 0, 0), true, false); net.setInput(blob); Mat output net.forward();真正的复杂度在后处理。YOLO输出的张量里每个候选框都有坐标和各类别置信度我只需要person这一类的。流程是先把output转成可遍历的浮点数组按行解析出中心点坐标、宽高和person置信度过滤掉低于0.45的框再做NMS去掉同一目标上的重复框。NMS我直接用OpenCV DNN模块自带的方法MatOfRect boxes new MatOfRect(); MatOfFloat confidences new MatOfFloat(); MatOfInt indices new MatOfInt(); Dnn.NMSBoxes(rectList, scoreList, 0.45f, 0.5f, indices);把检测框从模型输入坐标换算回原始画面坐标是这里最容易出错的点。因为letterbox做了缩放和偏移所以解析出的原始坐标要先减去偏移再除以缩放比例。我建议写一个toOriginalScale方法统一处理不要在业务代码里到处算否则后续加一路摄像头时肯定乱。3.3 推理线程模型不是帧帧推理而是合理抽帧边缘盒子的CPU能力有限穷举每一帧去推理没有意义。我采用固定间隔策略推理线程从队列取最新一帧如果距离上一次推理不到200毫秒直接跳过这一帧继续取新的。这样在25帧的摄像头源上系统实际推理频率稳定在5FPS左右行为判定对5FPS完全够用。如果画面里有快速奔跑的目标5FPS会导致相邻两帧位移过大跟踪容易跟丢。我会在跟踪参数里把最大位移放宽同时提高拉流帧率来补偿。实际上只要目标在画面里移动不超过画面宽度的三分之一5FPS就能跟上。推理模型必须做成单例一个进程只加载一次。我遇到有人把Net对象放进方法里反复创建边缘盒子瞬间卡死。加载模型是重量级操作启动时加载一次之后所有线程复用这是底线。4. 行为判定从“检测到人”到“发现可疑人员”4.1 三条行为规则的设计思路与参数取值我做这套系统时规则引擎采用“配置化”思路把规则条件全部放配置文件里现场调参不用改代码重打Jar包。最常用的三条规则是区域闯入目标框中心点进入预设ROI区域并且持续超过3秒。区域停留/徘徊同一目标在ROI内累计停留超过15秒。快速接近目标中心点在连续帧之间位移过大并且方向朝向摄像头坐标。区域闯入和停留的区别在于时间。进入ROI马上出去可能只是路过在ROI里待满15秒才值得告警。快速接近则用速度判断我定义的“速度”不是真实物理速度而是归一化之后的像素速度——连续两帧之间目标中心点距离除以时间间隔超过阈值并且持续3帧以上就触发。两类误报需要特别过滤一是画面里的阴影、灯光变化被模型误检成人二是鸟、树叶晃动等动态物体被模型识别成人。前者靠提高置信度阈值解决后者靠“目标需连续N帧存在”规则解决。我的系统里默认要求目标连续出现5帧以上才参与行为计算这样单帧误检不会产生告警。4.2 一个轻量级多目标跟踪器要怎么维护行为判定离不开目标跟踪。如果每一帧都独立判断同一个目标会因为框抖动、短暂遮挡而换来换去停留时间永远累计不起来。我用的是一个基于IoU匹配的轻量级跟踪器没有任何第三方依赖。每帧检测结果先和已有Track列表做IoU匹配匹配上就更新Track的位置和时间没匹配上就新建Track。反过来已有Track如果连续多帧没匹配到检测框标记为丢失连续丢失若干帧后删除。核心数据结构如下public class Track { int id; Rect box; Point center; long lastSeen; int lostCount; long inRoiSince; boolean inRoi; }IoU匹配时我用的阈值是0.35。阈值太高跟踪容易断阈值太低会把不同人粘在一起。边缘场景下摄像头视角固定目标框变化不大0.35是个比较稳的经验值。还有一个细节Track要保存“是否在ROI内”以及“在ROI内持续了多久”。因为规则判断需要在多帧之间累计状态内存里维护好这两个字段规则引擎每次只需要读当前状态逻辑会简单很多。4.3 报警状态机避免一帧触发、连续轰炸如果规则一满足就立刻推送告警那告警平台会被刷爆。我给每个Track设计了一个简单状态机分三个阶段正常、预报警、正式报警。目标进入ROI后先进入预报警状态持续满足规则超过预设时间才进入正式报警。报警之后进入冷却期默认30秒内同一个Track ID不再重复报警。冷却期结束后如果目标还在违规区域可以再次报警。状态机放在规则引擎内部好处是阈值调整非常方便。比如客户觉得“停留15秒太久”我只需要改配置文件里的alert.holdInsideMs15000不用碰代码。报警输出层我做了两种方式本地保存报警截图同时通过HTTP Webhook推送JSON消息给客户业务平台。截图保存在边缘盒子上的固定目录文件命名用时间戳摄像头IDTrack ID方便事后追溯。5. 边缘盒子上的部署与调优5.1 先定资源预算一路摄像头能吃多少CPU边缘部署之前先列一个资源预算表。我用的这类边缘盒子方案通常是四核ARM CPU、4GB内存没有GPU推理全靠CPU完成。YOLOv8n模型在640x640输入下单帧推理时间大约在120到250毫秒之间换算下来一路摄像头需要占用大约一个半核心。这个数据意味着如果你有4核CPU最多接两路摄像头做实时分析再多就会延迟累积。而且推理线程和采集线程不能都跑在一个核心上建议先做一次压测把单路摄像头的CPU占用率记录下来再决定接几路。我给一张经过实测的参考表摄像头分辨率实际推理FPS单路CPU占用估算可接入路数4核盒子720p5 FPS35%2路1080p先缩到720p5 FPS40%2路1080p不缩放3 FPS65%1路核心原则是宁愿降低推理FPS也不要让CPU长期跑满。系统一旦CPU跑满RTSP拉流线程和其他线程都会卡反而会把整个盒子的稳定性拖垮。5.2 性能优化的五个方向第一模型量化。如果推理引擎支持INT8量化可以把模型体积压缩到原来的四分之一左右推理速度明显提升。但量化后精度会下降尤其对小目标、遮挡目标影响大。我的做法是先在离线视频上跑一遍对比如果漏检率升高超过5%就放弃INT8退回FP16或者FP32。第二减少Mat对象的反复分配。Mat是堆外内存对象频繁new Mat再release会产生大量内存碎片GC管不到只能靠手动管理。我会在接入层复用Mat缓冲区严格遵循“谁申请谁释放”的原则每帧推理结束后立即释放。第三线程数不宜过多。我之前试过开8个线程并发处理多路摄像头结果线程切换开销远大于收益。边缘盒子上线程数控制在“核心数2”以内更稳。第四推理前做输入尺寸降级。如果摄像头源是1080p拉流端直接指定输出720p比等到推理前再做letterbox省很多内存和CPU。第五运行前做一次模型预热。加载模型后先跑10次空推理让OpenCV DNN内部缓存就绪不然第一帧处理时间会长到几秒容易被误认为系统卡死。5.3 稳定性机制断流重连、堆外内存、看门狗边缘盒子最大的风险不是慢而是无人值守时挂掉。RTSP断流是最常见的问题我单独写了一个ReconnectThread每隔10秒检查最近帧时间发现超时后强制重启抓取器。每次重连间隔逐渐递增比如第一次5秒第二次10秒第三次30秒避免摄像头还没恢复时盒子反复重试把CPU打满。堆外内存问题在Java OpenCV组合里尤其隐蔽。Java的堆内存正常但进程RSS不断上涨最后系统被OOM杀掉。这是因为Mat对象背后的本地内存在release()之前不归JVM管。我后来在代码里加了一个本地Mat计数每创建一个Mat加一每释放一个减一定期打印计数很快就能定位到是哪一段逻辑漏了释放。最后我加了一个简单的看门狗线程它只做一件事每30秒检查主循环是否还在推进如果在推进就说明系统正常如果连续3次没推进说明某个线程卡死主动退出JVM并让容器重启。这种“土方法”很粗暴但对无人值守的边缘节点非常有效。6. 实测效果与四条排查链路6.1 正常场景与边界场景的实测结果我在模拟项目X上用两路摄像头做了半个月观察。正常场景里一个人快走进大门系统不会报警一个人在门外徘徊超过15秒系统会在第16秒左右推出一条“区域停留”告警两个人同时进入画面跟踪器能区分两个ID分别计算停留时间。边界场景最容易出问题的是遮挡。一个人先被树挡住2秒再出现时跟踪器会认为是一个新目标导致之前的停留时间归零。我的优化办法是给Track一个“丢失容忍期”连续丢失小于8帧时继续保留原Track如果之后出现的检测框和原Track仍有较大IoU就恢复原目标ID而不是新建。另一个问题是晚上。夜间图像噪点多模型漏检率明显高于白天FPS再高也没用。我建议要么加补光灯要么降低报警规则里的时间阈值因为夜间停留的“可疑度”本身就比白天高用参数补偿模型精度的不足。6.2 开发机正常但边缘盒子不正常的排查过程我遇到过这样一个情况同一个ONNX模型在开发机上用OpenCV DNN加载后推理正确部署到边缘盒子后一调用就抛异常错误指向某个不支持的算子。开始时我以为是模型文件没传完整后来排查发现边缘盒子自带的OpenCV版本远低于开发机一些YOLO导出的新算子不支持。排查流程倒不复杂先在异常日志里找到具体算子名再到OpenCV开源仓库的Issue列表搜索确认这个算子的最低支持版本然后看当前OpenCV版本是否低于它。如果无法升级OpenCV就换一个支持ONNX的推理运行时。这种问题不能靠改代码绕过底层算子缺失绕不过去版本匹配是前提。6.3 框抖导致误报的排查与解决系统上线后客户反馈“没人经过时也报警”拉日志一看规则引擎收到的轨迹坐标在无人区反复横跳。这种误报通常不是跟踪器的问题而是检测层输出的框置信度太低、NMS阈值太松或者检测到了门把手、墙上的海报轮廓。排查时我把推理结果的置信度日志打开每个框都输出分数很快看到那些误报框的置信度只有0.3左右。把置信度阈值从0.45提到0.6后误报明显减少。同时NMS阈值从0.5调到0.45让重叠框更早被抑制。还有一个经验是不要只看单个框要结合前后帧。如果某一帧检测框突然出现在画面正中央下一帧又消失这多半是误检。跟踪器里的“连续5帧存在”规则本身就是最好的过滤器。6.4 内存持续增长最后把进程拖垮的教训这个问题很典型JVM堆内存一直正常但系统进程的RSS从几百MB涨到几个GB最后被系统杀掉。起初我怀疑是JavaCV的Frame没有释放但我已经在每个循环里调用了frame.release()。后来我在代码里对Mat做了计数发现一个隐蔽点converter.convert(frame)返回的Mat并不总是新的它和Frame共享本地内存。我在推理线程消费完Mat后调用mat.release()但采集线程的frame如果也被释放会导致Mat访问已经被释放的内存反而引发异常。正确做法是要么只释放Mat要么只释放Frame不能两个都释放。我在最终实现里选择了“只释放Mat不释放Frame”因为Frame由JavaCV的FrameGrabber内部管理。调整后RSS稳定在900MB左右连续运行一周没有上涨。7. 落地时我更看重的几件事7.1 先离线后在线把全流程拆成两个阶段视频AI类项目最忌讳直接拿在线RTSP流联调因为摄像头画面不可控出问题时很难复现。我的做法是先用ffmpeg命令录制一段10分钟的RTSP视频存成MP4文件然后让系统把MP4当输入源跑完整条“拉流—检测—行为—报警”流程。离线跑通之后再切换成RTSP地址在线跑。离线阶段能稳定复现问题调参也有基准。比如我希望验证“停留15秒报警”直接找一段15秒停留录像反复测试改一次阈值跑一遍比蹲在摄像头前实时看结果高效得多。7.2 把规则参数暴露成配置而不是写死在代码里行为判定的阈值参数非常敏感每个现场都不一样。有的客户要求“停留5秒就警告”有的要求“必须进入禁区才算”。我在application.yml里集中管理这些参数并且单独做一个配置接口允许运维在后台调整不用重启进程。配置项一般包括模型置信度阈值、NMS阈值、目标连续出现帧数、ROI区域坐标、停留时间阈值、报警冷却时间、巡检间隔等。把参数和代码分离是我做工业级交付的第一原则。7.3 对“视频帧数据”要像对待数据库连接一样管理最后还想强调一遍资源管理。在Java里做视频处理最大的心智负担不是并发而是OpenCV对象和JVM内存之间的边界。Mat、Frame这些对象看起来像普通Java对象内存却不归JVM管一个不小心就是一个内存泄漏。我后来的习惯是所有涉及Mat/Frame的方法都统一走一个资源包装器用try-finally保证释放。如果方法返回Mat给上层用注释里必须写明“由调用方负责release”。搞视频开发的团队里只要有一两个人不遵守这个约定系统迟早会被本地内存拖垮。这套系统从开发到边缘盒子稳定运行踩坑不少但目前已经能连续跑两三个月不重启。如果你也要做类似的监控识别建议从离线流程开始先把检测和后处理跑通再上行为规则最后再谈边缘部署的优化。顺序反了调试成本会翻好几倍。

相关新闻

diagram-design:从画图到构建可维护的图表设计系统

diagram-design:从画图到构建可维护的图表设计系统

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次听到 diagram-design 这个词,很多人会以为它只是“画图”的另一种说法。但真正在项目里被图表折磨过的人知道,画图只是冰山一角,水面下藏着的是一整套关于信息结…

2026/10/19 20:42:49 阅读更多 →
diagram-design:从草图到系统的图表设计方法论与工程实践

diagram-design:从草图到系统的图表设计方法论与工程实践

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次看到“diagram-design”这个组合词,很多人会下意识觉得它只是“画图工具”或者“设计模板”的另一个说法。但真正在项目里被图表折磨过的人会明白,这两个词放在一起&#xf…

2026/10/19 20:51:55 阅读更多 →
多智能体强化学习与LLM智能体系统:从MARL到RLHF的融合实践

多智能体强化学习与LLM智能体系统:从MARL到RLHF的融合实践

简介:这份PDF是一份面向AI研究者和工程师的技术分享资料,系统梳理了强化学习(多)智能体到大语言模型(多)智能体近十年的研究脉络,涵盖深度强化学习、多智能体强化学习、基于Transformer的强化学…

2026/10/19 20:21:43 阅读更多 →

最新新闻

随机二进制树防冲突算法:RFID标签批量识别的工程实现与性能调优

随机二进制树防冲突算法:RFID标签批量识别的工程实现与性能调优

做RFID项目最头疼的往往是标签一多,读写器就开始“开盲盒”:多个标签同时响应,信号叠在一起,谁的数据都解不出来。我在一个标签批量识别的场景里,把基于随机二进制树的防冲突算法完整落地了一遍,并把时隙消…

2026/10/20 17:14:43 阅读更多 →
回溯算法通用模板:组合总和与分割回文串刷题笔记

回溯算法通用模板:组合总和与分割回文串刷题笔记

刷题打卡到第20天的时候,我给自己安排了一个小高潮:LeetCode 的 39. 组合总和、40. 组合总和II、131. 分割回文串。三道题表面上形态完全不一样,两个是数组题目,一个是字符串题目,但仔细一拆就会发现,它们练…

2026/10/20 17:14:43 阅读更多 →
DeepSeek带火AI智能体运营:普通人抓住这波机会的底层逻辑

DeepSeek带火AI智能体运营:普通人抓住这波机会的底层逻辑

DeepSeek这波热度起来之后,我几乎每周都会被问到同一个问题:这波机会,普通人到底还能不能抓住?有人焦虑自己不会写代码,有人担心入局太晚,也有人天天在试各种Prompt、换各种模型,却始终不知道怎…

2026/10/20 17:14:43 阅读更多 →
从单次调用到Agent:Harness Runtime架构设计与工程实践

从单次调用到Agent:Harness Runtime架构设计与工程实践

1. 从一次裸调用说起:为什么单次 LLM 调用撑不起一个 Agent很多人第一次接触 Agent,脑子里想的其实还是"给大模型发一段话,它回一段话"。这个认知在 Demo 阶段没问题,但一旦你想让它自己查资料、自己改代码、自己跑测试…

2026/10/20 17:14:43 阅读更多 →
基于Elastic Agent Builder的自然语言可观测性查询与根因分析实践

基于Elastic Agent Builder的自然语言可观测性查询与根因分析实践

1. 从一句“为什么这么慢”说起:可观测性查询的交互变革过去几年,我一直在做系统可观测性相关的工程实践,从最早的日志采集、指标聚合,到后来的链路追踪、事件关联分析,几乎每一套监控体系都绕不开一个核心矛盾&#x…

2026/10/20 17:14:43 阅读更多 →
天地图离线地图JS与CSS本地化:内网GIS项目断网白屏解决方案

天地图离线地图JS与CSS本地化:内网GIS项目断网白屏解决方案

简介:这份资源面向需要在无外网环境下部署地图服务的前端与内网应用开发者,提供天地图离线访问所需的 JavaScript 与 CSS 源码,解决内网无法直连天地图在线接口、地图瓦片与控件无法加载的问题。压缩包共 5 个文件,包含 4 个 js 与…

2026/10/20 17:13:42 阅读更多 →

日新闻

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/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

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

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

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

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

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

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

月新闻

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