久々のブログ更新
M1 MacBook Airを手に入れてから、Openframeworks for iOSがまともに動かなくなったので、諦めて1年近く経ちました。特にOpenframeworks上でOpenCVを使ったものはお手上げ。今回はOpenCVのソースビルドからスタートです。
今回は以前作ったステレオサーマルカメラのデプス表示部分を実機稼働させてみました。何が原因かわからずエラー出まくりのM1 Mac上でOFでの実機ビルドの他に、全く動く気配もなかったOpenCV for iOSも、contribを含めた最新フルバージョンで動くようになりました。終わってしまえば案外簡単な結末でした。
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をダウンロードします。
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 を開きます
このように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をドラッグ。
さらに最初だけは「Runpath Search Paths」にこのフォルダのパスを記入した方が良いようです。
次に ofxOS_Prefix.pchを開き、最初の方にopencv関連のライブラリヘッダーをインクルード。
今回の場合は、以下4行
#include <opencv2/opencv.hpp>
#include <opencv2/stereo.hpp>
#include "opencv2/ximgproc/disparity_filter.hpp"
using namespace cv::ximgproc;
この部分は使用するopencvのライブラリによります。
エラーが出ても気にせず、Xcodeを一旦終了。
ファインダーでアプリケーションの中からXcodeを探し右クリックでファイル情報を表示して
Xcodeをロゼッタモードにします。(中間の「Rosettaを使用して開く」にチェックを入れる)
これで、一応実機とiOSシュミレーションが使えるようになります。が、さらにプロジェクト上の設定で切り替えが必要です。
実機、もしくはアプリショップへダウンロードする場合でアーカイブファイルを作成する場合は、
「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は自由自在。当分はなんとかなる。 やれやれ......。