摄像头目标检测实战:从视频流采集到实时推理的完整链路
1. 从一段视频流说起为什么摄像头目标检测值得单独拎出来讲很多人做目标检测习惯性地拿一张张静态图片去跑模型跑通了、指标好看了就觉得大功告成。但真正把检测能力落到实际场景里你会发现绝大多数需求根本不是给我一张图告诉我里面有啥而是盯着一个画面实时告诉我现在发生了什么。这两者之间的差距比想象中大得多。摄像头目标检测本质上是把训练好的检测模型接入一路连续的视频流对每一帧做推理再把结果叠加回画面上呈现出来。听起来只是多了一个读摄像头的步骤但实际动手时帧率、延迟、分辨率、线程调度、画面绘制、资源占用这些问题会一股脑冒出来。静态图片推理你只需要关心精度视频流推理你得同时关心精度和速度还得关心整条流水线会不会卡死。这篇内容适合谁看如果你已经能跑通一个检测模型不管是哪家的框架、哪种骨干网络但一接摄像头就手忙脚乱画面卡成幻灯片、延迟高得离谱、或者干脆读不到画面那这篇就是写给你的。如果你还没跑通模型建议先把单张图片推理走通再回来看视频流这一块否则问题会混在一起很难定位。我会围绕调用摄像头做目标检测这条主线把整条链路的每个环节拆开讲从摄像头怎么被程序读到、帧怎么进模型、结果怎么画回画面到帧率上不去时该往哪儿查、延迟从哪来、多路摄像头怎么处理。中间会穿插大量我在实际调试中踩过的坑和总结出来的参数经验尽量让你少走弯路。需要先说明一点下面涉及的具体代码以常见的 Python OpenCV 深度学习推理框架组合为例这是目前最主流、最容易上手的方案。如果你用的是别的语言或别的采集库思路完全一致把对应的 API 替换掉即可。2. 摄像头到底是怎么被程序看见的2.1 采集环节的三种典型数据来源在动手写检测逻辑之前得先搞清楚画面从哪来。实际项目里摄像头目标检测的输入源通常有三类它们的处理方式差别不小。第一类是本地 USB 摄像头或笔记本内置摄像头。这类设备通过系统驱动暴露成一个视频设备节点程序调用采集库打开它就能拿到连续帧。优点是延迟低、部署简单缺点是受线缆和位置限制一般只能覆盖一个固定视角。第二类是网络摄像头IP Camera。它本质上是把视频流通过 RTSP、RTMP 或 HTTP 等协议推出来程序通过一个流地址去拉取。这类设备可以远程访问、可以布很多路但网络抖动会直接影响帧的到达节奏处理不好就会出现花屏、卡顿、延迟累积。第三类是视频文件或录播流。调试阶段非常有用因为文件是可重放的同一段画面你能反复跑方便对比不同参数下的效果。很多人在真实摄像头上调不通换成视频文件一跑就发现问题其实出在模型或绘制环节而不是采集环节。提示调试顺序建议是先用视频文件跑通整条链路再换成真实摄像头。这样能把采集问题和推理问题分开定位效率高很多。2.2 打开摄像头时那几个容易被忽略的参数以 OpenCV 为例打开摄像头的代码通常就一行但这一行背后有几个参数直接决定后续体验。import cv2 cap cv2.VideoCapture(0) # 0 表示第一个摄像头设备 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) cap.set(cv2.CAP_PROP_FPS, 30)这里有几个点值得展开。设备索引那个 0在多摄像头场景下需要逐个试不同系统枚举顺序可能不一样。分辨率设置不是你想设多少就多少摄像头只支持它固件里列出的若干档你设了一个不支持的值驱动往往会就近取一个结果和你预期不符。所以设完之后最好读回来确认一下real_w cap.get(cv2.CAP_PROP_FRAME_WIDTH) real_h cap.get(cv2.CAP_PROP_FRAME_HEIGHT) print(实际分辨率:, real_w, real_h)帧率设置同理很多摄像头标称 30 帧但在高分辨率下会自动降到 15 帧甚至更低。如果你发现画面明显不流畅先别怀疑模型先确认采集端实际给到的是多少帧。还有一个隐藏坑采集缓冲。默认情况下采集库会在内部缓存若干帧如果你的推理速度跟不上采集速度缓冲区会越积越多表现出来就是画面延迟越来越大而且停不下来。解决办法是尽量把缓冲设到最小让程序每次拿到的都是最新帧cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)这个设置不是所有后端都生效但能生效的平台一定要加上对降低延迟帮助非常明显。2.3 读帧失败时先排查什么cap.read()返回两个值一个布尔标志和一个帧。很多人只取帧不判断标志结果摄像头没打开、线松了、流断了程序还在那儿对着一帧空数据跑推理报一堆莫名其妙的错。正确的习惯是这样ret, frame cap.read() if not ret: print(读帧失败检查设备连接或流地址) # 这里可以做重连逻辑 continue读帧失败常见原因有这么几类设备被别的程序占用了比如另一个窗口还开着、流地址写错了、网络断了、摄像头供电不足。排查时按先本地后远程、先硬件后软件的顺序来能省不少时间。3. 把一帧画面送进检测模型预处理与推理的衔接3.1 从 BGR 到模型要的格式中间隔了好几步采集库读出来的帧默认是 BGR 三通道、数据类型为 8 位无符号整数、形状是高×宽×通道。而检测模型通常要的是 RGB、归一化到 0 到 1 之间、形状是通道×高×宽、并且带一个批次维度。这几步转换看着琐碎但顺序错了、漏了一步结果就会离谱。一个典型的预处理流程是这样的import numpy as np def preprocess(frame, input_size(640, 640)): # BGR 转 RGB img cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 缩放到模型输入尺寸 img cv2.resize(img, input_size) # 归一化并转成浮点 img img.astype(np.float32) / 255.0 # 从 HWC 转成 CHW img np.transpose(img, (2, 0, 1)) # 增加批次维度 img np.expand_dims(img, axis0) return img这里每一步都有讲究。颜色通道顺序如果搞反红蓝互换模型看到的画面颜色是错的检测精度会掉但不会报错属于静默错误特别难查。缩放如果直接拉伸而不保持宽高比物体会变形对小目标检测尤其不友好。归一化的系数要和训练时一致训练用 255 除推理也得用 255 除用错了精度同样会掉。3.2 保持宽高比的缩放与坐标还原实际项目里我更推荐保持宽高比的缩放 填充也就是常说的 letterbox。做法是把原图按比例缩放到能塞进模型输入尺寸剩下的区域用固定颜色通常是灰色填充。这样物体不变形检测更准。代价是模型输出的坐标是在缩放加填充后的坐标系里的要画回原图必须把这一步逆回去。这个逆变换是新手最容易出错的地方框会整体偏移或者大小不对。def letterbox(frame, input_size(640, 640), color(114, 114, 114)): h, w frame.shape[:2] tw, th input_size scale min(tw / w, th / h) nw, nh int(w * scale), int(h * scale) resized cv2.resize(frame, (nw, nh)) canvas np.full((th, tw, 3), color, dtypenp.uint8) dw, dh (tw - nw) // 2, (th - nh) // 2 canvas[dh:dh nh, dw:dw nw] resized return canvas, scale, dw, dh还原的时候把检测框坐标先减去填充偏移再除以缩放比例就回到原图坐标了。这一步建议单独写个函数反复验证别混在主流程里。3.3 推理这一步批处理到底要不要开视频流推理有个常见误区觉得批处理能提速那就把好几帧攒一起送进去。理论上批处理确实能提高硬件利用率但在实时视频场景里攒帧意味着引入额外延迟——你得等够一批才能推理画面就不实时了。我的经验是单路实时摄像头批次设为 1追求的是低延迟而不是高吞吐。只有在处理离线视频、或者多路摄像头统一调度时才考虑把多路画面拼成一个批次一起推理这时候延迟要求没那么苛刻吞吐优先。另外推理时记得关掉梯度计算如果用支持自动求导的框架能省下可观的内存和时间import torch with torch.no_grad(): outputs model(input_tensor)这个细节看着小但在视频流里每帧都跑累积起来差别很明显。4. 把检测结果画回画面绘制环节的门道4.1 画框、贴标签、标置信度顺序和样式都有讲究检测结果拿到手是一堆坐标加类别加置信度。画回画面时最基础的是画矩形框、写类别名、标置信度。看着简单但样式设计直接影响可读性。def draw_box(frame, box, label, score): x1, y1, x2, y2 box cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) text f{label} {score:.2f} # 文字背景避免和画面颜色混在一起看不清 (tw, th), _ cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 0.6, 1) cv2.rectangle(frame, (x1, y1 - th - 6), (x1 tw, y1), (0, 255, 0), -1) cv2.putText(frame, text, (x1, y1 - 4), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 1)这里有个实用技巧给文字加一个实心背景条。如果直接把文字画在画面上遇到背景颜色接近文字颜色时根本看不清。加个背景条可读性立刻上来。背景条颜色一般用框的颜色文字用对比色。框的粗细也要考虑分辨率。720p 的画面用 2 像素还行4K 画面用 2 像素就细得看不见了。可以按画面宽度动态算一个线宽保证不同分辨率下观感一致。4.2 置信度阈值和类别过滤放在哪一层模型输出的原始结果通常很多需要按置信度阈值过滤再按类别筛选。这两个操作放在绘制之前能显著减少绘制开销。CONF_THRESHOLD 0.5 KEEP_CLASSES [0, 2, 5] # 只保留关心的类别 def filter_detections(detections, conf_thres, keep_classes): results [] for det in detections: if det[score] conf_thres: continue if keep_classes and det[class_id] not in keep_classes: continue results.append(det) return results阈值设多少合适这取决于场景。安防类场景宁可误报也别漏报阈值可以低一点比如 0.3而统计计数类场景希望结果干净阈值可以高一点比如 0.6。这个值没有标准答案得拿实际画面反复调。类别过滤同样重要。一个通用检测模型可能认识几十上百类但你实际只关心其中几类。把不关心的类别提前过滤掉既减少绘制量也让画面更清爽。4.3 帧率、延迟这些信息直接叠在画面上最直观调试阶段强烈建议把实时帧率和端到端延迟直接画在画面角落。这样你一眼就能看出当前性能状态不用去翻日志。import time prev time.time() while True: ret, frame cap.read() if not ret: break # ... 推理和绘制 ... now time.time() fps 1.0 / (now - prev) prev now cv2.putText(frame, fFPS: {fps:.1f}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2) cv2.imshow(detection, frame) if cv2.waitKey(1) 0xFF ord(q): break这个 FPS 是整条链路的帧率包含了采集、推理、绘制、显示全部环节比单独测推理耗时更有参考价值。很多人只测模型推理时间发现很快但实际画面就是卡原因往往在采集或显示环节。5. 帧率上不去、延迟降不下来到底卡在哪5.1 先分清帧率低和延迟高是两回事这两个问题经常被混为一谈但成因完全不同。帧率低是指每秒处理的帧数少画面看起来一顿一顿的。延迟高是指从画面发生到显示出来之间的时间差大画面可能很流畅但内容慢半拍。帧率低通常是算力不够或链路某环节太慢。延迟高则往往是缓冲累积造成的——采集快、推理慢中间堆了一堆旧帧程序一直在处理过去的画面。排查时先测帧率再测延迟。测延迟有个土办法拿手机秒表对着摄像头看画面里的秒表和真实秒表差多少。差得越多延迟越大。5.2 逐环节定位瓶颈的实操方法定位瓶颈最有效的办法是给每个环节打时间戳分别统计耗时。环节测什么常见瓶颈采集读一帧耗时分辨率过高、缓冲过大预处理缩放和转换耗时大图缩放、频繁内存拷贝推理模型前向耗时模型过大、输入尺寸过大后处理解码和过滤耗时候选框过多、非极大值抑制慢绘制画框写字耗时框太多、分辨率过高显示刷新耗时窗口渲染慢把这几项分别打点哪一项占比异常高问题就在哪。我遇到过好几次以为是模型慢结果一测发现是预处理里对大图做了多次缩放白白浪费了几十毫秒。5.3 几个立竿见影的优化手段如果确认是推理慢最直接的办法是降低模型输入尺寸。从 640 降到 416速度往往能提升一倍以上精度会掉一些但很多场景够用。其次是换更轻量的模型或者对模型做量化把浮点运算换成定点运算速度提升明显。如果是采集或显示慢可以降低采集分辨率或者把显示窗口缩小。显示环节经常被忽略其实高分辨率窗口的渲染开销不小。还有一个通用手段把采集和推理放到不同线程。采集线程只管读帧读到就放进一个只保留最新帧的队列推理线程从队列取最新帧处理。这样即使推理慢采集也不会被拖累延迟不会无限累积。import threading import queue frame_queue queue.Queue(maxsize1) def capture_loop(cap): while True: ret, frame cap.read() if not ret: break if frame_queue.full(): try: frame_queue.get_nowait() # 丢掉旧帧 except queue.Empty: pass frame_queue.put(frame)这个队列只留最新帧的模式是解决延迟累积的关键。队列设成 maxsize1满了就丢旧的保证推理线程拿到的永远是最新画面。6. 多路摄像头与长时间运行的稳定性问题6.1 多路场景下的资源分配思路单路跑通之后很多人会想扩展到多路。这时候不能简单地开多个线程各跑各的因为算力是共享的。如果每路都独立推理很容易把资源吃满结果每路都卡。更合理的做法是统一调度所有摄像头把最新帧放进各自的队列一个推理线程轮流从各队列取帧拼成一个批次一起推理再把结果分发回各自的显示。这样硬件利用率高整体吞吐更好。当然如果路数不多、算力充足独立线程也能接受胜在实现简单。选哪种取决于你的路数和硬件没有绝对优劣。6.2 长时间运行会遇到的几个慢性病摄像头检测程序经常需要连续跑几天甚至几周这时候一些短期看不出来的问题会慢慢浮现。内存缓慢增长是最常见的。原因通常是某些对象没被释放比如每帧都新建了张量却没及时回收或者绘制时不断创建新对象。排查办法是定时打印内存占用看它是不是单调上升。摄像头掉线也很常见尤其是网络摄像头。程序必须有重连逻辑检测到读帧失败后关闭设备、等待一小段时间、重新打开而不是直接退出。画面逐渐变暗或偏色有时候是摄像头自动曝光在长时间运行后漂移可以在采集端关掉自动模式手动锁定曝光和白平衡保证画面稳定。6.3 一个可复用的主循环骨架把前面这些整合起来一个相对健壮的主循环大概长这样def main_loop(cap, model): prev time.time() while True: ret, frame cap.read() if not ret: # 重连逻辑 cap.release() time.sleep(1) cap cv2.VideoCapture(0) continue input_tensor preprocess(frame) detections model(input_tensor) detections filter_detections(detections, 0.5, [0, 2, 5]) for det in detections: draw_box(frame, det[box], det[label], det[score]) now time.time() fps 1.0 / (now - prev) prev now cv2.putText(frame, fFPS: {fps:.1f}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2) cv2.imshow(detection, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()这个骨架不复杂但把读帧判断、预处理、推理、过滤、绘制、帧率显示、退出处理都串起来了可以直接拿去改。7. 我在实际调试中攒下的几条经验先说一个反直觉的别一上来就追求高分辨率。很多人觉得分辨率越高检测越准于是直接上 1080p 甚至 4K。结果采集慢、预处理慢、推理慢、显示也慢整条链路全被拖垮。实际上把分辨率降到 720p检测精度往往没明显下降但帧率能翻倍。分辨率够用就行别贪高。第二个经验是把颜色通道顺序当成头号嫌疑犯。只要检测结果莫名其妙地差但又不报错我第一件事就是检查 BGR 和 RGB 有没有搞反。这个错误太隐蔽了模型不会告诉你它看到的颜色是错的只会默默给你一堆烂结果。第三个是延迟问题优先查缓冲。画面流畅但慢半拍十有八九是缓冲在作怪。把采集缓冲设到最小、把队列设成只留最新帧大部分延迟问题都能缓解。第四个是给程序加个健康检查。定时打印帧率、内存占用、读帧成功率跑长时间的时候特别有用。等出问题再去看日志往往已经错过了现场。最后分享一个小技巧调试绘制环节时可以先把检测框画成半透明填充而不是空心框这样能一眼看出框和物体的贴合程度比空心框直观得多。等调好了再换回空心框画面更干净。这套东西说起来不复杂但每个环节都有细节任何一个没处理好整条链路都会受影响。建议你按先跑通、再优化、后稳定的顺序来别一上来就想着把所有优化都做上那样反而容易把自己绕进去。

