iOS17 + XCode15 + Swift + OpenCV 


iphone15も出たし、iOSでOpenCVを使いたいと思い調査したところ、Objective-C関連は何もしなくても良くなってるみたい。Podもあるから楽勝！と思いきや、エラーがでて使えなかったので、コツコツとMakeしたら動くようになったのでメモしておきます。

# 試した環境
Macbook Air M1
Xcode15
MacOS Ventura 13.5.2


# 事前準備
Cmakeをインストール
<pre>brew install cmake</pre>
Python3をインストール
<pre>brew install python3</pre>


# OpenCVのMake
Gitから落としてくる
<pre>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
</pre>

Make実行。Targetは13以降で使いたいので13に設定してるが適宜変更
<pre>python3 opencv/platforms/apple/build_xcframework.py --out ios_opencv --contrib opencv_contrib --iphoneos_archs arm64 --build_only_specified_archs --iphoneos_deployment_target 13
</pre>


Make時にエラーがでることがある。Python見つからないエラーで、2，3回やり直しましたよ。。
これが、このメモを書いた理由です。
<pre>
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.
</pre>

そんなときはPythonが見つかってないのでリンクする
<pre>ln -s /usr/local/bin/python3 /usr/local/bin/python</pre>

気を取り直して再度Make実行。

M1 Macbook Airで本が一冊読める程度には待つとできあがり
<pre>ios_opencv/iphoneos/opencv2.framework
</pre>

# Projectに組込
Xcode15で適当なProjectを作成して、作成したframeworkを組み込む。
この辺りは他でもいっぱい書いてある通りなのでさらっと流します。

1. opencv2.frameworkをドロップする
✔Copy Item if needed 
✔Create groups

2. 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にするコードを書いて動作確認してできあがり。