Arch Linux編譯OpenCV 4.5.1原始碼並使用(包含contrib)模組
阿新 • • 發佈:2021-01-21
技術標籤:OpenCVLinuxlinuxcmakeopencvgcc/gdb編譯除錯c++
文章目錄
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看似簡單,但是中間有不少坑要踩,自己前前後後編譯了多次才算是完全滿意,希望這篇文章能夠讓大家少走彎路。