在计算机视觉领域,OpenCV堪称是开发者手中的瑞士军刀。这个开源库从1999年诞生至今,已经迭代到4.x版本,成为图像处理、机器学习算法实现的行业标准工具。对于使用Ubuntu 16.04 Xenial Xerus系统的开发者来说,虽然系统仓库提供了OpenCV的预编译版本,但往往版本较旧且缺少关键模块支持。本文将手把手带你从源码编译安装OpenCV 4,涵盖C++和Python两种开发环境的完整配置。
注意:Ubuntu 16.04官方支持已于2021年终止,建议考虑升级到更新的LTS版本。若必须使用该版本,请确保至少已安装所有安全更新。
首先更新软件包列表并升级现有组件:
bash复制sudo apt update && sudo apt upgrade -y
安装编译工具链和CMake(建议至少3.5版本):
bash复制sudo apt install -y build-essential cmake git pkg-config
OpenCV需要以下库来处理不同格式的图像文件:
bash复制sudo apt install -y libjpeg8-dev libtiff5-dev libpng-dev
视频处理相关依赖(包括摄像头支持):
bash复制sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
对于Python开发者,建议使用virtualenv创建隔离环境:
bash复制sudo apt install -y python3-dev python3-pip
python3 -m pip install --user virtualenv
python3 -m virtualenv ~/opencv_env
source ~/opencv_env/bin/activate
安装NumPy(OpenCV Python绑定必需):
bash复制pip install numpy
创建工作目录并克隆官方仓库:
bash复制mkdir ~/opencv_build && cd ~/opencv_build
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
切换到稳定版本(以4.5.5为例):
bash复制cd opencv && git checkout 4.5.5 && cd ..
cd opencv_contrib && git checkout 4.5.5 && cd ..
创建构建目录并运行CMake:
bash复制cd ~/opencv_build/opencv
mkdir build && cd build
关键配置参数示例:
bash复制cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules \
-D BUILD_EXAMPLES=ON \
-D WITH_GTK=ON \
-D WITH_FFMPEG=ON \
-D WITH_CUDA=OFF \
-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())") \
..
重要提示:如果不需要contrib模块,可以移除OPENCV_EXTRA_MODULES_PATH参数。CUDA支持需要额外配置且对硬件有要求。
确定CPU核心数(nproc命令输出),然后开始编译:
bash复制make -j$(nproc)
编译完成后安装:
bash复制sudo make install
sudo ldconfig
验证安装:
bash复制pkg-config --modversion opencv4
创建测试程序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 4 Works!", cv::Point(150, 200),
cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(0, 255, 0), 2);
cv::imshow("Test Window", image);
cv::waitKey(0);
return 0;
}
编译并运行:
bash复制g++ test_opencv.cpp -o test_opencv `pkg-config --cflags --libs opencv4`
./test_opencv
在Python环境中测试:
python复制import cv2
print(f"OpenCV version: {cv2.__version__}")
img = cv2.imread("不存在的图片.jpg", cv2.IMREAD_COLOR) # 故意使用错误路径测试异常处理
assert img is None, "Should return None for non-existent files"
print("Basic functionality verified")
问题1:CMake找不到Python解释器
解决方案:明确指定Python路径,确保virtualenv已激活,或直接使用系统Python:
bash复制-D PYTHON3_EXECUTABLE=/usr/bin/python3
问题2:缺少ippicv等第三方库
解决方案:手动下载并放入指定目录:
bash复制wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/ippicv/master_20191018/ippicv/ippicv_2019_lnx_intel64_general_20191018.tgz
tar -xzf ippicv_2019_lnx_intel64_general_20191018.tgz
sudo mv ippicv_lnx /usr/local/share/OpenCV/3rdparty/ippicv/
问题:Python导入cv2时报错
可能原因:多版本冲突。检查链接是否正确:
bash复制ls -l /usr/local/lib/python3.5/dist-packages/cv2/python-3.5/
修复方法:创建符号链接或重新配置Python路径:
bash复制sudo ln -s /usr/local/lib/python3.5/dist-packages/cv2/python-3.5/cv2.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/cv2.so
bash复制sudo apt install -y libtbb-dev
在CMake中添加:
bash复制-D WITH_TBB=ON
bash复制-D ENABLE_NEON=ON
bash复制-D BUILD_opencv_world=ON \
-D BUILD_opencv_java=OFF \
-D BUILD_PERF_TESTS=OFF \
-D BUILD_TESTS=OFF
如果需要降级,先卸载当前版本:
bash复制cd ~/opencv_build/opencv/build
sudo make uninstall
然后重新编译指定版本。
获取最新代码并重新编译:
bash复制cd ~/opencv_build/opencv
git pull origin master
cd build
make clean
cmake .. # 使用新参数
make -j$(nproc)
sudo make install
释放磁盘空间:
bash复制rm -rf ~/opencv_build/opencv/build/*
在实际项目开发中,我习惯将OpenCV编译为静态库以减少运行时依赖。对于嵌入式设备,可以通过交叉编译和裁剪非必要模块来优化体积。一个经验是始终保留构建目录,这样当需要添加新模块或调整参数时,可以直接在原有基础上重新配置,而不必从头开始编译。