XCodeでOpenCVを使う方法として、これまでObjective-CからOpenCVを呼び出す方法しか知りませんでしたが、実はいつの間にかSwiftからの呼び出しにも対応していたようです。この辺りを参考に試してみましたので、その方法をご紹介します。
まず、ターミナルでの作業となります。CMakeなど必要なモジュール類をインストールしておきます。
brew cmake
xcode-select --install
展開するフォルダを ~/git として説明します。 ~/git フォルダに移動します。
~/git
opencvとopencv_contribをクローンします。後者contribは不要であれば省略してください。私はSfMなどで必要なので含めています。
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
iOS用のフォルダに移動します。
cd opencv/platforms/ios
ビルド用に build というフォルダを作成します。
mkdir build
下記コマンドを実行して、ビルドします。最後の--contribオプションはcontribが不要であれば省略してください。また、試していないので分かりませんが、--iphonesimulator_archsオプションはM1 Macの場合にはARMS系に変更が必要かもしれません。
./build_framework.py ./build --iphoneos_archs=arm64 --iphonesimulator_archs=x86_64 --contrib ../../../opencv_contrib
しばらく待って、ビルドが完了すると、buildフォルダ下にopencv2.frameworkが生成されています。
ここからはXCodeでの作業です。OpenCVを使いたいプロジェクトを開きます。プロジェクトフォルダの下にFrameworksというフォルダを作成し、先ほど確認したbuildフォルダ下のopencv2.framework を作成したFrameworksフォルダにコピーします。
Xcodeで、Frameworksというグループを新規に作成します。
buildフォルダ化にコピーしたopencv2.frameworkをXCode画面上のFrameworksの下にドラッグします。
ドラッグした際に聞かれるオプション設定は下記を指定します。
libc++.tbdを追加します。
以上で下準備は完了です。あとは実際にSwift コードにOpenCVを記載することで利用が可能です。
以下はコードのサンプルです。一部変数がサンプル内で宣言されていませんが、ご容赦ください。
import opencv2
let alg = opencv2.AKAZE.create()
var curKpts:[opencv2.KeyPoint] = []
var curDesc:Mat = Mat()
var mask:Mat = Mat.ones(rows: srcMat.rows(), cols: srcMat.cols(), type:CvType.CV_8UC3)
alg.detectAndCompute(image: srcMat, mask: mask, keypoints: &curKpts, descriptors: curDesc)