下学期项目需要学习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配置

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

  1. 这个版本的ubuntu没安装systemdsystemctl,而且安装有一些坑。只能通过sudo service docker install启动docker。
  2. 构建一个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 .
  3. 根据镜像启动容器,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镜像及其标签。
  1. 在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()

  成功运行!