Python工业相机实时画面获取实战:SDK配置到稳定出图

最近有个项目要在 Python 里把一台工业机器人相机的实时画面快速调出来。听起来真不算难:SDK 一装,OpenCV 一显示,不就成了吗?但真上手才发现,从设备枚举到图像格式转换,每一环都藏着能把人绊倒半天的细节。这篇文章就把我从折腾到出图的完整过程摊开讲,包括驱动与 SDK 的关系、Python 环境里最容易漏掉的配置、调出画面的核心代码链路,以及黑屏、花屏、掉线这类高频问题的排查思路。适用对象很明确:刚拿到工业相机 SDK、准备用 Python 做视觉开发,或者已经被实时画面卡住的朋友。

1. 拿到相机别急着写代码:先把驱动、运行时的关系理清

1.1 为什么工业相机的 SDK 不能靠“pip 一下”解决

普通家用摄像头插上去就能用,因为操作系统自带 UVC 驱动。工业相机不一样,它通常走 GigE Vision、USB3 Vision、Camera Link 这类专业传输协议,厂商会提供一整套 SDK 文档和运行时库。你从 Python 侧调用的 API,底层要经过一套 C/C++ 写的本地库,再和驱动层通信,最后通过网卡或者 USB 控制器把图像数据搬进来。

我最早犯过的错就是直接找 Python 包,以为装完就能枚举相机。结果list_devices()返回空列表,排查半天,根因是厂商配套的运行时没有装,驱动没有正确挂上。所以先说结论:在写任何 Python 代码之前,先把厂商提供的相机软件套装完整安装一遍。这个套装通常包含三样东西:设备驱动、运行时库、调试工具(一般都会带一个能预览画面的客户端)。调试工具能出图,说明硬件链路通了一半,剩下的事就是 Python 侧怎么复现这条链路。

1.2 设备管理器里看不到相机,后面都白搭

GigE 接口的相机在设备管理器里通常显示为“网络摄像机”或者厂商自己的设备节点,USB3 接口则显示在“图像设备”下。我见过不少案例,问题根本不是代码,而是相机在系统层面就没被识别。

检查顺序可以这样走:

  • USB3 相机:换一个直连主板的后置 USB3 口,不要用前置延长线或 HUB。工业相机对 USB 供电稳定性很敏感,电流不足会表现为枚举成功但一拉流就断。
  • GigE 相机:先看电脑网卡 IP 和相机 IP 是否在同一网段。相机默认 IP 常见为 192.168.1.x,如果电脑是 192.168.2.x,哪怕装了驱动也搜不到。
  • 防火墙:Windows 默认防火墙会拦掉广播包和私有协议端口,安装完套装后如果枚举为空,可以临时关掉防火墙再试一次,确认问题后再去加白名单规则。

这里有一个很实用的习惯:拿到新相机,先打开厂商自带的调试软件,手动连接一次,确认能出图。不要直接跳进 Python,否则一旦出问题,你很难判断是 SDK 调用问题还是设备链路问题。

2. Python 环境配置里最容易漏掉的三个点

2.1 虚拟环境要建,但动态库路径更重要

很多教程会建议用 conda 或 venv 建一个干净的 Python 环境,这确实是对的。但工业相机 SDK 的 Python 绑定本质上是对本地动态库的封装,Windows 下是 DLL,Linux 下是 .so。这些动态库在安装软件套装时通常会放进系统路径,但也有一些版本不会自动处理,尤其是当你用非系统默认 Python 时,加载失败是常态。

我习惯的做法是:创建虚拟环境后,直接把 SDK 的库目录加到环境变量里,再启动编辑器。Windows 上可以临时在控制台执行:

set PATH=C:\Program Files\CameraSDK\lib;%PATH% python your_script.py

Linux 下就设置LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=/opt/camera_sdk/lib:$LD_LIBRARY_PATH

如果不确定动态库在哪,可以在厂商软件安装目录里搜.dll或.so文件。找不到的话,把报错信息贴到搜索引擎,比自己在代码里瞎猜快得多。

2.2 Python 版本和位数不要搞错

工业相机的 SDK 更新频率不算快,有时候官方最新绑定只支持到某个 Python 版本。我有一次拿到一台新相机,SDK 文档里明确写着支持 3.8~3.11,但我的虚拟环境是 3.12,导入包时直接段错误。后来老老实实装了 3.10 版本的环境,问题消失。

另外注意 Python 位数。绝大多数工业相机 SDK 只提供 64 位绑定,如果你电脑上装的是 32 位 Python,即使包能导入,底层库也可能加载失败。建议统一用 64 位 Python。

