Mac下编译用于iOS平台的OpenCV及OpenCV_Contrib Framework

项目需要使用OpenCV标准库之外,OpenCV_Contrib提供的算法。因此用OpenCV源代码编译了用于iOS平台的Framework

不需要自行编译Framework,可以直接下载编译好的,然后拉到后面“使用Framework”

一. 编译环境

  • macOS 10.12.5
  • OpenCV 3.2.0
  • OpenCV_Contrib 3.2.0

二. 编译过程

(都是回忆,如果哪天我再次编译,我再补充过程截图)

  1. 下载OpenCVOpenCV_Contrib源代码
  • 编译方法
    opencv-3.2.0\platforms\ios\readme.txt(或者github)中有编译方法说明,这里直接抄过来

Building OpenCV from Source, using CMake and Command Line
==================================================<br >
cd ~/<my_working_directory>
python opencv/platforms/ios/build_framework.py ios<br >
If everything's fine, a few minutes later you will get ~/<my_working_directory>/ios/opencv2.framework. You can add this framework to your Xcode projects.

  • 在编译开始前,需要先安装cmake和cmake命令行工具。安装cmake后,打开软件,工具栏->tools->How to Install For Command Line Use中有安装命令行工具的说明:

  • 合并OpenCV和OpenCV_Contrib
    (更加优美的办法我不知道,我用了比较偷懒的方法将OpenCV和OpenCV_Contrib编译到了同一个Framework中)

    • 复制opencv_contrib-3.2.0\modules下需要的模块(文件夹)至opencv-3.2.0\modules
  • 使用2. 中所述方法开始编译
    成功后,会在opencv-3.2.0\build\ios中出现opencv2.framework

三. 使用Framework

  1. 添加Framework
    opencv2.framework要放在Xcode工程目录下,否则添加framework后会提示找不到头文件
    选择target->Build Phases->Link Binary With Libraries->点击"+"号->Add Other...->选择opencv2.framework->点击Open



    完成后
  • 使用OpenCV
    代码部分,和Windows上C++使用OpenCV是一样的,写段代码测试一下工程能否成功build就行。
    下面这段非主流代码,是我随手写的,笑笑就好。
#import <Foundation/Foundation.h>
#import <opencv2/core/core.hpp>
using namespace cv;
int Add(int x){
        Mat A = (Mat_<float>(1,2)<<
                 1,1);
        Mat B = (Mat_<float>(2,1)<<
                 x,
                 1);
        Mat C = A*B;
        return (int)C.at<float>(0,0);
    }

四. Tips

  • RTTI。用OpenCV某些算法的时候需要打开RTTI(Xcode是怎么提示的我忘了),打开方法:选择target->Build Settings->搜索框里输入RTTI->Enable C++ Runtime Types选择Yes
  • 命名冲突(忘了具体是什么冲突了,好像是keyword还是重定义还是宏定义冲突……)
    打开Prefix.pch文件,在最前面增加
#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#import <opencv2/stitching/detail/blenders.hpp>
#import <opencv2/stitching/detail/exposure_compensate.hpp>
#endif
  • 类型冲突
    OpenCV的Point和iOS的Point类型名重复了,只能cv::Point
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容