尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Ubuntu 16.04下Anaconda环境手动编译安装OpenCV 4.5.5完整指南

Ubuntu 16.04下Anaconda环境手动编译安装OpenCV 4.5.5完整指南 1. 项目概述为什么要在Anaconda里装OpenCV如果你正在用Ubuntu 16.04做计算机视觉或者机器学习相关的开发那你大概率绕不开两个东西一个是Python的科学计算发行版Anaconda另一个就是计算机视觉库OpenCV。很多人第一次尝试在Anaconda的虚拟环境里装OpenCV时可能会直接敲一句conda install opencv然后发现要么版本老旧要么根本找不到包最后弹出一堆网络错误比如经典的unavailableinvalidchannel: http 404 not found。这感觉就像你拿着旧地图去找一家已经搬迁的餐厅结果自然是扑个空。我之所以花时间折腾在Anaconda里手动编译安装OpenCV而不是直接用系统包管理器apt安装核心原因有三个。第一是环境隔离Anaconda的虚拟环境能让我为不同项目维护独立的、互不干扰的Python包集合避免“牵一发而动全身”。第二是版本控制系统仓库里的OpenCV版本往往比较旧Ubuntu 16.04默认源里的OpenCV是2.x或3.1而很多新特性比如DNN模块的完善、更好的Python接口都在新版本里我需要一个特定的、较新的版本。第三是功能定制通过源码编译我可以选择性地开启或关闭某些功能模块比如CUDA加速、GTK/Qt图形界面支持、FFMPEG视频编解码打造一个最适合我当前项目需求的“定制版”OpenCV而不是一个功能臃肿或缺失的通用版本。这个过程虽然比一键安装麻烦但它能给你带来对环境的完全掌控力。接下来我会带你走一遍我从准备环境到编译安装再到验证和避坑的完整流程。这套方法在Ubuntu 16.04上经过多次验证对于其他相近版本的Linux发行版也有很高的参考价值。2. 环境准备与依赖梳理在开始编译之前我们需要一个干净、健全的基础环境。这里的“健全”指的是系统拥有所有必要的编译工具和开发库。很多编译失败的问题根源都在于缺失某个不起眼的依赖。2.1 系统更新与基础编译工具首先确保你的系统包列表是最新的然后安装编译所需的“工具链”。这包括编译器gcc, g、构建工具cmake, make以及一些基础的开发库。sudo apt-get update sudo apt-get upgrade -y sudo apt-get install build-essential cmake pkg-config -y注意build-essential这个元包包含了gcc, g, make, libc-dev等一整套编译工具是必须安装的。pkg-config是一个在编译时帮助查找库文件和头文件路径的小工具很多开源项目包括OpenCV的构建脚本会用到它。2.2 图像、视频与GUI依赖库OpenCV的核心功能是处理图像和视频因此需要对应的开发库。此外为了能使用imshow()这类函数显示图片我们还需要图形用户界面GUI库的支持。在Linux上常见的选择是GTK。sudo apt-get install libjpeg8-dev libtiff5-dev libjasper-dev libpng12-dev -y sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev -y sudo apt-get install libxvidcore-dev libx264-dev -y sudo apt-get install libgtk-3-dev -y sudo apt-get install libatlas-base-dev gfortran -y这里逐条解释一下libjpeg8-dev,libtiff5-dev,libpng12-dev分别用于JPEG、TIFF、PNG格式图片的编解码。没有它们OpenCV无法读写这些最常见的图片格式。libjasper-dev用于JPEG2000格式图片的支持。虽然不常用但建议装上以防万一。libavcodec-dev,libavformat-dev,libswscale-dev来自FFmpeg项目提供了强大的视频文件读写和码流转换能力。这是让cv2.VideoCapture能正常工作的关键。libv4l-devVideo for Linux的开发库用于从摄像头采集视频流。libxvidcore-dev,libx264-dev分别是Xvid和H.264视频编码器的开发库。如果你需要将处理后的视频保存为高压缩率的格式如MP4就需要它们。libgtk-3-devGTK 3图形工具包的开发文件。这是为OpenCV的highgui模块提供GUI后端使得imshow(),waitKey()等函数能弹出窗口并响应键盘事件。libatlas-base-dev,gfortranATLAS是一个优化的线性代数库OpenCV的一些矩阵运算会用到它。gfortran是Fortran编译器某些底层数学库的编译需要它。2.3 Python环境准备与Anaconda配置这是最关键的一步。我们需要在Anaconda中创建一个干净的虚拟环境并安装好对应版本的Python开发文件。创建并激活虚拟环境我习惯为每个视觉项目单独创建环境。这里创建一个名为cv的环境并指定Python版本为3.6这是一个与Ubuntu 16.04和OpenCV都兼容性很好的版本。conda create -n cv python3.6 -y conda activate cv激活后你的命令行提示符前面应该会出现(cv)表示你已进入该环境。安装NumPyOpenCV的Python接口极度依赖NumPy数组来存储和操作图像数据。必须在编译OpenCV之前安装好它。pip install numpy实操心得一定要用pip install而不是conda install来安装这个环境下的NumPy。因为后续CMake配置时它会通过Python的sysconfig来寻找NumPy的头文件位置而conda安装的包路径有时会比较特殊可能导致CMake找不到。用pip安装最稳妥。获取Python开发头文件编译任何Python的C扩展模块OpenCV的Python绑定就是其中之一都需要Python.h等头文件。在Anaconda环境里它们通常已经存在了。你可以通过以下命令找到路径后续CMake会用到python -c import sys; print(sys.executable) # 查看python解释器路径例如 /home/username/anaconda3/envs/cv/bin/python python -c import sysconfig; print(sysconfig.get_path(include)) # 查看Python头文件路径3. OpenCV源码下载与编译配置我们不使用Anaconda仓库里可能存在的预编译包而是从GitHub获取源码自己控制编译过程。3.1 下载OpenCV及其扩展模块OpenCV的主仓库opencv包含稳定版本的核心代码而很多前沿的、实验性的功能比如一些额外的算法模块、深度神经网络模型放在opencv_contrib仓库里。为了功能完整我们两者都下载。# 1. 创建一个工作目录并进入 cd ~ mkdir opencv_build cd opencv_build # 2. 下载OpenCV核心源码这里以4.5.5版本为例一个较稳定且功能丰富的版本 wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.5.zip unzip opencv.zip # 3. 下载OpenCV扩展模块源码 wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.5.zip unzip opencv_contrib.zip注意版本号4.5.5可以根据你的需求更改。建议去 OpenCV GitHub Release页面 查看最新的稳定版。核心模块与扩展模块的版本号必须严格一致否则编译时可能会因API不匹配而失败。3.2 使用CMake进行生成配置解压后你会得到opencv-4.5.5和opencv_contrib-4.5.5两个文件夹。我们在核心源码目录下创建一个build文件夹用于存放编译的中间文件这是一种保持源码目录干净的好习惯。cd opencv-4.5.5 mkdir build cd build接下来是最关键的CMake配置步骤。我们需要通过CMake生成适用于我们特定环境的Makefile。cmake -D CMAKE_BUILD_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D INSTALL_PYTHON_EXAMPLESOFF \ -D INSTALL_C_EXAMPLESOFF \ -D OPENCV_ENABLE_NONFREEOFF \ -D WITH_TBBON \ -D WITH_V4LON \ -D WITH_QTOFF \ -D WITH_GTKON \ -D WITH_OPENGLON \ -D OPENCV_EXTRA_MODULES_PATH../../opencv_contrib-4.5.5/modules \ -D PYTHON3_EXECUTABLE$(python -c import sys; print(sys.executable)) \ -D PYTHON3_INCLUDE_DIR$(python -c import sysconfig; print(sysconfig.get_path(include))) \ -D PYTHON3_LIBRARY$(find $(dirname $(python -c import sys; print(sys.executable)))/../lib -name libpython*.so | head -1) \ -D PYTHON3_NUMPY_INCLUDE_DIRS$(python -c import numpy; print(numpy.get_include())) \ -D BUILD_EXAMPLESOFF \ -D BUILD_opencv_python3ON \ ..这个命令看起来很长我们来拆解一下每个参数的意义-D CMAKE_BUILD_TYPERELEASE指定编译为发布版本编译器会进行优化生成的文件性能更好体积更小。-D CMAKE_INSTALL_PREFIX/usr/local指定安装路径。编译完成后执行sudo make install会将库文件、头文件等安装到这个目录下。/usr/local是Linux系统存放本地安装软件的标准位置。-D OPENCV_EXTRA_MODULES_PATH这是最重要的参数之一。它告诉CMake去哪里找opencv_contrib的额外模块。路径必须指向opencv_contrib-版本号/modules这个目录。Python相关参数这一组参数确保了CMake能找到我们当前Anaconda虚拟环境cv中的Python。PYTHON3_EXECUTABLE指定Python解释器的绝对路径。PYTHON3_INCLUDE_DIR指定Python头文件如Python.h的目录。PYTHON3_LIBRARY指定Python库文件libpython3.6m.so的路径。这里用了一个find命令来自动查找。PYTHON3_NUMPY_INCLUDE_DIRS指定NumPy的头文件目录。这就是为什么我们必须提前安装NumPy。-D BUILD_opencv_python3ON明确要求构建Python 3的绑定。-D WITH_GTKON -D WITH_QTOFF使用GTK作为GUI后端禁用Qt。因为在依赖安装阶段我们装的是GTK的开发库。-D OPENCV_ENABLE_NONFREEOFF禁用一些专利算法如SIFT、SURF。如果你确定需要且了解专利风险可以设为ON。-D BUILD_EXAMPLESOFF不编译示例代码以加快编译速度。执行这个CMake命令后终端会输出大量检测信息。请务必仔细查看最后几行的Configuring done和Generating done之间有没有报错。特别要检查以下几项Python 3部分是否被正确识别并且Interpreter、Libraries、numpy的路径都指向你的Anacondacv环境。GUI部分是否找到了GTK。Video I/O部分是否找到了FFMPEG和V4L。如果这些关键项后面都是YES那么配置就成功了。如果出现NO则说明对应的依赖没找到需要回头检查安装步骤。4. 编译、安装与环境验证配置成功后我们就可以开始编译了。编译过程非常耗时取决于你的CPU核心数可能会持续30分钟到数小时。4.1 并行编译与安装使用make -j命令可以利用多核处理器进行并行编译显著加快速度。后面的数字4表示使用4个并行任务你可以根据你CPU的核心数来调整通常设为核心数或核心数1。make -j4编译过程中终端会不断滚动输出信息。如果没有出现红色的错误Error信息只有一些警告Warning通常可以忽略耐心等待即可。编译完成后进行安装sudo make install sudo ldconfigsudo make install会将编译好的库文件、可执行文件、头文件等复制到之前CMAKE_INSTALL_PREFIX指定的目录这里是/usr/local。sudo ldconfig命令则更新系统的动态链接库缓存让系统能够找到新安装的OpenCV库。4.2 在Anaconda环境中链接OpenCV的Python包安装完成后OpenCV的Python包一个.so文件通常被安装到了/usr/local/lib/python3.6/site-packages/或类似路径。但是我们的Anaconda环境cv有自己的site-packages目录。我们需要找到这个文件并为其在Anaconda环境中创建一个符号链接软链接。找到编译生成的cv2.so文件find /usr/local -name cv2*.so通常会输出类似/usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so的路径。记下这个完整路径。创建符号链接到Anaconda环境# 首先进入你的Anaconda环境的site-packages目录 cd ~/anaconda3/envs/cv/lib/python3.6/site-packages/ # 创建软链接将目标文件链接到当前目录并重命名为 cv2.so ln -s /usr/local/lib/python3.6/site-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so cv2.so重要提示上面的路径/usr/local/lib/python3.6/site-packages/...和~/anaconda3/envs/cv/...需要替换成你实际找到的路径和你自己的Anaconda安装路径。~/anaconda3是默认安装位置如果你装在其他地方请相应修改。4.3 功能验证与测试现在让我们验证安装是否成功以及关键功能是否正常。基础验证在终端中确保cv环境已激活然后启动Python。conda activate cv python在Python交互界面中输入import cv2 print(cv2.__version__)如果成功输出版本号4.5.5恭喜你最基础的一步成功了。关键模块测试仅仅能导入还不够我们需要测试核心功能。# 测试NumPy集成创建一张黑色图片 import numpy as np img np.zeros((300, 300, 3), dtypenp.uint8) print(Image shape:, img.shape) # 应输出 (300, 300, 3) # 测试GUI功能显示图片需要图形界面支持 # 如果你是通过SSH连接服务器没有图形界面这步会报错可以跳过。 cv2.imshow(Test Window, img) cv2.waitKey(1000) # 显示1秒 cv2.destroyAllWindows() # 测试视频编解码支持检查FFMPEG后端 print(cv2.getBuildInformation()) # 在输出信息中搜索 FFMPEG查看是否被启用。 # 或者更直接地尝试读取一个视频文件如果存在的话 # cap cv2.VideoCapture(test.mp4) # if cap.isOpened(): # print(Video I/O works!) # cap.release()验证扩展模块我们安装了opencv_contrib可以测试一下里面的特色模块例如著名的xfeatures2d虽然其中的SIFT/SURF在nonfree中但其他特征点可能可用或aruco标记检测。# 尝试导入一个contrib中的模块例如用于ArUco标记的aruco模块 try: aruco_dict cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_250) print(OpenCV contrib modules are available!) except AttributeError: print(Contrib modules might not be loaded correctly.)5. 常见问题与深度排错指南即使按照步骤操作你也可能会遇到各种问题。这里我整理了几个最常见、最棘手的坑及其解决方案。5.1 编译过程中的致命错误fatal error: boostdesc_bgm.i: No such file or directory或类似错误问题根源这是opencv_contrib中一些模块如xfeatures2d依赖的预训练模型文件下载失败。由于网络原因CMake在配置时可能无法从GitHub自动下载这些文件。解决方案手动下载并放置。前往 这个链接 或搜索opencv_contrib所需的boostdesc和vgg文件。找到boostdesc_bgm.i,boostdesc_bgm_bi.i,boostdesc_bgm_hd.i,boostdesc_lbgm.i,boostdesc_binboost_*.i等文件以及vgg_generated_*.i文件。将这些.i文件全部下载下来。在opencv_contrib-4.5.5/modules/xfeatures2d/src/目录下你应该能看到一个CMakeLists.txt文件它里面列出了需要下载的文件名。将你下载的所有.i文件复制到这个src/目录下。彻底删除之前的build文件夹重新创建并运行CMake和make。这次CMake检测到本地已有文件就不会再尝试下载了。error: ‘CODEC_FLAG_GLOBAL_HEADER’ was not declared in this scope问题根源FFmpeg的API在新旧版本间发生了变化。Ubuntu 16.04默认仓库的FFmpeg版本可能较老而OpenCV代码可能针对新API编写。解决方案修改OpenCV源码以适应旧版FFmpeg。这是一个比较“脏”但有效的办法。找到报错的文件通常是opencv-4.5.5/modules/videoio/src/cap_ffmpeg_impl.hpp。在文件开头某个位置通常在包含其他头文件之后添加以下宏定义#define AV_CODEC_FLAG_GLOBAL_HEADER (1 22) #define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER #define AVFMT_RAWPICTURE 0x0020保存文件然后重新执行make -j4。5.2 Python导入与链接问题ModuleNotFoundError: No module named cv2检查1确认你是否在正确的Anaconda环境中命令行前有(cv)。用which python检查Python解释器路径。检查2确认软链接是否创建成功。进入Anaconda环境的site-packages目录执行ls -l cv2.so看它是否指向一个有效的.so文件。检查3检查.so文件的架构是否与Python匹配。如果你在64位系统上用32位Python反之亦然会导致无法加载。用file命令检查file $(python -c import sys; print(sys.executable)) # 查看Python架构 file /path/to/your/cv2.so # 查看cv2.so架构两者应该一致例如都是ELF 64-bit。ImportError: /lib/x86_64-linux-gnu/libz.so.1: versionZLIB_1.2.9‘ not found问题根源系统安装的zlib库版本过低而编译OpenCV时链接了更高版本的符号。解决方案升级系统的zlib库比较危险可能影响其他软件。更安全的方法是重新编译一个高版本的zlib并让OpenCV链接它。或者尝试安装一个兼容版本sudo apt-get install zlib1g-dev然后彻底清理OpenCV的build目录从头开始CMake和make。在CMake时可以尝试显式指定zlib路径如果你自己编译了。5.3 运行时功能异常imshow()能执行但窗口一片漆黑或者闪退可能原因1GUI后端问题。虽然编译时指定了GTK但运行时可能链接了其他有问题的库。可以设置环境变量强制指定后端export DISPLAY:0 # 如果你在本地图形界面确保DISPLAY设置正确或者在Python代码中尝试其他后端但需要编译时支持import cv2 cv2.namedWindow(test, cv2.WINDOW_NORMAL)可能原因2图片数据格式问题。确保你传递给imshow的图像数组是uint8类型且值范围在0-255对于彩色图是BGR顺序。用print(img.dtype, img.max())检查。VideoCapture无法打开摄像头或视频文件对于摄像头确保你有访问摄像头设备的权限。可以尝试将用户加入video组sudo usermod -a -G video $USER然后注销重新登录。在代码中尝试不同的摄像头索引0, 1等。对于视频文件首先确认文件路径正确。然后检查OpenCV的FFMPEG支持是否真的打开了。在Python中执行print(cv2.getBuildInformation())搜索 “FFMPEG”确保它是 “YES”。如果FFMPEG是 “NO”说明编译时没找到需要确保libavcodec-dev等包已正确安装并在CMake输出中确认Video I/O部分FFMPEG被检测到。6. 性能优化与生产环境考量当你成功安装并验证了基础功能后可以考虑根据你的硬件和项目需求进行一些优化。6.1 启用CUDA加速针对NVIDIA GPU用户如果你的机器有NVIDIA显卡并且需要处理大量图像运算如深度学习推理、实时视频处理启用CUDA支持能带来数量级的性能提升。这需要在CMake配置阶段额外指定参数。前提条件已安装正确版本的NVIDIA显卡驱动。已安装CUDA Toolkit例如CUDA 10.0/10.1/11.0等需与你的驱动和OpenCV版本兼容。已安装cuDNN深度神经网络加速库。CMake关键参数补充 在之前的CMake命令基础上添加以下参数路径请根据你的实际安装位置修改-D WITH_CUDAON \ -D WITH_CUDNNON \ -D OPENCV_DNN_CUDAON \ -D ENABLE_FAST_MATHON \ -D CUDA_FAST_MATHON \ -D WITH_CUBLASON \ -D CUDA_TOOLKIT_ROOT_DIR/usr/local/cuda-10.1 \ # 你的CUDA安装路径 -D CUDA_ARCH_BIN7.5 \ # 你的GPU计算能力如RTX 20系列是7.5需查表 -D CUDA_ARCH_PTX7.5 \ -D CUDNN_INCLUDE_DIR/usr/local/cuda-10.1/include \ # 你的cuDNN头文件路径 -D CUDNN_LIBRARY/usr/local/cuda-10.1/lib64/libcudnn.so \ # 你的cuDNN库文件路径启用CUDA后编译时间会大幅增加可能数小时并且编译过程中对内存的需求也更大建议至少8GB空闲内存。编译成功后你可以在Python中通过cv2.cuda.getCudaEnabledDeviceCount()来检查CUDA是否可用。6.2 多版本OpenCV共存与管理你可能会需要在同一台机器上为不同项目维护不同版本的OpenCV。通过Anaconda虚拟环境和自定义安装路径这完全可以实现。策略为每个需要特定OpenCV版本的项目创建独立的Anaconda环境。在每个环境中按照上述流程将OpenCV编译安装到一个独立的、非系统路径。例如将CMAKE_INSTALL_PREFIX设置为~/local/opencv-4.5.5。然后只在该环境的site-packages中创建指向这个本地安装路径的cv2.so软链接。这样环境A使用的是~/local/opencv-4.5.5下的4.5.5版本环境B可以使用系统路径/usr/local下的另一个版本或者另一个自定义路径下的版本彼此完全隔离。6.3 编译参数调优与裁剪如果你的应用场景非常明确不需要OpenCV的所有功能可以通过CMake参数关闭大量模块来显著减少编译时间和最终库文件的大小。关闭不需要的模块使用-D BUILD_opencv_module_nameOFF。例如如果你不做生物特征识别可以关闭-D BUILD_opencv_bioinspiredOFF如果不做3D视觉可以关闭-D BUILD_opencv_sfmOFF。你可以通过CMake的GUI工具cmake-gui或查看CMakeLists.txt来了解所有模块名称。关闭不需要的第三方依赖例如-D WITH_1394OFF(FireWire相机)-D WITH_GSTREAMEROFF(GStreamer支持)。优化编译选项-D CMAKE_BUILD_TYPERELEASE已经开启了通用优化。对于特定CPU可以添加-D CMAKE_CXX_FLAGS_RELEASE-marchnative -O3来生成针对本机CPU架构的最高优化代码。手动编译安装OpenCV在Ubuntu 16.04和Anaconda环境下确实是一个需要耐心和细心的过程它像是一个仪式让你从简单的“包使用者”转变为“环境构建者”。每一次解决编译错误每一次成功启用一个优化选项都会让你对这套工具链的理解更深一层。当你的代码在自定义编译的OpenCV上流畅运行时那种掌控感和成就感是直接pip install opencv-python无法比拟的。这份详细的指南希望能帮你平稳度过这个阶段少走些弯路。如果在实践中遇到本指南未覆盖的奇怪问题记住仔细阅读CMake的输出和make的报错信息善用搜索引擎你总能找到解决方案。
返回列表