相关新闻

充电桩云快充C语言源码:主控协议栈与状态机实现

充电桩云快充C语言源码:主控协议栈与状态机实现

简介:这是一套面向充电桩行业开发者的云快充协议C语言软件源码,适用于新能源充电桩制造商、嵌入式软件工程师及平台对接开发者。代码基于云快充通信协议实现充电桩与云服务平台的关键交互,覆盖连接建立与身份认证、实时状态上报、充电指令控制…

2026/10/14 0:37:53 阅读更多 →
ESP8266硬件SPI驱动ST7735:从接线到局部刷新优化

ESP8266硬件SPI驱动ST7735:从接线到局部刷新优化

简介:ESP8266搭配MicroPython驱动ST7735TFT屏幕的硬件SPI方案,面向嵌入式显示开发者和物联网项目爱好者,重点解决模拟SPI刷屏速率偏低、硬件SPI接口分配不明确等实际问题。压缩包体积仅约4KB,共3个Python文件,分别承担…

2026/10/14 0:37:53 阅读更多 →
无参密度估计实战指南:KDE与KNN原理、选型与避坑

无参密度估计实战指南:KDE与KNN原理、选型与避坑

1. 为什么“无参”二字值得你停下来多看两眼很多人第一次看到“无参密度估计”,下意识会想:不就是个画曲线的工具吗?套个函数、调个带宽,出图就完事。我早年也这么干过——在某图像处理Demo里,用scikit-learn的KernelD…

