迎着微风出发——iOS项目接opencv

794 阅读1分钟

开启了一个独立开发项目,在追求自由的路上启程了,准备先试水一个图像处理相关的项目,需要用到opencv,此文记录一下swift工程通过cocoapods集成opencv必然碰到的两个问题:oc引用opencv的c++代码和OC引用opencv头文件时的头文件放置顺序问题,存在前一个问题的原因是swift不能直接调用c++,需要通过OC间接调用

环境

  • XCode 15
  • cocoapod 1.16.2
  • swift

oc引用opencv的c++代码

要点:OC实现需要使用OC++文件后缀名改为mm,同时编译的C++环境需要支持C++11及在上

如下图所示,新建了OpenCVWrapper.h/OpenCVWrapper.mm文件用于包装opencv的C++代码用于swift调用(当然,最终想让swift调用到还得把Bridging-Header文件建好,不过这是另外的话题了)

image.png

典型的Podfile文件如下所示

Podfile

platform :ios,'17.2'
source 'https://github.com/CocoaPods/Specs.git'
target 'DocScanner' **do**
  pod 'OpenCV', '4.3.0'

  # opencv库是c++代码,要求c++11及以上
  post_install **do** |installer|
    installer.pods_project.targets.each **do** |target|
      # 设置 C++ 标准为 C++17
      target.build_configurations.each **do** |config|
        config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++17'
        config.build_settings['CLANG_CXX_LIBRARY'] = 'libc++'
      end
    end
  end
end

opencv头文件放置顺序

要点:opencv的头文件一定要放置在苹果头文件之前

#import <opencv2/opencv.hpp>
#import "OpenCVWrapper.h"

@implementation OpenCVWrapper

@end

原因解释如下:

因为与苹果宏定义'NO'冲突,如下图68行所示的枚举中存在一个为NO的枚举值,所以需要将opencv头文件(更准确来说是blenders.hpp这个头文件)放置到任何苹果头文件之前

image.png

对应的stackoverflow链接也放在这里了,感兴趣可以详细看一下