一、背景
? ? ? ? 最近打算把現有的一個 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博客?