下学期项目需要学习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配置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小程序来检验。sudo apt update sudo 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如下:# 使用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"] 构建镜像,快慢取决于网速。docker build -t pycv2 .根据镜像启动容器,docker run命令参数。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文件,做一个简单的测试。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() 成功运行!