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

6 阅读3分钟

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

1. 环境准备 (安装)

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

# 确保安装了核心库
pipx install opencv-python jupyterlab ipywidgets

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

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

# 编辑 bash 配置文件 
nano ~/.bashrc

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

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

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

uv venv --python 3.12
source .vevn/bin/activate

2. 启动 Jupyter:

在服务器终端输入:

jupyter-lab --no-browser
# jupyter-lab --no-browser --allow-root

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

Extensions will be fetched using proxy, proxy host and port: ('127.0.0.1', 'xxx')

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

http://xxxx:3129/lab?token=xxxx
http://127.0.0.1:3129/lab?token=xxxx

3. 局域网直连(内网)

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

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 终端)开启一个新的窗口,执行以下命令:

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

连接成功后:

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

4. 测试opencv

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

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

from IPython.display import Image, display
display(Image(filename='test.jpg'))

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

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

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)会直接挂起或崩溃。

如果想要查看视频

from IPython.display import Video
Video("test.mp4")

或者

from IPython.display import HTML

HTML("""
    <video alt="test" controls>
        <source src="test.mp4" type="video/mp4">
    </video>
""")