Ubuntu 16.04通过Anaconda源码编译安装OpenCV全流程指南
1. 项目背景与核心价值
在Ubuntu 16.04这个经典的LTS发行版上,通过Anaconda来安装OpenCV,这件事听起来简单,但实际操作起来,尤其是在一个已经停止官方维护的系统上,绝对是一个能让你深刻理解Python包管理、系统依赖和编译兼容性的“绝佳”实践。我之所以用“绝佳”这个词,是因为这个过程里你会遇到各种版本冲突、依赖缺失和网络问题,而解决它们的过程,恰恰是提升你环境搭建和问题排查能力的硬核训练。
OpenCV作为计算机视觉领域的基石库,其重要性不言而喻。而Anaconda则以其强大的环境隔离和包管理能力,成为数据科学和机器学习开发者的首选。将两者结合,在Ubuntu 16.04上构建一个稳定、独立的视觉开发环境,其核心价值在于:隔离性和可复现性。你可以为不同的项目创建独立的conda环境,分别安装不同版本的OpenCV,而不用担心污染系统Python环境或与其他项目产生冲突。这对于需要同时维护多个涉及不同版本OpenCV库的项目来说,是至关重要的。
然而,Ubuntu 16.04已于2021年4月结束标准支持,其自带的软件源仓库很多已经不再更新。这意味着,当你试图用apt安装一些系统级的开发依赖时,可能会发现包找不到或者版本过于陈旧。同时,Anaconda的默认频道(channels)也在不断调整,一些旧的镜像链接(比如你搜索热词里出现的anaconda/pkgs/free)已经失效,直接使用conda install可能会遇到“HTTP 404”错误。因此,这个任务远不止是输入一行安装命令那么简单,它涉及到源配置、依赖梳理、编译选项选择等一系列细节。接下来,我将以一个完整的、可复现的流程,带你走通这条路,并重点剖析那些容易踩坑的环节。
2. 前期准备:系统、Anaconda与编译环境搭建
在开始安装OpenCV之前,我们必须确保地基是稳固的。这包括一个可用的Ubuntu 16.04系统、正确安装和配置的Anaconda,以及一套完整的编译工具链。
2.1 Ubuntu 16.04基础系统检查与更新
首先,确认你的系统版本。打开终端,执行:
lsb_release -a你应该能看到类似Description: Ubuntu 16.04.7 LTS的输出。虽然官方支持已结束,但我们可以通过修改软件源为旧版本存档仓库来继续获取必要的包。
备份原有的源列表文件,然后将其内容替换为指向old-releases.ubuntu.com的源。这是Ubuntu为已结束支持的版本提供的存档。
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup sudo sed -i 's/archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list sudo sed -i 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list更新软件包列表并升级已安装的包:
sudo apt update sudo apt upgrade -y这个过程可能会比较慢,因为要从存档服务器拉取数据。升级完成后,建议重启系统以确保所有更新生效。
2.2 Anaconda的安装与基础配置
从Anaconda官网下载适用于Linux的安装脚本。由于网络原因,直接下载可能较慢,可以考虑使用国内镜像。这里以清华大学开源软件镜像站为例:
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh注意:请根据你的需求选择Python 3.x版本对应的Anaconda安装包。对于OpenCV等科学计算库,Python 3.7-3.10通常是兼容性较好的选择。
运行安装脚本:
bash Anaconda3-2023.09-0-Linux-x86_64.sh安装过程中,注意看提示,建议将Anaconda安装到你的用户目录下(例如/home/your_username/anaconda3),并在最后一步选择“yes”来让安装程序初始化conda。这样,每次打开终端,conda的基础环境就会自动激活。
安装完成后,关闭并重新打开终端,或者执行source ~/.bashrc来使配置生效。验证安装:
conda --version接下来,为了加速后续包的下载,我们需要配置conda的国内镜像。编辑~/.condarc文件(如果不存在则创建):
channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud配置完成后,运行conda clean -i清除索引缓存,再运行conda update conda测试通道是否可用。这个步骤至关重要,它能有效避免你搜索热词中出现的unavailableinvalidchannel: http 404 not found这类错误。
2.3 编译依赖与系统开发包的安装
OpenCV是一个庞大的C++库,通过conda安装的预编译包(conda install opencv)虽然方便,但有时可能不包含某些额外的模块(如contrib模块),或者与你的CUDA版本不匹配。因此,从源码编译是更灵活、更可控的选择。编译需要一系列开发工具和库。
首先,安装基础的编译工具:
sudo apt install build-essential cmake git pkg-config -y然后,安装图像、视频I/O以及图形界面依赖。这些是OpenCV核心功能所必需的:
sudo apt install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev -y sudo apt install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev -y sudo apt install libxvidcore-dev libx264-dev -y sudo apt install libgtk-3-dev -y注意:在Ubuntu 16.04上,
libpng12-dev是可用版本。在高版本Ubuntu中,它可能被libpng-dev替代。
安装数值计算优化库:
sudo apt install libatlas-base-dev gfortran -ylibatlas-base-dev提供了基础的BLAS和LAPACK实现,对于OpenCV中的矩阵运算有加速作用。
安装Python 3开发头文件。虽然Anaconda自带了Python,但编译OpenCV的Python绑定时,可能需要系统Python的头文件来满足一些编译检查。安装它不会有冲突:
sudo apt install python3-dev python3-pip -y至此,系统级的准备工作就完成了。接下来,我们将在conda创建的独立环境中进行后续操作。
3. 创建与管理Conda虚拟环境
使用Anaconda的核心优势就是环境隔离。我们不应该在base环境中直接安装项目依赖,而是为OpenCV项目创建一个专属环境。
3.1 创建并激活新环境
打开终端,创建一个名为opencv_env的新环境,并指定Python版本。这里我选择Python 3.8,它在兼容性和库支持上比较均衡:
conda create -n opencv_env python=3.8 -y创建完成后,激活该环境:
conda activate opencv_env你会看到命令行提示符前面从(base)变成了(opencv_env),这表示你已经进入了这个独立的环境。在这个环境下安装的所有包,都不会影响到base环境或其他环境。
3.2 安装NumPy与其他科学计算基础包
OpenCV的Python接口严重依赖NumPy数组来存储和操作图像数据。因此,在编译或安装OpenCV之前,必须先安装NumPy。此外,一些编译工具也可以通过conda安装,有时比系统版本更易管理。
conda install numpy cmake jupyter matplotlib scipy -y这里我们一并安装了Jupyter和Matplotlib,方便后续进行代码测试和可视化。cmake也通过conda安装,可以确保版本的一致性。
3.3 环境变量的设置与验证
有时候,即使你在conda环境中,编译器可能还是会链接到系统路径下的库。为了确保编译过程优先使用conda环境中的库,我们可以临时设置一些环境变量。不过,在大多数情况下,conda activate脚本已经处理好了这些。我们可以通过以下命令验证关键工具的位置:
which python which pip which cmake这些命令应该都指向你的conda环境路径(如/home/your_username/anaconda3/envs/opencv_env/bin/)。如果不是,请检查conda环境是否已正确激活。
4. OpenCV源码获取与编译配置
我们将采用“源码编译”的方式安装OpenCV,这样可以获得最大的灵活性和控制权,例如开启CUDA支持、包含额外的contrib模块等。
4.1 下载OpenCV与OpenCV Contrib源码
首先,在你喜欢的工作目录下(例如~/projects),使用git克隆OpenCV和OpenCV Contrib的源码。建议使用固定的发布版本标签,而不是默认的master分支,以保证稳定性。这里我们选择OpenCV 4.5.5,这是一个较新且稳定的版本。
cd ~/projects git clone https://github.com/opencv/opencv.git cd opencv git checkout tags/4.5.5 cd .. git clone https://github.com/opencv/opencv_contrib.git cd opencv_contrib git checkout tags/4.5.5 cd ..现在,你的目录下应该有opencv和opencv_contrib两个文件夹,且都处于4.5.5版本。
4.2 使用CMake进行编译配置
进入OpenCV源码目录,并创建一个用于存放编译中间文件的build目录:
cd ~/projects/opencv mkdir build cd build接下来是最关键的步骤:运行CMake生成Makefile。这里有一长串配置参数,我会逐一解释其作用:
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/home/your_username/anaconda3/envs/opencv_env \ -D INSTALL_PYTHON_EXAMPLES=OFF \ -D INSTALL_C_EXAMPLES=OFF \ -D OPENCV_ENABLE_NONFREE=OFF \ -D WITH_TBB=ON \ -D WITH_V4L=ON \ -D WITH_QT=OFF \ -D WITH_OPENGL=ON \ -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \ -D PYTHON3_EXECUTABLE=/home/your_username/anaconda3/envs/opencv_env/bin/python \ -D PYTHON3_INCLUDE_DIR=/home/your_username/anaconda3/envs/opencv_env/include/python3.8m \ -D PYTHON3_LIBRARY=/home/your_username/anaconda3/envs/opencv_env/lib/libpython3.8.so \ -D PYTHON3_NUMPY_INCLUDE_DIRS=/home/your_username/anaconda3/envs/opencv_env/lib/python3.8/site-packages/numpy/core/include \ -D BUILD_EXAMPLES=OFF \ -D BUILD_opencv_python3=ON \ -D BUILD_opencv_python2=OFF \ ..关键参数解析:
CMAKE_INSTALL_PREFIX:这是最重要的参数之一。它指定了编译后库文件的安装路径。我们将其指向conda环境的根目录,这样安装后,OpenCV的Python包就会出现在环境的site-packages里,系统会自动识别。OPENCV_EXTRA_MODULES_PATH:指向opencv_contrib的modules目录,这样就能编译SIFT、SURF等额外算法模块(注意,部分算法因专利问题,需OPENCV_ENABLE_NONFREE=ON,此处为OFF)。PYTHON3_*系列参数:明确告诉CMake我们使用的Python解释器、头文件和库文件的位置,确保生成的Python绑定是针对当前conda环境的。WITH_QT=OFF:在Ubuntu 16.04上编译Qt支持可能会遇到较复杂的依赖问题,为了简化流程,我们先关闭它。如果需要GUI功能,可以使用OpenCV自带的highgui模块(基于GTK)或者后续单独解决Qt依赖。BUILD_EXAMPLES=OFF:不编译例子程序,以加快编译速度。
执行完cmake命令后,仔细查看终端输出。你需要重点关注以下几行:
Python 3:应该显示为Interpreter和libraries都指向你的conda环境路径,并且numpy也被找到。To be built:列表中应该包含opencv_python3。- 如果一切顺利,最后会显示
Configuring done和Generating done。如果出现任何关于缺失依赖(如找不到某个库)的警告或错误,需要根据提示安装对应的-dev包。
5. 编译、安装与验证
配置成功后,就可以开始编译了。这个过程会消耗大量CPU资源和时间,取决于你的电脑性能。
5.1 并行编译与安装
使用make命令进行编译,-j参数指定并行作业数,通常设置为CPU核心数,可以大幅加快编译速度。你可以用nproc命令查看核心数。
make -j$(nproc)编译过程可能会持续十几分钟到一小时不等。如果中途报错,最常见的原因是内存不足(特别是虚拟机环境)。可以尝试减少并行数,如make -j2。编译成功后,执行安装:
sudo make install sudo ldconfigsudo make install会将编译好的库和头文件安装到之前指定的CMAKE_INSTALL_PREFIX目录下。sudo ldconfig命令更新系统的动态链接库缓存,确保系统能找到新安装的OpenCV共享库。
5.2 在Conda环境中验证安装
安装完成后,务必先确保你仍在opencv_envconda环境中,然后启动Python进行验证:
python在Python交互界面中,输入:
import cv2 print(cv2.__version__) print(cv2.__file__)如果安装成功,你会看到输出版本号4.5.5。cv2.__file__的路径应该位于你的conda环境目录下,例如/home/your_username/anaconda3/envs/opencv_env/lib/python3.8/site-packages/cv2/python-3.8/cv2.cpython-38m-x86_64-linux-gnu.so。这证明OpenCV的Python绑定确实安装在了当前环境中。
5.3 基础功能测试
让我们写一个简单的脚本来测试核心功能是否正常。创建一个test_opencv.py文件:
import cv2 import numpy as np # 测试1: 创建一张随机图像并显示(需要图形界面支持) img = np.random.randint(0, 255, (300, 400, 3), dtype=np.uint8) cv2.imshow('Random Test Image', img) cv2.waitKey(1000) # 显示1秒 cv2.destroyAllWindows() # 测试2: 基础图像处理 - 灰度化和边缘检测 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 50, 150) print(f"Edge image shape: {edges.shape}, dtype: {edges.dtype}") # 测试3: 检查contrib模块是否可用(如果编译时包含) try: from cv2 import xfeatures2d print("Contrib modules (xfeatures2d) are available.") except ImportError: print("Contrib modules are not available.") print("All basic tests passed!")在终端运行这个脚本。如果能看到一个随机彩色图像的窗口弹出并关闭,并在终端打印出边缘图像的形状和“All basic tests passed!”,那么恭喜你,OpenCV已经成功安装并可以正常工作了。
6. 疑难排查与进阶配置
即使按照上述步骤操作,你也可能遇到一些特有的问题。这里我总结几个在Ubuntu 16.04 + Anaconda环境下高频出现的“坑”及其解决方案。
6.1 导入错误:ModuleNotFoundError: No module named 'cv2'
这是最常见的问题。原因和解决方案有以下几种:
- 环境未激活:你不在安装OpenCV的那个conda环境中。使用
conda activate opencv_env切换环境。 - Python路径问题:在同一个conda环境下,可能存在多个Python解释器(比如系统自带的python3和conda的python)。确保你使用的是
which python指向的那个解释器。 - 安装路径未正确加入Python路径:虽然我们指定了
CMAKE_INSTALL_PREFIX到conda环境,但有时.so文件可能被安装到了非标准的子目录。检查cv2.__file__的输出,确认其路径在环境内。如果不在,可以手动将包含cv2.cpython-*.so文件的目录添加到sys.path中,但这通常是安装配置错误的表现,建议重新检查CMake的PYTHON3_*参数。
6.2 CMake找不到Python相关路径
在CMake配置阶段,如果Python相关项显示为NO或者路径不对,大概率是PYTHON3_EXECUTABLE、PYTHON3_INCLUDE_DIR、PYTHON3_LIBRARY这几个参数设置错误。
- 如何查找正确的路径:
PYTHON3_EXECUTABLE:which pythonPYTHON3_INCLUDE_DIR: 通常为$CONDA_PREFIX/include/python3.xm,其中3.x是你的Python次版本号。可以用python -c "from sysconfig import get_path; print(get_path('include'))"精确获取。PYTHON3_LIBRARY: 通常为$CONDA_PREFIX/lib/libpython3.x.so。可以用find $CONDA_PREFIX -name \"libpython*.so\"查找。
- 确保conda环境已激活:在运行cmake命令前,终端提示符必须是
(opencv_env)。
6.3 编译错误:缺失依赖或头文件
错误信息通常类似于fatal error: xxx.h: No such file or directory。这表示缺少对应的系统开发库。
- 通用解决方法:根据缺失的头文件名(如
libavcodec/avcodec.h),使用apt search或apt-file search来查找是哪个开发包提供的。
找到包名(如sudo apt update apt-file search libavcodec/avcodec.h # 如果未安装apt-file,先 sudo apt install apt-filelibavcodec-dev)后,使用sudo apt install安装即可。 - 高频缺失包:除了前面列出的,你可能还会需要
libdc1394-22-dev(相机支持)、libgstreamer-plugins-base1.0-dev(GStreamer支持)等。根据你的实际需求(CMake输出会有提示)选择性安装。
6.4 启用CUDA支持(可选,针对有NVIDIA显卡的用户)
如果你想利用GPU加速OpenCV计算,需要在CMake阶段开启CUDA支持。这需要你先在系统上安装正确版本的NVIDIA驱动和CUDA Toolkit(例如CUDA 10.0或10.1,需与Ubuntu 16.04及你后续可能使用的深度学习框架版本兼容)。然后,在CMake命令中添加以下参数:
-D WITH_CUDA=ON \ -D WITH_CUDNN=ON \ -D OPENCV_DNN_CUDA=ON \ -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-10.1 \ # 你的CUDA安装路径 -D CUDA_ARCH_BIN=6.1 \ # 根据你的GPU计算能力填写,如GTX 10系列多为6.1 -D CUDA_ARCH_PTX=6.1 \开启CUDA后,编译时间会显著增加,并且对系统环境要求更高,更容易出错。对于初学者,建议先完成CPU版本的安装和验证,再尝试CUDA版本。
6.5 在PyCharm或Jupyter中使用该环境
- PyCharm:在创建或打开项目后,进入
File -> Settings -> Project: YourProjectName -> Python Interpreter。点击齿轮图标,选择Add...,然后选择Conda Environment->Existing environment,找到你的opencv_env环境下的Python解释器(路径类似/home/your_username/anaconda3/envs/opencv_env/bin/python)。添加后,PyCharm就会使用这个环境来运行和调试你的代码。 - Jupyter Notebook/JupyterLab:首先在
opencv_env环境中安装ipykernel:conda install ipykernel -y。然后,将该环境注册为Jupyter的一个内核:python -m ipykernel install --user --name opencv_env --display-name \"Python (OpenCV 4.5.5)\"。之后启动Jupyter,在新建笔记本时就可以选择Python (OpenCV 4.5.5)这个内核了。
7. 环境管理与项目迁移
成功搭建环境后,如何管理和复用这个环境就变得很重要。
7.1 导出与复现环境配置
你可以将当前环境的精确配置导出到一个YAML文件中:
conda activate opencv_env conda env export > opencv_env.yaml这个opencv_env.yaml文件包含了所有通过conda安装的包及其精确版本。但是,请注意,它不包含我们通过源码编译安装的OpenCV!因为OpenCV是我们手动编译安装到环境路径下的,而不是通过conda命令安装的。
因此,为了完全复现环境,你需要:
- 在新机器上根据
opencv_env.yaml创建基础conda环境。 - 手动保存我们用于编译OpenCV的CMake命令脚本(或者记录下所有参数)。
- 在新机器上重复第4、5节的源码编译和安装步骤。
对于团队协作,更推荐使用Docker容器来封装整个开发环境,包括系统依赖、Anaconda和编译好的OpenCV,这样可以实现百分之百的复现。
7.2 清理与卸载
如果你需要彻底清理这个OpenCV环境:
- 卸载手动编译安装的OpenCV文件(这比较麻烦,因为文件分散在
CMAKE_INSTALL_PREFIX指定的目录下)。一个相对安全的方法是重新编译一遍,在build目录下执行sudo make uninstall(如果CMakeLists.txt支持的话),但并非所有项目都支持。更直接的方法是删除conda环境。 - 删除conda环境:
这会删除整个conda deactivate # 先退出环境 conda remove -n opencv_env --all -yopencv_env环境及其所有通过conda安装的包,但手动安装到该环境路径下的OpenCV文件可能仍有残留,需要手动检查并清理$CONDA_PREFIX对应的文件夹。
在整个安装和调试过程中,保持耐心,仔细阅读终端输出的每一条错误信息,并善用搜索引擎(当然,是在遵守相关规定的前提下,使用合规的网络资源查找技术解决方案)。每一次解决问题的过程,都是对Linux系统、编译工具链和软件依赖关系理解加深的过程。这个在“老旧”系统上搭建“现代”工具链的经历,会让你在未来面对任何复杂环境配置时都更加从容。
