OpenCVはオープンソースの画像処理やマシンラーニングを行うためのライブラリです。多くの機能を持っており、画像処理やマシンラーニングの処理を一から全て実装するよりも効率的に開発出来ます。
高機能なだけではなく、非常に高速です。内部ではOpenCLやSIMD、IPP (Intel Performance Primitive)、スレッドによる並列化などを行い、普通に愚直に実装したら得られない速度を実現しています。
この記事では、OpenCVを使ったmacOSアプリを開発するための、OpenCVの開発環境のセットアップ方法を解説します。
iOSアプリのセットアップ方法については、次の記事を参照してください。

OpenCVのビルド
この記事の執筆時点では、macOS用のビルド済みバイナリが公開されていないので、ソースコードからライブラリをビルドすることにしました。OpenCVのビルドには、以下のものが必要です。
- Xcode
- CMake
- Git
- Python
- NumPy
macOS 12.3未満までは、PythonとNumpyがOSにプレインストールされていますが、macOS 12.3以降はインストールが必要です。XcodeはApp Store版とXip版のどちらでも使用可能です。
Xcodeのインストール
Xcodeのインストール方法については、次の記事をご覧ください。

PythonとNumPyのインストール
PythonとNumPyはXcodeのセットアップ中にインストールされます。Xcodeをセットアップしてください。
CMakeのインストール
CMakeはv3.19.2
でApple Silicon及びXcode 12以降のビルドシステムに対応しました。古いバージョンを使っている場合はアップデートしましょう。
CMakeはHomebrewからもインストールできますが、私は公式サイトからダウンロードする方法でインストールしました。
いくつか方法があります。macOS 10.15未満でシェルがBash
の場合は~/.profile
を編集して以下の様にパスを追加します。macOS Catalina 10.15以降でデフォルトのzsh
をシェルに設定している場合は、~/.zshrc
を編集してください。
export PATH=/Applications/CMake.app/Contents/bin:$PATH
% cmake --version
cmake version 3.24.0-rc5
CMake suite maintained and supported by Kitware (kitware.com/cmake).
OpenCVをビルドする
OpenCVのmacOS用のビルド済みのバイナリは公開されていないので、ソースファイルをダウンロードしてビルドします。
OpenCVのGitHubのリポジトリからソースファイルのアーカイブをダウンロードします。
ダウンロードしたアーカイブを展開し、次のようなディレクトリ構成になるように、build_opencv
とpublic
ディレクトリを作ります。
.
├── build_opencv
├── opencv-4.6.0
└── public
build_opencv
はビルド作業用ディレクトリ、public
はビルドした後のSDKを入れるディレクトリです。ターミナルで次のように作業します。
% cd build_opencv
% cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DBUILD_EXAMPLES=OFF -DCMAKE_INSTALL_PREFIX=../public ../opencv-4.6.0
CMAKE_OSX_DEPLOYMENT_TARGET
は動作最低OSです。ここでは11.0
を指定しています。
CMAKE_OSX_ARCHITECTURES
はビルドするバイナリのCPUアーキテクチャです。ここでは、Universal Binaryになるようにx86_64
とarm64
を指定しています。
ビルドには少し時間がかかりますが、進捗率が表示されるので不安にならずに見守れます。
% make -j7
% make install
OpenCVを使うアプリをビルドするときに必要になるファイルがpublic
フォルダにコピーされます。
Xcodeのプロジェクト設定
ビルドしたライブラリを使うには、Xcodeのプロジェクトの設定が必要です。
SDKのコピー
次のようにSDKのファイル一式をコピーします。私の場合は、プロジェクト単位の方が都合が良いので、プロジェクト内にコピーします。プロジェクトのルートディレクトリにcommon
というフォルダを作り、common
の中にopencv
というフォルダ作ります。public/usr/local/include
とpublic/usr/local/lib
をopencv
にコピーします。
次のようなディレクトリ構成になります。
OpenCVTest
├── OpenCVTest
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── Base.lproj
│ ├── OpenCVTest.entitlements
│ └── ViewController.swift
├── OpenCVTest.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ └── xcuserdata
└── common
└── opencv
├── include
└── lib
ヘッダー検索パスの設定
OpenCVのヘッダファイルを読み込めるようにするため、検索パスを追加します。
ターゲットの設定の「Search Paths」の「Header Search Paths」に$(inherited) $(PROJECT_DIR)/common/opencv/include
を追加します。

共有ライブラリの設定
共有ライブラリは、アプリケーションパッケージ内にコピーして使用するように設定します。
OpenCVは複数のライブラリに分かれています。使用する機能に合わせたライブラリをプロジェクトに登録します。例えば、基本的な画像処理であれば、次の2つです。
libopencv_core.4.6.0.dylib
libopencv_imgproc.4.6.0.dylib


ターゲットの設定の「Build Phases」に「Copy File」フェーズを追加します。既にFrameworks
フォルダにコピーする「Copy File」フェーズがあれば、そこに追加登録しても問題ありません。



共有ライブラリのファイル名について
4.3.0
など特定のバージョンに限定される問題かもしれませんが、共有ライブラリに埋め込まれるリンク情報がlibopencv_core.4.3.dylib
のように末尾の.0
が削除されてしまっている状態で入っています。そのため、使うときにライブラリが見つからないというエラーになってしまいます。一番簡単な解決方法はライブラリファイルの名前変更です。libopencv_core.4.3.dylib
など、リンク情報と同じ名前に変更しておくと回避できます。シンボリックリンクが作成されていますが、削除してしまって問題ありません。
プロジェクト単位でコピーしていると、他に影響を与えないので、気軽に名前を変更できます。
ライブラリ検索パスを追加する
ライブラリ検索パスに、common/opencv/lib
ディレクトリを追加します。Xcodeのバージョンによっては、共有ライブラリをプロジェクトに登録したときに、ライブラリ検索パスも追加されるのですが、バージョンによっては追加されません。
ライブラリが見つからないエラーが出るときは、ビルド設定のLibrary Search Paths
に$(inherited) $(PROJECT_DIR)/common/opencv/lib
と入力してください。