2.3 OpenCV 和 numpy 的安装顺序藏了一个隐形坑

画面显示一般用 OpenCV,图像数据处理用 numpy,这俩几乎必装。但不要小看它们的版本匹配问题。工业相机的图像数据是裸像素数据,numpy 负责把它包装成数组,如果 numpy 版本太新或者 OpenCV 版本太旧,某些像素格式转换时会出奇怪的错误。

一个稳妥的组合是:

pip install numpy==1.26.4 opencv-python==4.10.0.84

注意不要随手pip install opencv-contrib-python,不同发行包在某些接口上的行为有差异,遇到诡异的报错时,可以先换成基础版试试。这也是我踩过的一次坑:装了 contrib 版后,图像写入显示窗口时颜色通道顺序莫名其妙,排查到最后才发现是包的问题。

3. 调出画面的完整代码链路:枚举、打开、取流、显示

3.1 先跑通最小示例,再考虑封装

很多人喜欢一上来就写一个类,把设备管理、采集回调、显示全部封装好。这本身没错,但调试时非常痛苦。我第一次做这类项目时,也想着一步到位,结果代码越写越多,出错了都不知道是底层库报的,还是自己的封装逻辑有问题。

后来我学乖了:先写一个能出画面的“过程式脚本”,全程不超过六十行。确认链路通了,再去封装成类。下面的代码是我习惯的最小示例,API 名称因厂商而异,但方法顺序基本一致:

import numpy as np import cv2 from camera_sdk import DeviceManager # 厂商SDK的Python绑定 # 1. 创建设备管理器,枚举相机 manager = DeviceManager() devices = manager.list_devices() if not devices: raise RuntimeError("没有找到相机,请检查驱动和连接") print("发现相机:", devices[0].name, devices[0].serial_number) # 2. 打开第一个设备 camera = manager.open_device(devices[0]) camera.set_parameter("TriggerMode", "Off") # 连续采集模式 camera.set_parameter("ExposureTime", 5000) # 曝光时间,单位微秒 # 3. 开始取流 camera.start() while True: frame = camera.get_frame(timeout=1000) # 返回原始帧对象 if frame is None: print("获取帧超时") continue # 4. 原始数据转 numpy 数组 image = np.frombuffer(frame.buffer, dtype=np.uint8) image = image.reshape(frame.height, frame.width) # 默认灰度图 # 5. 显示 cv2.imshow("camera", image) if cv2.waitKey(1) & 0xFF == ord('q'): break camera.stop() camera.close()

这段代码里最容易出问题的就是第 4 步的 reshape。相机输出的可能是灰度图、Bayer 格式、YUV 格式,不能盲目当成三通道 BGR。不同厂商的 SDK 在 Python 绑定里一般都有辅助转换函数,或者会提供像素格式枚举值。如果没提供,你需要根据PixelFormat字段自己判断。

3.2 图像格式转换:把“裸数据”变成能看的画面

工业相机默认输出的图像格式五花八门,常见的有 Mono8、Mono12、BayerGB8、BayerRG8、YUV422 等。OpenCV 能直接显示的是 BGR 三通道或单通道 8 位图,所以这里几乎总会有一层转换。

一个小技巧:判断像素格式最简单的方法是看frame.pixel_format字段,然后走对应的分支。比如遇到 Bayer 格式,可以用 OpenCV 的cv2.cvtColor做去马赛克处理:

if pixel_format == "BayerRG8": bgr = cv2.cvtColor(image, cv2.COLOR_BayerRG2BGR) elif pixel_format == "Mono8": bgr = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)

至于 Mono12 这样的高位数格式,一般 SDK 会返回 16 位数组,你需要自己做位映射。简单粗暴的做法是右移 4 位变成 8 位,但这样做会损失暗部细节。更稳妥的是先统计图像的最大最小值,再做线性拉伸,让对比度更自然。

3.3 显示窗口的响应问题

如果直接在一个无限循环里不断cv2.imshow,窗口偶尔会无响应,尤其在帧率比较高的时候。这跟 OpenCV 的 GUI 事件循环有关,不是因为相机卡了。解决办法是在循环里加入cv2.waitKey(1),它既能刷新窗口,又可以监听键盘按键。

帧率超过 60 时,显示往往会成为瓶颈。工业相机动辄 100fps 以上,你的显示器未必跟得上,而且 OpenCV 的显示线程还会拖慢取流。这时建议把取流和显示拆开,用一个队列来缓冲图像,显示线程每隔几十毫秒取最新帧。这样既保证取流不丢帧,也避免 GUI 卡顿。下面第 4 节会详细讲。

