iOS集成OpenCV

作者: CocoFei | 来源:发表于2017-07-13 19:10 被阅读955次

iOS项目集成OpenCV及踩过的坑

一、直接下载Framework集成

1.1、下载OpenCV的Framework

OpenCV官网下载框架,拖入Xcode项目。

1.2、导入OpenCV依赖的库

导入路径:选择项目—>Targets—>General—>Linked Frameworks and Libraies,点击”+”添加下方依赖库。

  • libc++.tbd
  • AVFoundation.framework
  • CoreImage.framework
  • CoreGraphics.framework
  • QuartzCore.framework
  • Accelerate.framework
  • CoreVideo.framework
  • CoreMedia.framework
  • AssetsLibrary.framework

1.3、改为Objective-C与C++混编

凡是导入OpenCV头文件的类,都需要把相应类后缀名.m改为.mm。

#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>

二、CocoaPods方式集成(不推荐)

2.1 CocoaPods文件配置

在项目Pod文件中配置pod ‘OpenCV’,然后pod update;同理,使用时导入OpenCV相应的头文件,并把类后缀名.m改为.mm。

2.2 使用CocoaPods集成OpenCV说明

使用CocoaPods虽然配置简单,但自动配置的不正确,存在名称重复等大量的问题。例如:

Warning: Multiple build commands for output file /Users/P85755/Library/Developer/Xcode/DerivedData/PracticeProject-bgmxispyljyrbfdimchwaxacraaa/Build/Products/Debug-iphoneos/OpenCV/calib3d.hpp
Warning: Multiple build commands for output file /Users/P85755/Library/Developer/Xcode/DerivedData/PracticeProject-bgmxispyljyrbfdimchwaxacraaa/Build/Products/Debug-iphoneos/OpenCV/core.hpp
。。。。。。。。。等等
是由于CocoaPods自动配置时,生成了相同名称的.h配置文件,虽然在不同路径,Xcode仍旧认为是同一个文件。

三、已经踩过的深坑

3.1、导入头文件的深坑

导入#import <opencv2/opencv.hpp>报Expected identitier的错误。这是由于opencv 的 import 要写在#import <UIKit/UIKit.h>、#import <Foundation/Foundation.h>这些系统自带的 framework 前面,否则会出现重命名的冲突。

导入头文件错误

3.2、Objective-C和C++的混编的深坑

OpenCV框架提供是C++的API接口,凡是使用OpenCV的地方,类的文件类型必须由.m类型改为.mm类型,这时候编译器按照OC与C++混编进行编译。

假设你使用OpenCV的类为A.mm,那如果你在Objective-C的类B.m中导入使用,此时编译器会认为此时A.mm也按照Objective-C类型编译,你必须把B.m类型更改为B.mm类型才不会报错,以此类推,你在C.m中使用B.mm,那C也必须更改为C.mm类型。。。有人比喻这样蔓延的有点像森林大火,一个接一个,很形象。

解决办法:在导入OpenCV头文件的时候,#import <opencv2/opencv.hpp>前面加上#ifdef __cplusplus,指明编译器只有使用了OpenCV的.mm类型文件,才按照C++类型编译。如下即可解决:

#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>
#endif

3.3、编译警告

导入OpenCV使用时,Xcode8会有一堆类似warning: empty paragraph passed to '@param' command [-Wdocumentation]的文档警告。

导入头文件错误

虽然项目目前不报错了,但对于有强迫症的小伙伴来说,还是不能忍。解决办法:导入头文件的时候,忽略文档警告即可;同时只在需要的地方导入C++类,则加上编译器忽略文档警告即可,解决办法如下:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdocumentation"

#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>
#endif

#pragma clang pop

3.4、UIImage与cv::Mat转换报错。

读取视频帧,转换为UIImage时报_CMSampleBufferGetImageBuffer", referenced from:的错误,是由于缺少CoreMedia.framework框架,在Targets—>General—>Linked Frameworks and Libraies导入CoreMedia.framework框架即可。


如果您觉得有所帮助,请在GitHub OpenCVDemo上赏个Star ⭐️,您的鼓励是我前进的动力

相关文章

网友评论

  • 356448bcb3d8:点着点着 就崩了额 (xcode 9.4.1 手机 11.4 SDK 3.4.1)

    2018-07-31 15:29:54.667581+0800 OpenCVDemo[32989:10377158] [DYMTLInitPlatform] platform initialization successful
    2018-07-31 15:29:57.234050+0800 OpenCVDemo[32989:10376992] [MC] System group container for systemgroup.com.apple.configurationprofiles path is /private/var/containers/Shared/SystemGroup/systemgroup.com.apple.configurationprofiles
    2018-07-31 15:29:57.236012+0800 OpenCVDemo[32989:10376992] [MC] Reading from public effective user settings.
    2018-07-31 15:29:58.000348+0800 OpenCVDemo[32989:10376992] Load success.......
    2018-07-31 15:30:00.659349+0800 OpenCVDemo[32989:10376992] Status bar could not find cached time string image. Rendering in-process.
    OpenCV(3.4.1) Error: Assertion failed (s >= 0) in setSize, file /Volumes/build-storage/build/master_iOS-mac/opencv/modules/core/src/matrix.cpp, line 235
    libc++abi.dylib: terminating with uncaught exception of type cv::Exception: OpenCV(3.4.1) /Volumes/build-storage/build/master_iOS-mac/opencv/modules/core/src/matrix.cpp:235: error: (-215) s >= 0 in function setSize
  • 达若漠沙:不错,点赞,github已start~
    CocoFei:@达若漠沙 :grin:
  • 流年灬未亡_39fe:'opencv2/opencv.hpp' file not found
    xcode 9.2 (9C40b) opencv 3.4.1 opencv3.3.0
    都试过了,都是这个错误
    真心求源代码,谢谢。
    418532361@qq.com
    流年灬未亡_39fe:@CocoFei 发自内心感谢,折腾了一下午,成功了。
    xcode 9.2 (9C40b) opencv 3.4.1 ios10.2 iphone6s
    祝楼主万事如意,大吉大利!
    CocoFei:额,刚看明白,又一个不看说明的!!!opencv的包有三百多兆,无法上传到GitHub,所以将OpenCV的Framework删除,只上传了一个主工程,你从OpenCV官网(https://opencv.org)下载iOS版的OpenCV的Framework,拖入项目的ThirdFramework文件下即可
    CocoFei:@流年灬未亡_39fe 我刚试过的,从GitHub下载工程,拖入从网上下载opencv 3.4.1到工程,编译通过,没问题啊
  • AliceJordan:'opencv2/opencv.hpp' file not found
    CocoFei:@AliceJordan 你是XCode 9环境,OpenCV 3.3版本吗?
    检查拖入的opencv2.framework的右侧属性Target是否勾选指向当前项目,依赖类是否添加了;
    我特意试过,OpenCV 3.2拖入会报这个错误,但3.3拖入就正常了;你再检查一下环境,如果不行,给我留个邮箱,我把配置好的发给你。
    AliceJordan:@CocoFei 我看了你的github也照着做了但出现了这个问题
    CocoFei:应该opencv3.2版本不兼容xcode9,下载最新版的3.3版本,拖入即可运行,我GitHub上面Demo的说明上面有,你仔细看一下https://github.com/muzipiao/OpenCVDemo

本文标题:iOS集成OpenCV

本文链接:https://www.haomeiwen.com/subject/ydrghxtx.html