在计算机视觉开发领域,OpenCV堪称是行业标准库。今天我要分享的是如何在Ubuntu 18.04系统上安装OpenCV 3.4.4版本,同时支持C++和Python两种开发语言。这个特定版本组合在实际项目中非常常见——Ubuntu 18.04作为长期支持版本(LTS)拥有稳定的系统环境,而OpenCV 3.4.4则是3.x系列的最后一个功能更新版本,既具备成熟稳定的特性,又不会像4.x版本那样存在某些API变更带来的兼容性问题。
提示:选择3.4.4版本而非最新版是经过深思熟虑的。在工业级应用中,稳定性往往比新特性更重要,这个版本经过长期验证,文档和社区支持都非常完善。
在开始安装前,我们需要确保系统处于最新状态并安装必要的编译工具。打开终端执行以下命令:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential cmake git pkg-config
这些基础工具中,build-essential包含GCC/G++编译器套件,cmake是OpenCV使用的构建系统,git用于获取源代码,pkg-config帮助管理编译标志。我强烈建议在执行后续步骤前先完成系统更新,避免因基础库版本不一致导致难以排查的问题。
OpenCV的核心功能需要以下多媒体库支持:
bash复制sudo apt install -y libjpeg-dev libpng-dev libtiff-dev
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt install -y libxvidcore-dev libx264-dev
这些库分别处理不同格式的图像编解码(JPEG/PNG/TIFF)和视频处理(H.264/Xvid等)。曾经有一次我跳过了这部分安装,结果编译虽然通过了,但运行时发现无法处理最常见的JPEG图像——这个教训让我明白依赖库的重要性。
对于Python支持,我们需要安装开发头文件和pip包管理工具:
bash复制sudo apt install -y python3-dev python3-pip
python3 -m pip install numpy
这里安装的numpy是OpenCV Python绑定的必要依赖。如果你计划使用虚拟环境(推荐做法),可以这样设置:
bash复制python3 -m venv opencv_env
source opencv_env/bin/activate
pip install numpy
注意:在虚拟环境中安装时,确保后续所有Python相关操作都在激活的环境中进行。
我们直接从官方GitHub仓库获取指定版本的源代码:
bash复制cd ~
git clone https://github.com/opencv/opencv.git -b 3.4.4 --depth 1
git clone https://github.com/opencv/opencv_contrib.git -b 3.4.4 --depth 1
这里使用-b指定3.4.4分支,--depth 1只克隆最新提交以节省时间和空间。opencv_contrib包含了许多额外的模块(如SIFT特征检测),如果你确定不需要这些功能可以跳过第二个仓库。
创建一个构建目录并运行CMake:
bash复制mkdir -p ~/opencv/build && cd ~/opencv/build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D BUILD_EXAMPLES=ON \
-D WITH_GTK=ON \
-D WITH_FFMPEG=ON \
-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_LIBRARY=$(python3 -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))") \
-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python3 -c "import numpy; print(numpy.get_include())") \
..
这个配置有几个关键点值得说明:
配置完成后,检查输出中是否包含以下关键信息:
code复制-- Python 3:
-- Interpreter: /usr/bin/python3 (ver 3.6.9)
-- Libraries: /usr/lib/x86_64-linux-gnu/libpython3.6m.so (ver 3.6.9)
-- numpy: /usr/local/lib/python3.6/dist-packages/numpy/core/include (ver 1.19.5)
-- packages path: lib/python3.6/dist-packages
使用make进行编译,-j参数指定并行任务数(通常为CPU核心数+1):
bash复制make -j$(nproc)
编译过程可能需要30分钟到2小时不等,取决于硬件性能。我曾在一台4核笔记本上遇到过内存不足的问题,这时可以去掉-j参数或减少并行数(如make -j2)。
编译完成后进行安装:
bash复制sudo make install
sudo ldconfig
ldconfig命令更新动态链接器运行时绑定,确保新安装的库能被正确找到。
创建一个简单的测试程序test_opencv.cpp:
cpp复制#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::Mat image = cv::Mat::zeros(300, 600, CV_8UC3);
cv::putText(image, "OpenCV 3.4.4 on Ubuntu 18.04",
cv::Point(50, 150),
cv::FONT_HERSHEY_COMPLEX, 1,
cv::Scalar(0, 255, 255), 2);
cv::imshow("Test Window", image);
cv::waitKey(0);
return 0;
}
编译并运行:
bash复制g++ test_opencv.cpp -o test_opencv `pkg-config --cflags --libs opencv`
./test_opencv
如果看到显示文字的窗口,说明C++环境配置成功。
在Python交互环境中测试:
python复制import cv2
print(cv2.__version__)
img = cv2.imread('不存在的路径.jpg', cv2.IMREAD_COLOR)
预期看到输出"3.4.4",并且对于不存在的图像路径应该抛出错误而非静默失败(这是OpenCV的预期行为)。
如果遇到视频处理功能(如VideoCapture)无法工作,通常是FFmpeg相关的问题。解决方法:
bash复制sudo apt install -y ffmpeg
然后重新编译OpenCV。我曾遇到过一个棘手的问题:视频可以读取但无法写入,最后发现是缺少libx264-dev导致的。
如果Python中import cv2失败,可能是以下原因之一:
安装路径不在Python搜索路径中。检查:
python复制import sys
print(sys.path)
确保包含/usr/local/lib/python3.6/dist-packages(路径可能因Python版本而异)
多个Python环境冲突。使用which python3确认当前使用的Python解释器位置
如果需要CUDA加速,在CMake配置时添加:
code复制-D WITH_CUDA=ON \
-D CUDA_ARCH_BIN="5.3" \ # 根据你的GPU计算能力调整
但要注意:
在CMake配置时可以考虑以下优化选项:
bash复制-D ENABLE_FAST_MATH=ON \
-D WITH_TBB=ON \
-D WITH_OPENMP=ON \
这些选项可以启用更快的数学运算和并行处理,但可能会略微降低精度。
如果只需要特定功能,可以通过BUILD_opencv_*参数禁用不需要的模块,显著减少编译时间和二进制大小。例如:
bash复制-D BUILD_opencv_stitching=OFF \
-D BUILD_opencv_superres=OFF \
有时需要同时维护多个OpenCV版本,可以通过修改CMAKE_INSTALL_PREFIX实现:
bash复制-D CMAKE_INSTALL_PREFIX=/usr/local/opencv-3.4.4
然后通过环境变量控制使用哪个版本:
bash复制export PKG_CONFIG_PATH=/usr/local/opencv-3.4.4/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/opencv-3.4.4/lib
在实际项目中,我通常会为每个重要项目创建独立的虚拟环境和OpenCV安装,避免版本冲突。