公司动态

Ubuntu 16.04通过Anaconda源码编译安装OpenCV全流程指南

📅 2026/8/26 4:52:56
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 python3.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_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/home/your_username/anaconda3/envs/opencv_env \ -D INSTALL_PYTHON_EXAMPLESOFF \ -D INSTALL_C_EXAMPLESOFF \ -D OPENCV_ENABLE_NONFREEOFF \ -D WITH_TBBON \ -D WITH_V4LON \ -D WITH_QTOFF \ -D WITH_OPENGLON \ -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_EXAMPLESOFF \ -D BUILD_opencv_python3ON \ -D BUILD_opencv_python2OFF \ ..关键参数解析CMAKE_INSTALL_PREFIX这是最重要的参数之一。它指定了编译后库文件的安装路径。我们将其指向conda环境的根目录这样安装后OpenCV的Python包就会出现在环境的site-packages里系统会自动识别。OPENCV_EXTRA_MODULES_PATH指向opencv_contrib的modules目录这样就能编译SIFT、SURF等额外算法模块注意部分算法因专利问题需OPENCV_ENABLE_NONFREEON此处为OFF。PYTHON3_*系列参数明确告诉CMake我们使用的Python解释器、头文件和库文件的位置确保生成的Python绑定是针对当前conda环境的。WITH_QTOFF在Ubuntu 16.04上编译Qt支持可能会遇到较复杂的依赖问题为了简化流程我们先关闭它。如果需要GUI功能可以使用OpenCV自带的highgui模块基于GTK或者后续单独解决Qt依赖。BUILD_EXAMPLESOFF不编译例子程序以加快编译速度。执行完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), dtypenp.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(fEdge 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-file找到包名如libavcodec-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_CUDAON \ -D WITH_CUDNNON \ -D OPENCV_DNN_CUDAON \ -D CUDA_TOOLKIT_ROOT_DIR/usr/local/cuda-10.1 \ # 你的CUDA安装路径 -D CUDA_ARCH_BIN6.1 \ # 根据你的GPU计算能力填写如GTX 10系列多为6.1 -D CUDA_ARCH_PTX6.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环境中安装ipykernelconda 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 -y这会删除整个opencv_env环境及其所有通过conda安装的包但手动安装到该环境路径下的OpenCV文件可能仍有残留需要手动检查并清理$CONDA_PREFIX对应的文件夹。在整个安装和调试过程中保持耐心仔细阅读终端输出的每一条错误信息并善用搜索引擎当然是在遵守相关规定的前提下使用合规的网络资源查找技术解决方案。每一次解决问题的过程都是对Linux系统、编译工具链和软件依赖关系理解加深的过程。这个在“老旧”系统上搭建“现代”工具链的经历会让你在未来面对任何复杂环境配置时都更加从容。