在Swift iOS中使用OpenCV

在我的xcode项目中添加OpenCV 2框架之后,我尝试search与swift集成的samlpes或教程。

有没有什么好的教程相同?

OpenCV是一个用C ++编写的框架。 苹果的参考告诉我们

你不能直接导入C ++代码到Swift中。 相反,为C ++代码创build一个Objective-C或C包装器。

所以你不能在一个swift项目中直接导入和使用OpenCV,但是这实际上并不糟糕,因为你需要继续使用框架的C ++语法。

那么你如何继续?

  1. 创build一个新的Objective-C ++类(.h, .mm )来调用C ++ OpenCV

OpenCVWrapper.h

#import <UIKit/UIKit.h> #import <Foundation/Foundation.h> @interface OpenCVWrapper : NSObject + (UIImage *)processImageWithOpenCV:(UIImage*)inputImage; @end 

OpenCVWrapper.mm (使用Objective-C的文件 – >新build…向导并将.m文件重命名为.mm)

 #include "OpenCVWrapper.h" #import "UIImage+OpenCV.h" // See below to create this #include <opencv2/opencv.hpp> using namespace cv; using namespace std; @implementation OpenCVWrapper : NSObject + (UIImage *)processImageWithOpenCV:(UIImage*)inputImage { Mat mat = [inputImage CVMat]; // do your processing here ... return [UIImage imageWithCVMat:mat]; } @end 

作为创build新类的替代方法,例如OpenCVWrapper.h / mm,您可以使用Objective-C类来扩展现有的具有OpenCVfunction的Objective-C类。 例如UIImage + OpenCV类别:

的UIImage + OpenCV.h

 #import <UIKit/UIKit.h> #import <opencv2/opencv.hpp> @interface UIImage (OpenCV) //cv::Mat to UIImage + (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat; - (id)initWithCVMat:(const cv::Mat&)cvMat; //UIImage to cv::Mat - (cv::Mat)CVMat; - (cv::Mat)CVMat3; // no alpha channel - (cv::Mat)CVGrayscaleMat; @end 

的UIImage + OpenCV.mm

https://github.com/foundry/OpenCVSwiftStitch/blob/master/SwiftStitch/UIImage%2BOpenCV.mm

  1. 通过导入新创build的包装器( #import "OpenCVWrapper.h" )更新Bridging-Header ,使您创build的所有Objective-C ++类可用于Swift

  2. 在你的Swift文件中使用你的包装:

    let image = UIImage(named:“image.jpeg”)let processedImage = OpenCVWrapper.processImageWithOpenCV(image)

所有包含在桥头的Objective-C ++类都可以直接从Swift中获得。

我在github上有一个演示:

https://github.com/foundry/OpenCVSwiftStitch

它演示了如何从基于Swift的项目中使用OpenCV stitcher。 openCV方面没有太多的东西,它只是一个演示如何把各个部分放在一起。

由于Swift不会直接使用C ++,它使用一个简单的Objective-C ++包装来在iOS端和openCV端之间进行调解。

作出回答这些问题:
我可以混合使用Swift和C ++吗? 像Objective – C .mm文件一样
库到iOS 6的CAPTURE全景