2、工控机环境搭建:Ubuntu系统安装、OpenCV编译安装、Python虚拟环境配置

工控机环境搭建,说白了就是给你的机器装上趁手的工具。这一步要是没做好,后面写代码、跑视觉算法,处处都是坑。我这些年折腾过的工控机不下几十台,从X86到ARM架构,从Ubuntu 16.04到22.04,踩过的雷能写一本小册子。今天咱们就一步步来,把环境搭得稳稳当当。

2.1 Ubuntu系统安装——选对版本很重要

工控机不比普通PC,硬件五花八门。我个人习惯用Ubuntu 20.04 LTS,为什么?因为它的驱动支持最全,OpenCV的兼容性也最好。你想想看,工控机上的摄像头、采集卡,很多厂家只提供20.04的驱动包。你要是装个22.04,可能就得自己编译驱动了。

注意: 别用Ubuntu 18.04了,Python版本太老。也别追新用22.04,有些工业相机SDK还没适配。

安装步骤其实不复杂,但有几个关键点:

  1. 制作启动盘——用Rufus或者balenaEtcher,别用UltraISO。我遇到过用UltraISO做的盘,工控机死活不认。
  2. 分区方案——建议分三个区:/boot 给1GB,/ 给50GB,剩下的全给 /home。为什么?因为OpenCV编译出来的库文件、虚拟环境里的包,全在home目录下。
  3. 安装时断网——这个很多人不知道。联网安装会下载更新,慢得要命。先断网装完系统,再换国内源更新。

装完之后,第一件事换源。我习惯用清华源:

sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y

2.2 OpenCV编译安装——别偷懒用pip

很多人图省事,直接 pip install opencv-python。嗯,这里要注意,这样装出来的OpenCV不支持GStreamer、不支持CUDA、不支持很多工控机需要的功能。说白了就是个阉割版。

我在项目中遇到过,用pip装的OpenCV,连个USB摄像头都打不开。后来查了半天,发现是缺少V4L2支持。所以,工控机上一定要源码编译。

核心思路: 编译OpenCV时,把需要的模块都勾上。工控机视觉系统,至少需要:GStreamer、V4L2、CUDA(如果有NVIDIA显卡)、TBB加速。

编译前先装依赖:

sudo apt install build-essential cmake git pkg-config
sudo apt install libjpeg-dev libtiff5-dev libpng-dev
sudo apt install libavcodec-dev libavformat-dev libswscale-dev
sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt install libv4l-dev v4l-utils
sudo apt install libgtk-3-dev
sudo apt install libatlas-base-dev gfortran

然后下载源码,我建议用4.8.0版本,稳定且bug少:

wget -O opencv.zip https://github.com/opencv/opencv/archive/4.8.0.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.8.0.zip
unzip opencv.zip && unzip opencv_contrib.zip

编译配置是关键。我习惯用这样的CMake参数:

cd opencv-4.8.0
mkdir build && cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D WITH_TBB=ON \
      -D WITH_V4L=ON \
      -D WITH_GSTREAMER=ON \
      -D WITH_CUDA=ON \
      -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.8.0/modules \
      -D BUILD_opencv_python3=ON \
      -D PYTHON3_EXECUTABLE=$(which python3) \
      -D PYTHON3_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \
      -D PYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
      ..
小技巧: 编译时用 make -j$(nproc) 并行编译。工控机如果内存不够(比如4GB),建议用 make -j2,否则会卡死。我曾经在2GB内存的工控机上编译,忘了限制线程数,结果系统直接OOM了。

编译完成后:

sudo make install
sudo ldconfig

验证一下:

python3 -c "import cv2; print(cv2.getBuildInformation())"

看到输出里有 GStreamer: YESV4L/V4L2: YES,就说明编译成功了。

2.3 Python虚拟环境配置——隔离是王道

工控机上跑视觉项目,最怕什么?依赖冲突。这个项目要OpenCV 4.5,那个项目要4.8,还有的项目要TensorFlow 1.x。如果不隔离,早晚会出问题。

我建议用 venv 或者 conda。工控机上我习惯用 venv,因为它轻量,不占空间。

先装好Python3和venv:

sudo apt install python3 python3-pip python3-venv
python3 -m pip install --upgrade pip

然后创建虚拟环境。我习惯把虚拟环境放在项目目录下,方便管理:

mkdir ~/vision_project && cd ~/vision_project
python3 -m venv venv
source venv/bin/activate

激活后,你会看到命令行前面多了 (venv) 字样。这时候安装的包,都只在这个环境里生效。

注意: 如果你用源码编译的OpenCV,虚拟环境里是找不到的。需要手动链接。在 venv/lib/python3.8/site-packages/ 下创建一个软链接:
ln -s /usr/local/lib/python3.8/site-packages/cv2/python-3.8/cv2.cpython-38-x86_64-linux-gnu.so cv2.so
路径根据你的Python版本调整。

常用的包一次性装好:

pip install numpy matplotlib scipy
pip install pillow imutils
pip install pyserial  # 工控机经常要跟PLC通信
pip install flask     # 有时候需要搭个简单的Web服务

把依赖导出到文件,方便以后复现:

pip freeze > requirements.txt

下次换机器,直接 pip install -r requirements.txt 就行。

2.4 避坑指南——我踩过的那些雷

环境搭建这块,坑是真的多。我挑几个典型的说说:

  • OpenCV编译报错找不到CUDA——多半是NVIDIA驱动没装好。先跑 nvidia-smi 看看能不能识别显卡。不能的话,去官网下驱动手动装。
  • 虚拟环境里import cv2报错——检查一下软链接路径对不对。我曾经因为Python版本搞混了,链接到了3.6的目录,结果环境是3.8的,折腾了半天。
  • 工控机重启后摄像头打不开——多半是权限问题。把用户加到video组:sudo usermod -aG video $USER,然后注销重登。
  • 编译到一半卡死——工控机内存不够。用 make -j1 单线程编译,虽然慢,但至少不会崩。

嗯,环境搭建就这些。别嫌麻烦,这一步做好了,后面写代码、调算法,顺风顺水。要是这一步偷懒,后面每跑一个项目,都可能被环境问题卡住。

下一章,咱们开始讲工控机上的相机驱动与图像采集。到时候会用到今天装好的OpenCV,记得把环境准备好。