文章目录
1. 前言
之前学校有一门课需要使用OpenCV,当时学期中没有Linux电脑,为了在Windows环境下快速使用,大家都用的是Visual Studio 2019 + OpenCV的环境来进行编程。这种情况下大家的项目都很复杂,而且有些函数使用的是Visual Studio下的专用语法。最近假期自己想重新实现一下之前OpenCV的有关代码。但是现在我不想使用Visual Studio这样的重量级IDE,而是更希望在VS Code下进行使用。又恰好之前的旧电脑现在用的是Linux系统,编译起来更加友好。因此最近折腾了一番,终于成功实现了Linux环境下OpenCV的源代码编译并使用。
需要和大家说明的是,我的编译和使用的过程主要参考的是官网给出的教程。但是官网教程默认的是Ubuntu,同时有一些细节对后续的使用有些影响,也请大家在参考时多多注意,不要踩了不必要的坑。
2. 安装过程
2.1 安装必要的依赖工具
sudo pacman -S git cmake wget unzip g++ make
2.2 下载OpenCV源码
git clone https://github.com/opencv/opencv
git -C opencv checkout <some-tag>
# optionally
git clone https://github.com/opencv/opencv_contrib
git -C opencv_contrib checkout <same-tag-as-opencv>
# optionally
git clone https://github.com/opencv/opencv_extra
git -C opencv_extra checkout <same-tag-as-opencv>
- 这里的对应的是OpenCV版本号,我安装的是OpenCV 4.5.1,故使用命令git -C opencv checkout 4.5.1。
- 后面两个是一些其他的OpenCV模块,为可选安装项。我在这里需要opencv-contrib的部分功能,因此也需要执行第二条命令。
2.3 配置编译选项
- 新建文件夹
# 这里需要新建一个build文件夹,以存放编译后的源码
# 新建完成后进入该文件夹
mkdir -p build && cd build
- CMake编译
# 官方文档示例
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-master/modules ../opencv-master
# 我使用的命令
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules -DOPENCV_GENERATE_PKGCONFIG=YES -DOPENCV_ENABLE_NONFREE=ON -DCMAKE_INSTALL_PREFIX=~/Tools/OpenCV_4.5.1/install ../opencv
这里官方文档只给出了opencv-contrib的编译选项,但我们仍需使用到一些其他选项便于后续使用。
- -DOPENCV_EXTRA_MODULES_PATH=…/opencv_contrib/modules: 指定opencv_contrib模块路径
- -DOPENCV_EXTRA_MODULES_PATH=…/opencv_contrib/modules: 生成.pc文件用于之后pkg-config
- -DOPENCV_ENABLE_NONFREE=ON:使用第三方专利模块
- -DCMAKE_INSTALL_PREFIX:最后OpenCV的安装路径
其他CMake编译选项参见官方文档: CMake编译选项
2.4 开始编译
# 确定线程数
nproc
# -j4 代表4线程,电脑老旧2333
cmake --build . -j4 # 不要忽略最后的. ,代表构建到当前文件夹
编译过程中如遇到错误可参考此链接: 报错解决方案
2.5 安装
sudo make install
3. 使用配置
在编译结束后,为了使用OpenCV,我们还需要做一些配置,修改有关配置文件。
3.1 配置pkg-config
sudo vim /etc/profile.d/pkgconfig.sh
# 在最下面一行加入安装路径中的/lib/pkgconfig/文件夹
export PKG_CONFIG_PATH=/home/user/Tools/OpenCV_4.5.1/install/lib/pkgconfig:$PKG_CONFIG_PATH
# 刷新
source /etc/profile
# 测试是否成功
pkg-config --cflags --libs opencv4 # 若有-Lopencv_core等动态库结果,则成功
3.2 配置动态共享库链接
配置OpenCV动态库环境——程序执行时加载动态库*.so的路径。若不配置则g++无法识别动态库,会造成运行错误。
# 将安装路径下的lib文件夹加入到配置文件中
sudo vim /etc/ld.so.conf.d/opencv4.5.1.conf
# 将这行加入该文件
/home/user/Tools/OpenCV_4.5.1/install/lib/
# 使配置生效
sudo ldconfig
4. 进行测试
- 写一个简单的opencv程序test.cpp
// This is a program using opencv C++ to display an image
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
int main() {
Mat image;
image = imread("/home/user/Pictures/test.jpg", 1);
if ( !image.data ) {
std::cout << "No image data" << std::endl;
return -1;
}
namedWindow("Display Image", WINDOW_AUTOSIZE );
imshow("Display Image", image);
waitKey(0);
return 0;
}
- 在命令行进行编译
g++ -g test.cpp -o test.out 'pkg-config --cflags --libs opencv4'
- 运行编译好的源文件
./test.out
可以发现成功显示出了图片,测试成功。
5. 总结
从源代码编译opencv看似简单,但是中间有不少坑要踩,自己前前后后编译了多次才算是完全满意,希望这篇文章能够让大家少走弯路。