iphone15も出たし、iOSでOpenCVを使いたいと思い調査したところ、Objective-C関連は何もしなくても良くなってるみたい。Podもあるから楽勝!と思いきや、エラーがでて使えなかったので、コツコツとMakeしたら動くようになったのでメモしておきます。
試した環境
Macbook Air M1
Xcode15
MacOS Ventura 13.5.2
事前準備
Cmakeをインストール
brew install cmake
Python3をインストール
brew install python3
OpenCVのMake
Gitから落としてくる
git clone https://github.com/opencv/opencv.git -b 4.6.0
git clone https://github.com/opencv/opencv_contrib.git -b 4.6.0
Make実行。Targetは13以降で使いたいので13に設定してるが適宜変更
python3 opencv/platforms/apple/build_xcframework.py --out ios_opencv --contrib opencv_contrib --iphoneos_archs arm64 --build_only_specified_archs --iphoneos_deployment_target 13
Make時にエラーがでることがある。Python見つからないエラーで、2,3回やり直しましたよ。。
これが、このメモを書いた理由です。
The following build commands failed:
PhaseScriptExecution Generate\ CMakeFiles/dephelper/gen_opencv_objc_source_ios /Users/gpdawson/OpenCV/ios/build/build-armv7-iphoneos/modules/objc_bindings_generator/OpenCV.build/Release-iphoneos/gen_opencv_objc_source_ios.build/Script-3FBBE1BDDA1370F9CBF43EC8.sh (in target 'gen_opencv_objc_source_ios' from project 'OpenCV')
(1 failure)
============================================================
ERROR: Command '['xcodebuild', 'BITCODE_GENERATION_MODE=bitcode', 'IPHONEOS_DEPLOYMENT_TARGET=9.0', 'ARCHS=armv7', '-sdk', 'iphoneos', '-configuration', 'Release', '-parallelizeTargets', '-jobs', '6', '-target', 'ALL_BUILD', 'build']' returned non-zero exit status 65.
============================================================
Traceback (most recent call last):
File "/Users/gpdawson/OpenCV/opencv/platforms/ios/build_framework.py", line 181, in build
self._build(outdir)
File "/Users/gpdawson/OpenCV/opencv/platforms/ios/build_framework.py", line 139, in _build
self.buildOne(target[0], target[1], main_build_dir, cmake_flags)
File "/Users/gpdawson/OpenCV/opencv/platforms/ios/build_framework.py", line 318, in buildOne
execute(buildcmd + ["-target", "ALL_BUILD", "build"], cwd = builddir)
File "/Users/gpdawson/OpenCV/opencv/platforms/apple/cv_build_utils.py", line 13, in execute
retcode = check_call(cmd, cwd = cwd)
File "/usr/local/Cellar/python@3.9/3.9.5/Frameworks/Python.framework/Versions/3.9/lib/python3.9/subprocess.py", line 373, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['xcodebuild', 'BITCODE_GENERATION_MODE=bitcode', 'IPHONEOS_DEPLOYMENT_TARGET=9.0', 'ARCHS=armv7', '-sdk', 'iphoneos', '-configuration', 'Release', '-parallelizeTargets', '-jobs', '6', '-target', 'ALL_BUILD', 'build']' returned non-zero exit status 65.
そんなときはPythonが見つかってないのでリンクする
ln -s /usr/local/bin/python3 /usr/local/bin/python
気を取り直して再度Make実行。
M1 Macbook Airで本が一冊読める程度には待つとできあがり
ios_opencv/iphoneos/opencv2.framework
Projectに組込
Xcode15で適当なProjectを作成して、作成したframeworkを組み込む。
この辺りは他でもいっぱい書いてある通りなのでさらっと流します。
-
opencv2.frameworkをドロップする
✔Copy Item if needed
✔Create groups -
Target -> General -> Frameworks, Libraries, and Embedded Content
2.1 opencv2.framework を Do not Embedに設定
2.2 +を押して 「ibc++.tbd」 を追加
以上で、import opencv2の追加で使えるようになりました。
ググってると"Other Linker Flags" に -all_load を追加するとか、色々かいてあったけど
環境に依存するかもしれませんが無くてもOKでした。
適当にJpegをGrayscaleにするコードを書いて動作確認してできあがり。