1. 程式人生 > 其它 >Arch Linux編譯OpenCV 4.5.1原始碼並使用(包含contrib)模組

Arch Linux編譯OpenCV 4.5.1原始碼並使用(包含contrib)模組

技術標籤: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. 進行測試

  1. 寫一個簡單的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;
}
  1. 在命令列進行編譯
g++ -g test.cpp -o test.out 'pkg-config --cflags --libs opencv4'
  1. 執行編譯好的原始檔
./test.out

可以發現成功顯示出了圖片,測試成功。


5. 總結

從原始碼編譯opencv看似簡單,但是中間有不少坑要踩,自己前前後後編譯了多次才算是完全滿意,希望這篇文章能夠讓大家少走彎路。