rk3588目标检测:Jupyter中OpenCV实时预览方法

传统的 plt.imshow 在循环中绘图会非常卡顿,而 ipywidgets.Image 组件允许我们直接将 OpenCV 编码后的字节流推送到浏览器前端,实现接近实时的丝滑预览。

1. 环境准备 (安装)

在你的 CLI 系统(服务器、树莓派等)终端执行:

shell 复制代码
# 确保安装了核心库
pipx install opencv-python jupyterlab ipywidgets

# 如果你使用的是较旧的 Jupyter Notebook (version < 6),可能需要执行以下插件启用命令:
# jupyter nbextension enable --py widgetsnbextension

pipx安装后需要激活一下路径

bash 复制代码
# 编辑 bash 配置文件 
nano ~/.bashrc

# 加入 pipx 安装的 JupyterLab 路径 
export PATH=$HOME/.local/bin:$PATH

# 保存(nano编辑器:按 Ctrl+O → 回车 → Ctrl+X) 
source ~/.bashrc

我用uv单独创建了一个虚拟环境

bash 复制代码
uv venv --python 3.12
source .vevn/bin/activate

2. 启动 Jupyter:

在服务器终端输入:

shell 复制代码
jupyter-lab --no-browser
# jupyter-lab --no-browser --allow-root

如果服务器有代理的话,会打印代理的端口,注意这个不是服务的端口

arduino 复制代码
Extensions will be fetched using proxy, proxy host and port: ('127.0.0.1', 'xxx')

正常启动后,会有提示服务真正的端口,以及token(后续使用)

shell 复制代码
http://xxxx:3129/lab?token=xxxx
http://127.0.0.1:3129/lab?token=xxxx

3. 局域网直连(内网)

启动命令必须包含 --ip=0.0.0.0

shell 复制代码
jupyter-lab --ip=0.0.0.0 --no-browser
# jupyter-lab --ip=0.0.0.0 --no-browser --allow-root

连接成功后:

  • 打开在浏览器并输入xxx.xxx.xxx.xxx:3129,xxx.xxx.xxx.xxx是服务器的ip
  • 输入服务器启动时生成的 token 即可进入。第一次登录时需要它

如果不加 --ip=0.0.0.0,Jupyter 默认会绑定在 localhost(即 127.0.0.1)上。这意味着:只有服务器"自己"能访问这个 Jupyter 服务。 即便你在同一办公室、同一 Wi-Fi 下,在本地浏览器输入 xxx.xxx.xxx.xxx:3129 也会显示 "拒绝连接"。因为 Jupyter 此时只听命于服务器内部的请求,对来自外部网卡的信号"充耳不闻"。

如果你没加这个参数,但又想在自己的电脑上看到界面,唯一的办法就是建立SSH 隧道。隧道的作用是欺骗 Jupyter,让它以为请求是从服务器内部发出的

3. 在本地电脑建立连接(SSH 隧道)

只有在局域网不通、防火墙严密或需要加密传输时才使用。 在你自己的电脑(Windows 命令行、Mac 终端或 Linux 终端)开启一个新的窗口,执行以下命令:

shell 复制代码
ssh -L 8888:localhost:3129 用户名@服务器IP地址
  • 8888:是你本地浏览器访问时用的端口(找一个未使用的就可以)。
  • 3128:是远程服务器上 Jupyter 运行的端口。
  • 用户名@服务器IP:替换为你的远程登录信息。

连接成功后:

  • 保持该终端窗口不要关闭。
  • 在本地浏览器地址栏输入:http://localhost:8888
  • 输入服务器启动时生成的 token 即可进入。

4. 测试opencv

1. 使用 IPython 内置组件(最简单、原汁原味)

如果你只是想打开一张现有的图片文件,不需要安装任何额外库:

python 复制代码
from IPython.display import Image, display
display(Image(filename='test.jpg'))

2. 结合 OpenCV 查看(最常用)

由于 OpenCV 读取的图片是 BGR 格式,而浏览器显示需要 RGB,所以必须转换一下,配合 matplotlib 显示:

python 复制代码
import cv2
import matplotlib.pyplot as plt

# 读取一张图片(请确保服务器上有这张图)
img = cv2.imread('test.png') 

if img is None:
    print("图片加载失败,请检查路径")
else:
    # OpenCV 是 BGR,Matplotlib 需要 RGB
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.imshow(img_rgb)
    plt.axis('off')
    plt.show()

在 Jupyter 中用 OpenCV 时,千万不要写 cv2.imshow()。这会导致服务器尝试在后台开启窗口,由于没有显示器,Jupyter 内核(Kernel)会直接挂起或崩溃。

如果想要查看视频

shell 复制代码
from IPython.display import Video
Video("test.mp4")

或者

shell 复制代码
from IPython.display import HTML

HTML("""
    <video alt="test" controls>
        <source src="test.mp4" type="video/mp4">
    </video>
""")
相关推荐
青柠代码录3 小时前
【SpringBoot】集成 Swagger
后端
1104.北光c°3 小时前
【重写优化 新增绘图】布谷鸟过滤器:布隆过滤器的更优缓存穿透解?
java·开发语言·后端·缓存·缓存穿透·布隆过滤器·布谷鸟过滤器
m0_694845573 小时前
RevelGo搭建教程:类Rails开发体验的Go Web框架
服务器·开发语言·后端·docker·golang·开源·github
希望永不加班4 小时前
SpringBoot 整合 Redis 缓存
spring boot·redis·后端·缓存·wpf
cch89185 小时前
易语言VS Go语言:编程语言大对决
开发语言·后端·golang
EmbeddedCore5 小时前
基于 MQTT+JSON 的物联网网关物模型通讯协议(极致精简・缩写版)
java·后端·struts
lifewange5 小时前
Ruby语言在测试领域的应用
开发语言·后端·ruby
披着羊皮不是狼6 小时前
从零搭建 Spring Boot 3 + 本地大模型 (Ollama) 的 AI 开发环境
人工智能·spring boot·后端
xnkyn6 小时前
frp内网穿透https访问本地服务,frpee客户端https教程
前端·后端·网络协议·http·https
妙蛙种子3116 小时前
【Java设计模式 | 创建者模式】单例模式
java·开发语言·后端·单例模式·设计模式