2026/10/14 0:37:53 阅读更多 →

最新新闻

2026 PCSX2 开源PS2模拟器:2500款老游戏在PC上稳跑

2026 PCSX2 开源PS2模拟器:2500款老游戏在PC上稳跑

2026 PCSX2 开源PS2模拟器:2500款老游戏在PC上稳跑 【免费下载链接】pcsx2 PCSX2 - The Playstation 2 Emulator 项目地址: https://gitcode.com/GitHub_Trending/pc/pcsx2 把BIOS文件丢进一个文件夹,拖入一张光盘镜像,PS2的开机动画就…

2026/10/14 2:46:28 阅读更多 →
CDL网表与LVS实战:从语法到版图提取的避坑指南

CDL网表与LVS实战:从语法到版图提取的避坑指南

简介:电路描述语言(CDL)教学演示文稿围绕C17基准电路,系统讲解如何用该语言描述电路结构、连接关系和逻辑功能,面向数字电路课程学习者、EDA入门者及需要完成电路描述实验报告的学生。内容先梳理语法规则,将…

2026/10/14 2:46:28 阅读更多 →
仓颉标准库 std.argopt 命令行参数解析指南:parseArguments 与 ArgumentSpec 实战详解

仓颉标准库 std.argopt 命令行参数解析指南:parseArguments 与 ArgumentSpec 实战详解