4. 从“能出图”到“稳定出图”:回调、队列与断线重连

4.1 为什么不要在循环里反复 get_frame

最开始的写法是while True: get_frame(),简单直接,但有两个问题。

第一,轮询模式会占用大量 CPU,而且帧率不稳定。如果你在循环里做点耗时操作(比如图像处理),下一帧的获取可能直接超时,最终表现为画面一顿一顿。

第二,工业相机的数据量很大,SDK 内部一般有缓冲队列。轮询拉帧如果拉得慢,缓冲队列会堆满,新帧就会开始丢弃。你可能发现画面延迟越来越高,最后干脆卡死。

我的经验是:只要能获取原图的数据指针,改成回调模式,性能会有明显改善。回调的思路是让 SDK 底层在每帧图像到达时主动通知你,你只需要把帧数据推到一个线程安全的队列里,主线程负责显示和处理。

4.2 回调模式的代码模板

不同厂商的回调接口风格不同,但用 Python 封装后的逻辑基本可以统一成这样:

import queue import threading frame_queue = queue.Queue(maxsize=4) def on_frame(frame): # 回调里不要做耗时操作,只负责入队 if frame_queue.full(): try: frame_queue.get_nowait() # 丢旧帧,保证实时性 except queue.Empty: pass frame_queue.put(frame) camera.set_callback(on_frame) camera.start() while True: try: frame = frame_queue.get(timeout=0.1) except queue.Empty: continue image = convert_frame_to_bgr(frame) cv2.imshow("camera", image) if cv2.waitKey(1) & 0xFF == ord('q'): break

这里我把队列容量设为 4,满了就丢旧帧。很多人不理解为什么要“丢帧”,明明追求的是完整采集。但实时预览和离线采集是两回事:预览时你关心的是“当前的画面”,而不是“每一帧都处理”;如果处理速度跟不上采集速度,队列越堆越大,延迟就越不可控。丢旧帧是为了保证画面始终接近实时。

4.3 断线重连:写一个简单但可靠的重连机制

工业现场偶尔会遇到相机掉线的情况:网线松动、USB 控制器故障、设备长时间运行后固件卡死。如果代码里不做处理,get_frame会一直超时,或者干脆抛异常,程序就挂在那了。

我给一个保守但可靠的做法:在 get_frame 超时连续 N 次后,主动执行 stop -> close -> 重新枚举 -> 重新 open -> 重新 start。像这样:

def safe_acquire(camera, manager, device, max_timeout_count=5): timeout_count = 0 while True: try: frame = camera.get_frame(timeout=1000) if frame is None: timeout_count += 1 if timeout_count >= max_timeout_count: print("连续超时,尝试重连") camera.stop() camera.close() camera = manager.open_device(device) camera.start() timeout_count = 0 continue timeout_count = 0 yield frame except Exception as e: print("拉流异常:", e) time.sleep(1) continue

这样即使相机断了,程序也能自动恢复,不会影响整个视觉系统的稳定性。注意重连后要重新设置之前调好的曝光、增益等参数,很多相机的参数在 close 后会恢复默认值。

4.4 多相机场景下的队列隔离

如果你同时接了多台相机,每一台都应该有独立的队列和显示窗口。不要把多个相机的帧推到同一个队列里,否则会因为处理不及时导致某些相机掉帧。我的习惯是给每台相机分配一个 worker 线程,线程内部只跑“取流 -> 入队”;主线程按需从队列取帧做处理。这个结构后续扩展也很方便,加一台相机就加一个 worker。

5. 黑屏、花屏、掉线:三个高频问题的排查记录

5.1 相机枚举不到:先从三层逐个排查

这个问题出现的频率最高,我前前后后帮别人排查过不少次,发现 90% 的情况都出在物理层和网络层,而不是 SDK 调用。

我做了一个简单的排查表,你可以直接照着走:

现象可能原因排查动作
枚举列表为空(USB 相机)供电不足、USB 控制器带宽不够换直连后置 USB3 口,拔掉其他 USB 高带宽设备,检查线材是否带屏蔽
枚举列表为空(GigE 相机)IP 不在同一网段、防火墙拦截用相机厂商工具看当前 IP,手动设置网卡固定 IP 到同一网段,临时关防火墙验证
枚举到了但打开失败相机被其他软件占用关掉厂商调试软件、其他视觉软件,确认没有第二个进程打开该相机
枚举到了但一拉流就断驱动异常、固件问题重新安装驱动,升级固件,重启相机(断电再上电)

