基于wsl2的python-opencv的docker开发环境配置

下学期项目需要学习opencv,打算 python 原型设计,有精力再 CPP 优化。
   CPP 的环境配置起来麻烦,我选择VS2022作为 IDE。
   PY 环境不想弄在宿主机,放到 wsl2 的 docker 里面。我的 win10 安装了Ubuntu22.04版本的 wsl2,对于一些 linux 环境下更好做的事就用它。这台云服务器虽说也是 linux 环境,但是性能不如自己电脑。

第一步,win10 准备工作

  • 安装Xlaunch下载地址
  • 运行Xlaunch
    1. 选择Multiple windowsDisplay number: -1
    2. Start no client
    3. 勾选Native opengl,硬件加速。勾选Disable access control,放开安全策略,简单。如果有更高的保密要求,这条不勾选,需要进一步配置。
  • 更改 win10 系统防火墙策略设置,图源知乎。

第二步,WSL2 配置

1
2
3
export LIBGL_ALWAYS_INDIRECT=1
export DISPLAY=$(ip route | grep default | awk '{print $3}'):0.0
# export DISPLAY=你的win10的IPV4:0.0

将这两条命令加入到你的 WSL 的 shell 环境/.bashrc或者/.zshrc最末尾。第二条命令是自动获取主机 IP,如果失效,则用第三条命令,自己在 win 端ipconfig来获取 IPV4,手动填入。
  这时 WSL2 的 GUI 应该可以发送给 win10 了,可以通过xclock小程序来检验。

1
2
3
sudo apt update
sudo apt install x11-apps
xclock

win 系统出现可爱小闹钟即成功,如果卡在 wsl 没有反应,说明 wsl 已经运行xclock但是 x11 转发失败。

第三步,启动docker

  1. 这个版本的 ubuntu 没安装systemdsystemctl,而且安装有一些坑。只能通过sudo service docker install启动 docker。
  2. 构建一个 docker 镜像,配置了 python 和 opencv 环境,以及常用的 zsh,vim 等小工具(这些非必须)。dockerfile如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# 使用Ubuntu作为基础镜像
FROM ubuntu:20.04

# 设置非交互式安装以避免安装过程中的交互式询问
ENV DEBIAN_FRONTEND=noninteractive

# 设置为中国国内源
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

# 安装必要的软件包
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
x11-apps \
vim \
zsh \
wget \
git \
curl \
neofetch \
figlet \
libgtk2.0-dev \
pkg-config \
libgl1-mesa-glx && \
rm -rf /var/lib/apt/lists/*

# 设置时区,例如设置为"Asia/Shanghai"
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure --frontend noninteractive tzdata


# 安装Python的OpenCV库(带GUI支持)
RUN pip3 install opencv-python


# 安装和配置oh-my-zsh

# RUN sh -c "$(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)" || true \
# && git clone https://gitee.com/zjy_1671/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting \
# && git clone https://gitee.com/chenweizhen/zsh-autosuggestions.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions

RUN sh -c "$(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)" || true \
&& git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions \
&& git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting



# 复制.zshrc文件到容器
COPY .zshrc /root/.zshrc


# 设置默认shell为zsh
ENV SHELL /bin/zsh

# 设置工作目录
WORKDIR /workspace

# 默认命令启动zsh
CMD ["zsh"]

构建镜像,快慢取决于网速。

1
docker build -t pycv2 .
  1. 根据镜像启动容器,docker run 命令参数
1
2
3
4
docker run -itd --name pycv2 \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
pycv2
  • -itd:这个组合参数使容器以交互模式运行,并分配一个伪终端(-it),同时-d 参数使容器在后台运行。

  • --name pycv2:为容器指定一个名称。

  • -e DISPLAY=$DISPLAY:设置环境变量 DISPLAY,以便容器内的应用程序知道如何连接到 X 服务器。

  • -v /tmp/.X11-unix:/tmp/.X11-unix:将宿主机上的 X11 套接字目录挂载到容器内,以实现 X11 转发。

  • pycv2:指定要运行的 Docker 镜像及其标签。

  1. 在 docker 内重复前面的步骤,安装 X11-apps,运行 xclock,如果 win10 出现熟悉的小闹钟,则说明成功。

第四步,vscode 进行 docker 开发。

vscode 安装 docker 插件,可以直接识别 WSL 中的正在运行的 docker,将文件挂载到工作区,也可以进入 shell。
  创建一个目录,传一个图片进去,再创建一个 py 文件,做一个简单的测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import cv2

# 加载图片
image = cv2.imread('fulilian.png') # 绝对路径

# 获取图片的原始高度和宽度
original_height, original_width = image.shape[:2]

# 设置最大高度为600像素
max_height = 300

# 如果原始高度大于最大高度,则计算缩放比例
if original_height > max_height:
# 计算缩放比例
scaling_factor = max_height / original_height

# 计算新的宽度,保持宽高比不变
new_width = int(original_width * scaling_factor)

# 调整图片大小
resized_image = cv2.resize(image, (new_width, max_height))
else:
# 如果原始高度小于或等于最大高度,则不需要缩放
resized_image = image

# 显示调整大小后的图片
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

成功运行!


基于wsl2的python-opencv的docker开发环境配置
http://sinlatansen.github.io/2024/02/10/基于wsl2的python-opencv的docker开发环境配置/
作者
fugu
发布于
2024年2月10日
许可协议