传统的 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>
""")