这里有一个容易被忽略的点:Windows 系统默认把网卡电源管理设为“允许计算机关闭此设备以节约电源”。这对 GigE 相机来说简直是灾难,因为一断电,相机就掉线了。解决方案是在设备管理器的网卡属性里,把“电源管理”选项卡中的节能选项全部关掉。

5.2 黑屏:大多不是相机坏了,是参数逻辑不对

拉流成功、窗口也弹出来了,但图像全黑或死白,这通常不是硬故障,而是以下三个参数在打架:

一是触发模式。很多相机默认TriggerMode是 On,意思是你必须给一个外部或软触发信号,相机才出一帧。如果你没发触发信号,又启动了取流,那拿到的就是空帧,表现出来就是黑屏或画面不变。代码里显式设置为TriggerMode = Off,让相机处于连续采集模式,预览阶段就舒服了。

二是曝光时间和增益。曝光时间过低,场景暗一点就直接黑屏。排查时可以先把曝光时间设大一点,比如 20000 微秒,增益先拉到一个中间值,看到画面后再慢慢调小。记住先调曝光,再调增益,最后调节光圈(如果有镜头控制的话)。

三是图像格式和帧指针问题。有时候画面不是全黑,而是花屏、颜色偏绿,这更可能是 Bayer 格式没做去马赛克,或者通道顺序搞反了。遇到这种问题,先把PixelFormat打到 Mono8 试一下,排除彩色格式转换的干扰,再回头慢慢处理 Bayer。

5.3 花屏或掉线:带宽和缓冲的账要算清楚

花屏的一个常见诱因是 GigE 相机的网络包丢失。数据量超过网卡带宽时,交换机来不及转发,相机端的包就被丢弃,图像在接收端就会出现花屏、条纹。计算带宽很简单:

带宽需求 = 图像宽 x 图像高 x 像素位深 / 8 / 传输帧率

比如 2448 x 2048 的相机,像素位深 8 位,目标帧率 60fps,每秒数据量大概是:

2448 x 2048 x 8 / 8 / 1024 / 1024 x 60 = 大约 574 MB/s

这个数字远超千兆网的 125 MB/s 上限,所以“帧率标称多少,实际就能跑多少”是不现实的。要么降低帧率,要么开相机 ROI,要么使用多网卡链路聚合,要么上 10G 网卡。

USB3 相机也有类似问题,但通常不是网卡带宽,而是 USB 控制器带宽被多个设备挤占。可以把相机的 UVC 同步传输带宽优先级调高,或者确保一台电脑只在一张主控卡上接一台高分辨率相机。

还有一个容易被忽视的点:巨型帧(Jumbo Frame)。如果你的网卡和交换机都支持,可以把网卡的巨型帧开启到 9000,这样每个网络包能承载的数据更多,包数量变少,丢包率会下降。但要注意,相机、网卡、交换机三者的巨型帧设置必须一致,否则反而会出问题。

掉线问题则要检查缓冲设置。很多 SDK 都有“采集缓存节点数”这个参数,默认值可能是 3~5,在高速采集时不够用。可以适当调大,比如 16 或 32,能明显降低掉帧和掉线概率。代价是内存占用会上升,计算一下:单帧 20MB 的话,32 个缓存节点就是 640MB,服务器内存最好预留出这个余量。

5.4 画面延迟越来越大:队列堆积和系统调度的问题

有时候刚启动时画面很流畅,跑几个小时之后越来越卡,延迟肉眼可见地增加。这种问题多半是图像消费速度跟不上生产速度,导致链路里不断堆积帧。

第一步,检查自己的处理循环里是否有耗时操作。像cv2.waitKey本身的耗时很低,但如果你在循环里做了大尺寸图像高斯模糊、轮廓查找,甚至深度学习推理,一帧要花几十毫秒,再高的采集帧率也白搭。建议把预处理和显示分开线程。

第二步,检查系统电源计划。Windows 的“节能”模式下,CPU 频率会被压低,程序尤其是 Python 这种解释型语言容易跑不动。把电源计划改成“高性能”,很多奇怪的速度问题会直接消失。

第三步,如果你用笔记本做开发,注意散热。工业相机长时间高帧率跑,CPU 占用高,笔记本散热跟不上就会触发降频,整个程序变慢,看起来就像是相机“掉帧”了。

最后说点个人体会

如果你也正准备做类似的事,我最大的建议不是先去精读 SDK 文档,而是花半小时把下面这条路径走通:装好软件套装 -> 调试工具出图 -> 写最小 Python 脚本 -> 显示到 OpenCV 窗口。这条链路通了,后面再慢慢加曝光、触发、多相机、图像处理都不迟。我见过太多人一上来就写多线程管理器,结果连基础出图都没跑通,排查起来非常痛苦。先让画面亮起来,再谈工程化,这是工业相机开发里最值得记住的顺序。

