OpenCVはオープンソースの画像処理やマシンラーニングを行うためのライブラリです。高機能で多くの機能を持っていて、画像処理やマシンラーニングの処理を一から全て実装するよりも効率的に開発が行えます。
高機能なだけではなく、非常に高速です。内部ではOpenCLやSIMD、IPP (Intel Performance Primitive)、スレッドによる並列化などを行い、普通に実装したら得られない速度を実現しています。
この記事では、OpenCVを使ったmacOSアプリを開発するための、OpenCVの開発環境のセットアップ方法を解説します。
iOSアプリでOpenCVを使う方法については以下の記事をご覧ください。
2020年7月12日更新 : ブリッジングヘッダーの設定を追加しました。 OpenCVはオープンソースの画像処理やマシンラーニングを行うためのライブラリです。高機能で多くの機能を持っていて、画像処理やマシンラーニングの処理を一から全て[…]
動作環境
この記事では、macOSのアプリを作るための開発環境をセットアップする方法を解説します。
この記事執筆時の動作環境は以下の通りです。
- macOS Catalina 10.15
OpenCVのビルド
この記事の執筆時点では、macOS用のビルド済みバイナリが公開されていないので、ソースコードからライブラリをビルドすることにしました。OpenCVのビルドには、以下のものが必要です。
- Xcode
- CMake
- Git
- Python
- Numpy
XcodeとCMake以外はmacOSの場合はプレインストールされています。XcodeはApp StoreからインストールすればOKです。もちろん、Developerサイトからダウンロードしたものでも構いません。
CMakeのインストール
CMakeはHomebrewからインストールできますが、私は公式サイトからダウンロードする方法で行いました。
(1) 公式サイトのダウンロードページからmacOS用のファイルをダウンロードします。
(2) ダウンロードしたdmgをマウントし、CMake.app
をアプリケーションフォルダにコピーします。
(3) PATH
にCMake.app
内のbin
ディレクトリへのパスを追加します。いくつか方法がありますが、私の場合は~/.profile
を編集する方法で行いました。~/.profile
を編集して以下の様にパスを追加します。macOS Catalina 10.15以降ではデフォルトのシェルがzshに変わっています。zshの場合は ~/.zshrc
を編集してください。
#!/bin/sh
export PATH=/Applications/CMake.app/Contents/bin:$PATH
(4) ターミナルを再起動して、cmake --version
を実行してパスが正しく通っているか確認します。
$ cmake --version
cmake version 3.16.5
CMake suite maintained and supported by Kitware (kitware.com/cmake).
OpenCVをビルドする
OpenCVのmacOS用のビルド済みのバイナリは公開されていないので、ソースファイルをダウンロードしてビルドします。
OpenCVのGitHubのリポジトリからソースファイルのアーカイブをダウンロードします。
ダウンロードしたアーカイブを展開し、次のようなディレクトリ構成になるように、build_opencv
とpublic
ディレクトリを作ります。
.
├── build_opencv
├── opencv-4.3.0
└── public
build_opencv
はビルド作業用ディレクトリ、public
はビルドした後のSDKを入れるディレクトリです。
ターミナルで次のように作業します。
(1) build_opencv
ディレクトリに移動して、ビルドの準備作業を行う。
$ cd build_opencv
$ cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=OFF ../ -DCMAKE_INSTALL_PREFIX=../public ../opencv-4.3.0
(2) ビルドを行う。ビルドには少し時間がかかりますが、進捗率が表示されるので不安にならずに見守れます。
$ make -j7
(3) SDKのファイル一式をpublic
フォルダにコピーする。
$ make install
OpenCVを使ったアプリをビルドするときに必要になるファイルがpublic
フォルダにコピーされます。
Xcodeのプロジェクト設定
ビルドしたライブラリを使うには、Xcodeのプロジェクトの設定が必要です。
SDKのコピー
次のようにSDKのファイル一式をコピーします。私の場合は、プロジェクト単位の方が都合が良いので、プロジェクト内にコピーします。public/usr/local/include
とpublic/usr/local/lib
をプロジェクトのルートディレクトにcommon
というフォルダを作りコピーします。
次のようなディレクトリ構成になります。
OpenCVTest
├── OpenCVTest
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ └── Contents.json
│ ├── Base.lproj
│ │ └── Main.storyboard
│ ├── Info.plist
│ ├── OpenCVTest.entitlements
│ ├── ViewController.h
│ ├── ViewController.m
│ └── main.m
├── OpenCVTest.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcuserdata
│ └── xcuserdata
└── common
└── opencv
├── include
└── lib
ヘッダーの設定
OpenCVのヘッダファイルを読み込めるようにするため、検索パスに追加します。
ターゲットの設定の「Search Paths」の「Header Search Paths」に$(SRCROOT)/common/opencv/include
を追加します。
共有ライブラリの設定
共用ライブラリは、アプリパッケージ内にコピーして使うように設定します。
(1) まずは、プロジェクトに共有ライブラリを登録します。
私の場合はOpenCVは複数のライブラリに分かれています。使用する機能に合わせたライブラリを登録します。例えば、基本的な画像処理であれば、次の2つです。
libopencv_core.4.3.0.dylib
libopencv_imgproc.4.3.0.dylib
libopencv_core.4.3.dylib
のように末尾の.0
が削除されている状態で入っています。そのため、使うときにライブラリが見つからないというエラーになってしまいます。一番簡単な解決方法はライブラリファイルの名前変更です。libopencv_core.4.3.dylib
に変更しておくと回避できます。シンボリックリンクファイルが作成されていますが、削除してしまって問題ありません。プロジェクト単位でコピーしていると、他に影響を与えないので、気軽に名前変更できます。
(2) アプリパッケージ内のFrameworks
にコピーされるように設定する。
ターゲットの設定の「Build Phases」に「Copy File」フェーズを追加します。既にCopy Fileフェーズがあれば、そこに追加登録でも問題ありません。
ライブラリが見つからないエラーが出るとき
ライブラリが見つからないというエラーが出る場合があります。この場合は、ライブラリの検索パスとフレームワークの検索パスの両方に、OpenCVのライブラリディレクトリへのパスを追加すると回避できます。
投稿者プロフィール

- macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者
- アールケー開発代表。macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者。ObjC/Swift/C++をよく使っています。開発実務経験を基に、教育コンテンツ開発、技術書執筆、技術指導、技術セミナー講師、企業内研修講師、行政・自治体職員研修講師も行います。
最新の投稿
NoneCategorized2021.02.25ブログ統合(予定)のお知らせ
アプリ開発2021.01.09SwiftUIの2つのライフサイクル
Web開発2020.12.03Language Switcher で発生する 302 リダイレクトの修正
Web開発2020.12.01WordPressのXML Sitemapsプラグインを動かす