Take’s diary

Macとマイコンに関すること--ワクワクの製作日記

M1 MacでOpenframeworks for iOS

久々のブログ更新

 M1 MacBook Airを手に入れてから、Openframeworks for iOSがまともに動かなくなったので、諦めて1年近く経ちました。特にOpenframeworks上でOpenCVを使ったものはお手上げ。今回はOpenCVのソースビルドからスタートです。

 今回は以前作ったステレオサーマルカメラのデプス表示部分を実機稼働させてみました。何が原因かわからずエラー出まくりのM1 Mac上でOFでの実機ビルドの他に、全く動く気配もなかったOpenCV for iOSも、contribを含めた最新フルバージョンで動くようになりました。終わってしまえば案外簡単な結末でした。

f:id:TAKEsan:20220102143111p:plain

OpenCV のソースをM1 iOS用にビルド

 このブログを参考にさせていただきました。ただしインストールは簡単にはいかず、試行錯誤の上ビルドしました。

https://www.cathand.app/entry/2020/11/23/214000

 

OpenCVインストールの条件、内容は、

  • M1 MacにはあらかじめHomebrew、git、最新のcmake(3.22.1)をインストール
  • macOSバージョンは現在最新の12.0.1 Monterey Xcodeは13.2.1
  • 現在OpenCV3.4.6ではうまくビルドできず、OpenCV4.5.3ならOK
  • contribも一緒にインストール。

cmakeなどの基本ソフトのインストールは他の方が詳しく書いていますので省略。

まず

以下からOpenCV4.5.3とOpencv Contribをダウンロードします。

https://opencv.org/releases

GitHub - opencv/opencv_contrib: Repository for OpenCV's extra modules

Xcode認識のためターミナルから

   sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

好きなところにダウンロード解凍したOpenCVフォルダを置き、その中に同じくダウンロードしたopencv_contrib フォルダを入れます。

さらにopencv_contribに入り 

   git checkout -b 4.5.3 refs/tags/4.5.3

で、contribのバージョンをOpenCvと合わせ、Opencvフォルダに戻った後

opencv-4.5.3/platforms/ios/build_framework.py を開きます

 

f:id:TAKEsan:20220102132917p:plain

このように560、561行目にコメントを入れ、

python2.7 platforms/ios/build_framework.py  --iphoneos_archs armv7,armv7s,arm64 —iphoneos_deployment_target 9 --dynamic --contrib opencv_contrib iphones

を実行。実機用のopencv2.frameworkをビルドします。

次に今のこのコメントを外し、同じように今度は578,579行の最初にコメントを入れ

python2.7 platforms/ios/build_framework.py --iphonesimulator_archs  i386,x86_64,arm64  --iphoneos_deployment_target 9 --dynamic --contrib opencv_contrib iphonesimulator

でシュミレーション用のopencv2.frameworkをビルド。どちらも20分以上かかります。

最後に

xcodebuild -create-xcframework -output opencv2.xcframework -framework iphones/opencv2.framework -framework iphonesimulator/opencv2.framework

で合体。

opencv2.xcframeworkというフォルダができますので、これをOpenCVを使いたいプロジェクトフォルダにコピーしておきます。605Mという巨大なファイルですが、Xcode上でうっかりミスで消してしまうことが多いのでコピーした方が無難。

M1 Macで

Openframeworks0.11.2の最新バージョンをダウンロード。

myAppsフォルダにプロジェクトを作成し、その中にopencv2.xcframeworkをコピー

プロジェクトを開き「Frameworks,Libraries,and Embeded Content」 へopencv2.xcframeworkをドラッグ。

f:id:TAKEsan:20220102134138p:plain

さらに最初だけは「Runpath Search Paths」にこのフォルダのパスを記入した方が良いようです。

f:id:TAKEsan:20220102134340p:plain

次に ofxOS_Prefix.pchを開き、最初の方にopencv関連のライブラリヘッダーをインクルード。

今回の場合は、以下4行

  #include <opencv2/opencv.hpp>

  #include <opencv2/stereo.hpp>

  #include "opencv2/ximgproc/disparity_filter.hpp"

  using namespace cv::ximgproc;

この部分は使用するopencvのライブラリによります。

f:id:TAKEsan:20220102134705p:plain

エラーが出ても気にせず、Xcodeを一旦終了。

ファインダーでアプリケーションの中からXcodeを探し右クリックでファイル情報を表示して

Xcodeをロゼッタモードにします。(中間の「Rosettaを使用して開く」にチェックを入れる)

      f:id:TAKEsan:20220102134924p:plain

これで、一応実機とiOSシュミレーションが使えるようになります。が、さらにプロジェクト上の設定で切り替えが必要です。

実機、もしくはアプリショップへダウンロードする場合でアーカイブファイルを作成する場合は、

f:id:TAKEsan:20220102135145p:plain

「Excluded Archutectures」を上図のように空白にし、

シュミレーターを使う場合は、ここをarm64にします。

 さらにM1 Macで動かす場合は(My mac(Designed iPad)を選択する場合)Xcodeのロゼッタモードを解除し、Excluded Archutecturesを空白にすれば簡単に動き出します。

 この切り替えがめんどうくさいのですが、慣れればさほど問題はありません。

 ロゼッタモードでは編集時間の切り替えに少し引っかかる感がありますが、Airでも以前のIntel Mac Proよりビルドスピードが速いので特に問題なし。

 OpencvがOpenframeworks上で自由自在に使えるようになります。問題はOFの画像をOpenCV形式に変換する部分ですが、

   ofImage L_img;

     of一般のイメージ処理

   cv::Mat imgL= cv::Mat(L_img.getHeight(),L_img.getWidth(), CV_8UC3, L_img.getPixels().getData());

という感じで最後に1文を加えれば簡単にofImageからMatに変換できます。逆も一般的なofxopencvのaddonを使う場合と同じ。ofxcvアドオンは便利ですがM1では動かないことと、使えるライブラリが少ないので最初から断念しています。

 

自分用の忘備録ということで説明が大雑把ですが、これで画像処理やOpenCV上のAIは自由自在。当分はなんとかなる。 やれやれ......。