下学期项目需要学习opencv
,打算 python 原型设计,有精力再 CPP 优化。 CPP 的环境配置起来麻烦,我选择VS2022
作为 IDE。 PY 环境不想弄在宿主机,放到 wsl2 的 docker 里面。我的 win10 安装了Ubuntu22.04
版本的 wsl2,对于一些 linux 环境下更好做的事就用它。这台云服务器虽说也是 linux 环境,但是性能不如自己电脑。
第一步,win10 准备工作
安装Xlaunch
,下载地址 。
运行Xlaunch
选择Multiple windows
,Display number: -1
。
Start no client
。
勾选Native opengl
,硬件加速。勾选Disable access control
,放开安全策略,简单。如果有更高的保密要求,这条不勾选,需要进一步配置。
更改 win10 系统防火墙策略设置,图源知乎。
第二步,WSL2 配置 1 2 3 export LIBGL_ALWAYS_INDIRECT=1export DISPLAY=$(ip route | grep default | awk '{print $3}' ):0.0
将这两条命令加入到你的 WSL 的 shell 环境/.bashrc
或者/.zshrc
最末尾。第二条命令是自动获取主机 IP,如果失效,则用第三条命令,自己在 win 端ipconfig
来获取 IPV4,手动填入。 这时 WSL2 的 GUI 应该可以发送给 win10 了,可以通过xclock
小程序来检验。
1 2 3 sudo apt updatesudo apt install x11-apps xclock
win 系统出现可爱小闹钟即成功,如果卡在 wsl 没有反应,说明 wsl 已经运行xclock
但是 x11 转发失败。
第三步,启动docker
这个版本的 ubuntu 没安装systemd
和systemctl
,而且安装有一些坑。只能通过sudo service docker install
启动 docker。
构建一个 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 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/* RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && dpkg-reconfigure --frontend noninteractive tzdata RUN pip3 install opencv-python 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 COPY .zshrc /root/.zshrc ENV SHELL /bin/zsh WORKDIR /workspace CMD ["zsh" ]
构建镜像,快慢取决于网速。
根据镜像启动容器,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 镜像及其标签。
在 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 ] 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()
成功运行!