相关新闻

Tomcat 9与Tomcat 11同机共存:端口、环境变量与配置实操

Tomcat 9与Tomcat 11同机共存:端口、环境变量与配置实操

最近接手了一个交接过来的老项目,用的还是 Tomcat 9,而新起的服务又要求跑在 Tomcat 11 上。开发机就一台,来回卸了装、装了卸,折腾两天后我实在忍不了了——干脆研究了一下怎么让两个版本在同一台电脑上和平共处。这篇文章就是把…

2026/10/20 2:55:46 阅读更多 →
CNN-RNN-Attention时间序列预测实战:从数据处理到模型调参

CNN-RNN-Attention时间序列预测实战:从数据处理到模型调参

前阵子有个朋友做某园区的能耗预测,单用 LSTM 效果一直卡在同一个台阶上,尖峰时刻总是慢半拍。我让他试试在 LSTM 前后分别加一层卷积和注意力,也就是标题里说的 CNN-RNN-Attention 结构,同一份数据上误差肉眼可见地往下走。时间序…

2026/10/20 2:55:46 阅读更多 →
MATLAB实现P-III型分布水文频率计算与适线法

MATLAB实现P-III型分布水文频率计算与适线法

简介:这份资源面向水文统计、工程计算与数据分析领域的学习者,提供在MATLAB中实现皮尔逊-III型(P3)分布的完整代码与示例数据,帮助完成数据建模、预测分析与不确定性评估。压缩包共2个文件,包含1个m脚本与1…

2026/10/20 2:55:46 阅读更多 →

最新新闻

context-mode:为命令行工具设计可复现的上下文状态管理层

context-mode:为命令行工具设计可复现的上下文状态管理层

你有没有遇到过这种场景:打开终端,先export一串环境变量,再cd到项目目录,然后才开始真正干活。如果只是顺手敲两下还好,但如果你同时在维护三五个项目,每个项目还对应不同的 API 地址、不同的分支策略、不同…

2026/10/20 3:52:15 阅读更多 →
Linux数据盘格式化实战:设备确认、分区、mkfs与挂载避坑指南

Linux数据盘格式化实战:设备确认、分区、mkfs与挂载避坑指南

1. 格式化前先搞清楚这几件事接到一台机器,客户说数据盘满了,想要重新格式化,我第一句话永远都是:数据备份了吗?这不是客套,是血泪教训。Linux下格式化硬盘这个操作,新手看起来就是一条mkfs.ext…

2026/10/20 3:52:15 阅读更多 →
多传感器数据分析:从nuScenes坐标系对齐到BEV特征构建全流程

多传感器数据分析:从nuScenes坐标系对齐到BEV特征构建全流程

简介:面向自动驾驶研究与工程实践,这份资源以nuScenes多模态数据集为核心,提供基于Python的解析与可视化代码,适合需要处理LiDAR、摄像头、毫米波雷达等传感器数据的研究者与开发者。压缩包共8个文件,以Python脚本为主…

2026/10/20 3:52:15 阅读更多 →
Kubernetes四大节点组件原理与故障排查指南

Kubernetes四大节点组件原理与故障排查指南

1. 什么是Kubernetes节点组件?它到底在解决什么问题?你可能已经听过“K8s是云原生时代的操作系统”这种说法,但真正用过的人会发现:这句话不是比喻,而是事实——只不过这个“操作系统”不装在你的笔记本里,…

2026/10/20 3:52:15 阅读更多 →
构建个人技能体系:从清单到矩阵的迭代实战

构建个人技能体系:从清单到矩阵的迭代实战

“skills”这个标题看上去太简单了,简单到一眼扫过去容易直接略过。但你真把它当成一个项目来对待的时候,它可能是很多人一直想做、却迟迟没动手做对的那件事:把自己的技能体系盘清楚、搭起来、用起来。我不是在讲一个概念,我是把…

2026/10/20 3:52:15 阅读更多 →
本地推理实战:用llama.cpp与ollama部署LFM2.5-1.2B小模型

本地推理实战:用llama.cpp与ollama部署LFM2.5-1.2B小模型

1. 上手前的心里话:为什么大家都盯着小模型本地推理最近圈子里聊本地大模型,基本绕不开两个东西:llama.cpp 和 ollama。而我这段时间一直在折腾的主角,是 LFM2.5-1.2B 这个模型。别看它只有 1.2B 参数,实测下来每秒能跑…

2026/10/20 3:51:14 阅读更多 →

日新闻

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/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/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 阅读更多 →