一、背景
最近打算把现有的一个 python 程序用 c++ 重写,进一步提升性能。编辑器使用 VSCode,三方库需要用到 opencv,要进行编译安装。
二、编译安装 opencv
1. 更新源
sudo apt update && sudo apt upgrade
2. 安装依赖库
安装编译 opencv 所需的依赖库
sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libatlas-base-dev gfortran
如果安装失败,需要更换 apt 源,比如阿里源,老生常谈的问题了。
3. 安装 opencv
3.1 下载源码包
从 github 下载 opencv 和 opencv-contrib 源码包,本人用的版本是 4.9.0,下载完成后解压
3.2 编译安装
首先在当前目录下新建 build 文件夹
cd opencv-4.9.0
mkdir build && cd build
使用如下命令生成编译配置文件
cmake -D CMAKE_BUILD_TYPE=Release \-D CMAKE_INSTALL_PREFIX=/usr/local/opencv4 \-D OPENCV_EXTRA_MODULES_PATH=/home/rockchip/opencv_contrib-4.9.0/modules/ \-D OPENCV_GENERATE_PKGCONFIG=YES \-D ENABLE_PRECOMPILED_HEADERS=OFF ..
由于添加了 opencv 扩展库,cmake 过程中会下载一些模型和文件,比如微信二维码识别(4.5.2 之后新增模块)模型和人脸检测模型,在不挂代理的情况下会等待很长一段时间尝试下载并最终提示下载失败。实测在使用代理时,wechat_qrcode 模块需要的模型文件和 xfeatures2d 模块需要的 .i 文件可以正常下载,但 face 模块需要的 face_landmark_model.dat 文件始终无法下载成功。如果实际程序中用不到自带的人脸检测模块,可以找到该模块的 CMakeLists.txt 文件,将下载相关代码注释掉,确保 cmake 流程可以正常进行。
cd /home/rockchip/opencv_contrib-4.9.0/modules/face
在该目录下打开 CMakeLists.txt,注释掉 13-27 行。
如果需要用到该模型又无法使用代理,可以手动下载该文件,然后将其放到 opencv-4.9.0/.cache/data 目录下,并重命名为 "7505c44ca4eb54b4ab1e4777cb96ac05-face_landmark_model.dat",即可。
至于 qrcode 模型和 xfeatures2d 用到的 .i 文件,文件太多就不一一放链接了,.i 文件可以在这位大佬的 github 上下载,qrcode 模型网上搜一下就能下载。下载完后分别放到这两个目录下
# qrcode 模型存放目录
/path/to/opencv_contrib-4.9.0/modules/wechat_qrcode/downloads/wechat_qrcode
# .i 文件存放目录
/path/to/opencv_contrib-4.9.0/modules/xfeatures2d/src
之后可以开始编译安装了
make -j4 && sudo make install
大概等待几十分钟就可以安装完成了。
3.3 配置环境变量
打开 bashrc 文件
sudo vi ~/.bashrc
文件末尾添加环境变量,保证程序编译时能正确找到 opencv 库
export PATH=/usr/local/opencv4/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/opencv4/lib:$LD_LIBRARY_PATH
export CPLUS_INCLUDE_PATH=/usr/local/opencv4/include:$CPLUS_INCLUDE_PATH
export PKG_CONFIG_PATH=/usr/local/opencv4/lib/pkgconfig:$PKG_CONFIG_PATH
注意:如果在 lib 目录下找不到 pkgconfig,说明 cmake 配置时没有开启 OPENCV_GENERATE_PKGCONFIG,opencv4.x 默认关闭该选项,需要手动开启。
更新生效
source /etc/bash.bashrc
验证
pkg-config --modversion opencv4
输出版本号
3.4 配置动态链接库
创建配置文件
sudo vim /etc/ld.so.conf.d/opencv.conf
添加如下内容,注意前缀路径要与 cmake 编译选项中的 CMAKE_INSTALL_PREFIX 的路径设置保持一致
/usr/local/lib/opencv4
更新文件使其生效
sudo ldconfig
3.5 测试demo
对官方提供的测试 demo 稍作修改,输出一张图片
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#include <iostream>using namespace cv;
using namespace std;void drawText(Mat & image);int main()
{cout << "Built with OpenCV " << CV_VERSION << endl;Mat image;cout << "No capture" << endl;image = Mat::zeros(480, 640, CV_8UC1);drawText(image);imshow("Sample", image);waitKey(0);return 0;
}void drawText(Mat & image)
{putText(image, "Hello OpenCV",Point(20, 50),FONT_HERSHEY_COMPLEX, 1, // font face and scaleScalar(255, 255, 255), // white1, LINE_AA); // line thickness and type
}
编译,运行
g++ example.cpp $(pkg-config --cflags --libs opencv) -o test
./test
输出图片
到这一步 opencv 就可以正常使用了。
三、VSCode 加载 opencv
使用VSCode打开程序时会显示找不到 opencv
Ctrl+Shift+P,选择 C/C++: 编辑配置(UI),此时会在当前项目的 .vscode 文件夹中生成c_cpp_properties.json 文件,在 includePath 中添加 opencv 头文件所在位置
此时红色波浪线消失,可以正确加载 opencv了。
四、总结
本文主要记录一下如何编译安装opencv并用VSCode调用,主要的坑还是在编译部分,如果编译没有问题后面就比较顺了。
参考资料
[1] #include <opencv2/opencv.hpp>报错没有该文件夹,linux上面安装opencv-CSDN博客
[2] 详尽指南:在 Ubuntu 20.04 中源码编译安装 OpenCV 并进行全面配置,包括多版本共存与切换_ubuntu 20.04 编译opencv-CSDN博客 [3] 为什么OpenCV4 “pkg-config --modversion opencv”显示“ No package ‘opencv‘ found”?解决方法!_no package 'opencv' found-CSDN博客
[4] 解决opencv在vs code中头文件找不到的问题_vscode opencv 找不到头文件-CSDN博客