在Swift iOS中使用OpenCV
在我的xcode项目中添加OpenCV 2框架之后,我尝试search与swift集成的samlpes或教程。
有没有什么好的教程相同?
OpenCV是一个用C ++编写的框架。 苹果的参考告诉我们
你不能直接导入C ++代码到Swift中。 相反,为C ++代码创build一个Objective-C或C包装器。
所以你不能在一个swift项目中直接导入和使用OpenCV,但是这实际上并不糟糕,因为你需要继续使用框架的C ++语法。
那么你如何继续?
- 创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
-
通过导入新创build的包装器(
#import "OpenCVWrapper.h"
)更新Bridging-Header ,使您创build的所有Objective-C ++类可用于Swift -
在你的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全景