2、工控机环境搭建:Ubuntu系统安装、OpenCV编译安装、Python虚拟环境配置
工控机环境搭建,说白了就是给你的机器装上趁手的工具。这一步要是没做好,后面写代码、跑视觉算法,处处都是坑。我这些年折腾过的工控机不下几十台,从X86到ARM架构,从Ubuntu 16.04到22.04,踩过的雷能写一本小册子。今天咱们就一步步来,把环境搭得稳稳当当。
2.1 Ubuntu系统安装——选对版本很重要
工控机不比普通PC,硬件五花八门。我个人习惯用Ubuntu 20.04 LTS,为什么?因为它的驱动支持最全,OpenCV的兼容性也最好。你想想看,工控机上的摄像头、采集卡,很多厂家只提供20.04的驱动包。你要是装个22.04,可能就得自己编译驱动了。
安装步骤其实不复杂,但有几个关键点:
- 制作启动盘——用Rufus或者balenaEtcher,别用UltraISO。我遇到过用UltraISO做的盘,工控机死活不认。
- 分区方案——建议分三个区:
/boot给1GB,/给50GB,剩下的全给/home。为什么?因为OpenCV编译出来的库文件、虚拟环境里的包,全在home目录下。 - 安装时断网——这个很多人不知道。联网安装会下载更新,慢得要命。先断网装完系统,再换国内源更新。
装完之后,第一件事换源。我习惯用清华源:
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支持。所以,工控机上一定要源码编译。
编译前先装依赖:
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: YES、V4L/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) 字样。这时候安装的包,都只在这个环境里生效。
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,记得把环境准备好。