iOS集成OpenCV

iOS項目集成OpenCV及踩過的坑

1、直接下載Framework集成

1.一、下載OpenCV的Framework

OpenCV官網下載框架,拖入Xcode項目。ios

1.二、導入OpenCV依賴的庫

導入路徑:選擇項目—>Targets—>General—>Linked Frameworks and Libraies,點擊」+」添加下方依賴庫。c++

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

1.三、改成Objective-C與C++混編

凡是導入OpenCV頭文件的類,都須要把相應類後綴名.m改成.mmgit

#import <opencv2/opencv.hpp>
#import <opencv2/imgproc/types_c.h>
#import <opencv2/imgcodecs/ios.h>
複製代碼

2、CocoaPods方式集成(不推薦)

2.1 CocoaPods文件配置

在項目Pod文件中配置pod ‘OpenCV’,而後pod update;同理,使用時導入OpenCV相應的頭文件,並把類後綴名.m改成.mmgithub

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仍舊認爲是同一個文件。iphone

3、已經踩過的深坑

3.一、導入頭文件的深坑

導入**#import <opencv2/opencv.hpp>報Expected identitier的錯誤。這是因爲opencv 的 import 要寫在#import <UIKit/UIKit.h>、#import <Foundation/Foundation.h>**這些系統自帶的 framework 前面,不然會出現重命名的衝突。ide

導入頭文件錯誤

3.二、Objective-C和C++的混編的深坑

OpenCV框架提供是C++的API接口,凡是使用OpenCV的地方,類的文件類型必須由.m類型改成.mm類型,這時候編譯器按照OC與C++混編進行編譯。ui

假設你使用OpenCV的類爲A.mm,那若是你在Objective-C的類B.m中導入使用,此時編譯器會認爲此時A.mm也按照Objective-C類型編譯,你必須把B.m類型更改成B.mm類型纔不會報錯,以此類推,你在C.m中使用B.mm,那C也必須更改成C.mm類型。。。有人比喻這樣蔓延的有點像森林大火,一個接一個,很形象。spa

解決辦法:在導入OpenCV頭文件的時候,#import <opencv2/opencv.hpp>前面加上#ifdef __cplusplus,指明編譯器只有使用了OpenCV的.mm類型文件,才按照C++類型編譯。以下便可解決:3d

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

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.四、UIImage與cv::Mat轉換報錯。

讀取視頻幀,轉換爲UIImage時報**_CMSampleBufferGetImageBuffer", referenced from:的錯誤,是因爲缺乏CoreMedia.framework框架,在Targets—>General—>Linked Frameworks and Libraies導入CoreMedia.framework**框架便可。


若是您以爲有所幫助,請在GitHub OpenCVDemo上賞個Star ⭐️,您的鼓勵是我前進的動力

相關文章
相關標籤/搜索