#はじめに
M1のMacにてARM64ネイティブでOpencvを利用するため、OpenCV(contribも)のソースコードを取得しビルド、簡単な画像処理のコードを走らせるまでをまとめます。
#環境
- マシン: MacBook Air (M1 / RAM 16GB / SSD 512GB)
- OS: macOS Big Sur 11.1
#やること
- 開発環境の準備
- OpenCVソースコードのダウンロード
- CMake.appでOpenCVのビルド環境の生成
- ビルド→インストール
- テストプログラムの実行
#開発環境の準備
OpenCVをビルドするため、次のソフトをインストール。
#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を作る。
#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;
}
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