2015-06-18 203 views

回答

62

OpenCV是一个用C++编写的框架。 Apple的reference告诉我们

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

,所以你不能直接导入和迅速的项目中使用OpenCV的,但其实这是不坏,因为你(需要)继续使用,这是非常有据可查的所有过网框架的C++语法。

那么你如何继续?

  1. 用于调用C++的OpenCV

OpenCVWrapper.h

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 

@interface OpenCVWrapper : NSObject 

    + (UIImage *)processImageWithOpenCV:(UIImage*)inputImage; 

@end 

OpenCVWrapper.mm创建一个新的目标C++类(.H,.mm)(使用Objective-C的文件 - >新建...向导并将.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 

作为创建新类(如示例OpenCVWrapper.h/mm)的替代方法,可以使用Objective-C类将OpenCV功能扩展到现有的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

  • 更新Bridging-Header,通过导入将您创建的所有Objective-C++类提供给Swift新创建的包装(#import "OpenCVWrapper.h"

  • 使用您的包装在斯威夫特文件:

    令图像=的UIImage(命名为: “image.jpeg”) 让processedImage = OpenCVWrapper.processImageWithOpenCV(图)

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

    +0

    你好,我是新来的OpenCV。你能告诉我在UIImage + OpenCV类中应该有什么?我应该从哪里下载它? – GMHSJ

    +0

    @GMHSJ:它是UIImage的扩展,它有助于将cv :: Mat结构转换为UIImage,因此您必须在您的项目中创建它。 – Shrawan

    +2

    #include 应包含在其他所有内容之前。如果不会出现一些冲突。 – Pochi

    34

    我已经在GitHub上演示:

    https://github.com/foundry/OpenCVSwiftStitch

    它展示了如何使用OpenCV的拼接从基于SWIFT的项目。 openCV方面没有太多,它只是一个演示如何将各个部分放在一起。由于Swift不会直接与C++对话,它使用一个简单的Objective-C++包装来在iOS端和openCV端之间进行调解。

    制造回答这些问题:
    Can I mix Swift with C++? Like the Objective - C .mm files
    libraries to CAPTURE panorama in iOS 6

    +0

    @Kashif,我已通过您的网站上的联系方式回复。 – foundry

    +3

    github上的这个演示(OpenCVSwiftStitch)是迄今为止我发现的将Swift与OpenCV集成的最佳教程和实践演示。它回答了问题,给出了安装说明,并展示了如何放入UIImage + OpenCV类别实现。 阅读完本文后,我终于可以开始了,将图像从UIImage格式转换为OpenCV Mat,做一些处理,转换回来并显示图像 – Paulus

    +0

    @Paulus - 感谢您的反馈。我很高兴你发现它很有用。 – foundry