本博主前后编译了OpenCV的各种版本,感兴趣的可以浏览之前的博文。此篇为iOS编译opencv-framework,官网发布的opencv-4.x-ios-framework.zip不包括opencv_contrib模块,如果不需要里面的功能,则可以直接使用官方版。
说明:本文使用的系统和软件版本以及工作目录都是本博真实环境,仅供参考。
brew install cmake
opencv-4.5.2
opencv_contrib-4.5.2
脚本位置:
Workspace/opencv-4.5.2/platforms/ios/build_framework.py
一共需要修改三处,分别位于47行、491行、496行:
...
self.contrib = None
...
folder = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), "../.."))
...
parser.add_argument('--contrib', metavar='DIR', default=None, help='folder with opencv_contrib repository (default is "None" - build only main framework)')
...
改为
...
self.contrib = os.path.abspath(contrib)
...
folder = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), "../.."))
folder2 = os.path.join(os.path.join(os.path.dirname(folder), "opencv_contrib-4.5.2"))
...
parser.add_argument('--contrib', metavar='DIR', default=folder2, help='folder with opencv_contrib repository (default is "None" - build only main framework)')
...
简单说就是配置opencv_contrib的位置,根据自己的目录修改。
cd Workspace
python opencv-4.5.2/platforms/ios/build_framework.py ios
按照官方的说法,执行上述这一行命令后,就会编译成功,在Workspace目录下会出现ios目录,里面包含着各种arm平台的framework包。
然而,经验告诉本博主,世上没有一次就编译通过的工程。。。
首先,命令
python opencv-4.5.2/platforms/ios/build_framework.py ios
以及之前的所有准备工作都是OK的,问题是当前macOS版本已经不再支持python2,无法执行python命令,似乎所有新版macOS都不再支持python2。
python3 opencv-4.5.2/platforms/ios/build_framework.py ios
得到了错误:
returned non-zero exit status 65
这个错误可以在GitHub上找到很多,以及各种解决办法。
sudo ln -s /usr/bin/python3 /usr/bin/python
根据各位大神提供的解决方案,最多的是为python3建立软连接。但是,目录/usr/bin/是没有权限建立软连接的,如果在/usr/local/bin/python3就解决了。
python3 -m venv .venv
source .venv/bin/activate
python opencv-4.5.2/platforms/ios/build_framework.py ios
Bingo…
一定要能执行python而不是python3,尝试多次,对本博主的各种环境而言,最简单有效的就是建立虚拟环境,在虚拟环境中执行此命令。
另外,就不要尝试在macOS中安装python2了,过去的就让它过去吧。。。
编译后得到如下目录内容:
整个编译过程确实比编译OpenCV4Android要简单很多。。。
参考链接:https://blog.csdn.net/GikkiAres/article/details/84338358
在调用二维码接口时,遭遇崩溃,因为iOS路径assert语句,简单处理方式就是注释四行路径检测:
wechat_qrcode.cpp中WeChatQRCode构造方法内:
//CV_Assert(utils::fs::exists(detector_prototxt_path));
//CV_Assert(utils::fs::exists(detector_caffe_model_path));
//CV_Assert(utils::fs::exists(super_resolution_prototxt_path));
//CV_Assert(utils::fs::exists(super_resolution_caffe_model_path));