建置支援 Windows ARM64 的 OpenCV

Posted on Fri 26 January 2024 in Computer Vision

背景

OpenCV 是一個知名的開源電腦視覺函示庫,包含超過 2500 種的演算法。由於 OpenCV 官方提供的預建置二進位檔案沒有包含 Windows ARM64,所以只好嘗試從原始碼建置支援 ARM64 的二進位檔案。

事先準備

  • 一台支援 Windows 11 ARM64 的電腦。
  • 安裝 Visual Studio 2022 (VS) 或更新的版本
  • 安裝 CMake,也可使用 winget 安裝:winget install Kitware.CMake
  • 下載並解壓縮 OpenCV,可下載包含 Windows x64 預建置二進位檔案的版本。
  • 下載並解壓縮額外模組( 可選 )

建置 OpenCV

  • 首先要用 CMake 產生用來建置 OpenCV 的 VS 方案,打開 CMake (cmake-gui) 設定原始碼的路徑 (ex. C:/opencv/sources) 與建置用的資料夾路徑 (ex. C:/opencv/builds)。
  • 點選 Configure,設定編譯器與目標平台,這裡選擇 ARM64

cmake_compiler

  • 接著要調整 CMake 的設定,用來產生合適的 VS 方案來建置 OpenCV,這裡紀錄有修改的非預設設定

    Name Value
    BUILD_opencv_world ON
    CV_ENABLE_INTRINSICS OFF
    CPU_BASELINE NEON

    BUILD_opencv_world 設定為 ON 會將多個模組合併成一個單一檔案,讓之後用起來方便。 取消 CV_ENABLE_INTRINSICS 是為了通過建置。 CPU_BASELINE 是最低的指令集規格,預設多了一項 FP16,會導致相容性問題,故刪除。 若要加入額外模組,則需要將額外模組所在的路徑加入設定,如

    Name Value
    OPENCV_EXTRA_MODULES_PATH C:/opencv/opencv_contrib-4.x/modules

    其餘的設定選項可以參考官網

  • 調整完設定後點選 Configure 直到紅底都消失,再點選 Generate 產生 VS 方案。

make_config

  • 打開產生出來的 OpenCV.sln 方案,點選 CMakeTargets/INSTALL 專案,滑鼠右鍵選單選擇 Build,開始建置 OpenCV,接下來可以去喝杯咖啡等待建置完成。

vs_install

  • 建置完成後,二進位檔案會在建置資料夾中的 install/ 資料夾內,所含內容相當於下載來的預建置檔案,最好將其複製到一個單純的路徑,如 C:\opencv\build_ARM64\,以利使用。

測試 OpenCV

為了測試建置好的檔案,創建一個簡單的 C++ 控制台應用程式。 - 建立專案後,在專案的屬性設定頁中在 C/C++/General 的頁面增加額外的 Include 路徑,如 C:\opencv\build_ARM64\include。 - 在 Linker\General 頁面當中的 Additional Library Directories 加入額外函式庫的路徑,如 C:\opencv\build_ARM64\ARM64\vc17\lib。 - 在 Linker\Input 頁面當中的 Additional Dependencies 加入額外的相依性,如 opencv_world490.lib

這裡使官方的範例來測試,用 OpenCV 讀取並顯示一張影像,程式碼:

#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int argc, char** argv )
{
    Mat image;
    image = imread("C:\\Path\\to\\image.jpg", IMREAD_COLOR );

    if ( !image.data )
    {
        printf("No image data \n");
        return -1;
    }

    namedWindow("Display Image", WINDOW_AUTOSIZE );
    imshow("Display Image", image);
    waitKey(0);

    return 0;
}

建置並執行後,成功的顯示指定的影像。

display_img

心得

建置的過程遇到的坑比想像中的少,實際要改的設定不多。 目前雖然成功的建置原生支援 Windows ARM64 的 OpenCV,但是其他模組會不會有問題還需要近一步的測試。

分享到: DiasporaTwitterFacebookLinkedInHackerNewsEmailReddit