人工智能AI 技能文档开发工具 【免费下载链接】DocAgent 项目地址: https://gitcode.com/Cangjie-SIG/DocAgent 点击查看 免费下载 std.argopt 是仓颉(Cangjie)标准库中负责命令行参数解析的包,它提供从命令行参数字符串中解析出…

2026/10/14 2:46:28 阅读更多 →
LinkSwift:如何快速简单地完成网盘直链解析,一键拿到 8 大网盘直链

LinkSwift:如何快速简单地完成网盘直链解析,一键拿到 8 大网盘直链

LinkSwift:如何快速简单地完成网盘直链解析,一键拿到 8 大网盘直链 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘…

2026/10/14 2:46:28 阅读更多 →
Spring Data JPA实战:实体映射、事务控制与N+1优化

Spring Data JPA实战:实体映射、事务控制与N+1优化

1. 项目概述:为什么一个“JPA实战Demo”值得花三小时重写五遍你是不是也经历过这样的场景:刚学完JPA的基础注解——Entity、Id、GeneratedValue,信心满满地新建一个User类,跑起来却报org.hibernate.MappingException: Unknown ent…

2026/10/14 2:46:28 阅读更多 →
Vue 3 轻量级数据透视表组件:支持拖拽+聚合+Excel导出

Vue 3 轻量级数据透视表组件:支持拖拽+聚合+Excel导出

简介:这是一份面向Vue.js中高级开发者的数据透视表功能实现组件包,专为需要在Web应用中快速集成交互式聚合分析表格的前端工程师设计。资源提供两个核心Vue组件:支持拖放配置行列的完整数据透视表,以及轻量级仅聚合功能的PivotTab…

2026/10/14 2:45:28 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →