M1 MacBook AirでOpenCVをビルドする


はじめに

M1のMacにてARM64ネイティブでOpencvを利用するため、OpenCV(contribも)のソースコードを取得しビルド、簡単な画像処理のコードを走らせるまでをまとめます。

環境

  • マシン: MacBook Air (M1 / RAM 16GB / SSD 512GB)
  • OS: macOS Big Sur 11.1

やること

  • 開発環境の準備
  • OpenCVソースコードのダウンロード
  • CMake.appでOpenCVのビルド環境の生成
  • ビルド→インストール
  • テストプログラムの実行

開発環境の準備

OpenCVをビルドするため、次のソフトをインストール。
* XCode
* CMake 執筆時点ではcmake-3.19.2-macos-universal.dmg

OpenCVソースコードのダウンロード

OpenCVとOpenCV contribのソースコードをGitHubから取得。執筆時点ではver.4.5.1。

$ mkdir ~/src
$ cd ~/src
$ mkdir _GitHub
$ cd _GitHub
$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib.git
$ cd opencv
$ mkdir build

CMakeでビルド環境を生成

CMake.Appを立ち上げ、OpenCVのCMakeLists.txtがあるフォルダと、先ほど作ったbuildフォルダを指定。

Configureボタンを押して、
* 生成するプロジェクト:「Unix Makefiles」
* コンパイラ:「Use default native compilers」
を選択。

赤く表示される項目のうち、次を設定。
* OPENCV_EXTRA_MODULES_PATH: ~/src/_GitHub/opencv_contrib/modules
再びConfigureボタンを押す。赤い表示が無くなったら、Generateボタンを押してMakefileを生成。

ビルド→インストール

buildフォルダに移動し、makeを実行。ビルドにかかる時間は約10分。
ここで「make -j」とすると、SWAPが16GBくらいになり、途中でビルドがほぼ止まってしまうので注意。

$ cd ~/src/_GitHub/opencv/build
$ make -j4

ビルドが無事に終わったら、インストールを行う。

$ sudo make install

(2021.01.04 追記)ビルドされたライブラリはARM64。

$ file /usr/local/lib/libopencv_world.4.5.1.dylib 
/usr/local/lib/libopencv_world.4.5.1.dylib: Mach-O 64-bit dynamically linked shared library arm64

テストプログラムの実行

プログラム作成

簡単な2値化処理のプログラムを作成する。cmakeを使うのが何かと便利なので、main.cppと同じフォルダにCMakeLists.txtを作る。

main.cpp
#include <opencv2/opencv.hpp>
#include <chrono>

int main(int argc, char** argv) {
    cv::Mat img, imgThr;

    img = cv::imread(argv[1]);
    imgThr = cv::Mat(img.size(), img.type());

    cv::threshold(img,imgThr, 128,255,cv::THRESH_BINARY);

    cv::imshow("result", imgThr);
    cv::waitKey(0);

    return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(OpenCvTest)

# Create Main project
set(SOURCES
    main.cpp
)

find_package(OpenCV REQUIRED) ##Load OpenCV environment

##OpenCV include paths
include_directories(
    ${OpenCV_INCLUDE_DIRS}
)

##executable name
add_executable(
    ${PROJECT_NAME} ${SOURCES}
)

##Library linkage
target_link_libraries(
    ${PROJECT_NAME} ${OpenCV_LIBRARIES}
)

ビルド

main.cppと同じフォルダで以下のコマンドを実行。
cmakeがあるフォルダにパスを通してないので、フルパスで指定する。

$ mkdir build
$ cd build
$ /Applications/CMake.app/Contents/bin/cmake ..
$ make

(2021.01.04 追記)ビルドされたアプリはARM64。

$ file ./OpenCvTest              
src/OCVtest/build/OpenCvTest: Mach-O 64-bit executable arm64

プログラム実行

$ ./OpenCvTest ../lena_std.tif