在 Swift iOS 中使用 OpenCV

Using OpenCV in Swift iOS

在我的 xcode 项目中添加 OpenCV 2 框架后,我尝试搜索示例或教程以与 swift 集成。

有什么好的教程吗?

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

You cannot import C++ code directly into Swift. Instead, create an Objective-C or C wrapper for C++ code.

所以你不能在 swift 项目中直接导入和使用 OpenCV,但这实际上一点也不差,因为你(需要)继续使用框架的 C++ 语法,它有很好的文档记录通过网络。

那么你如何进行?

  1. 新建一个Objective-C++ class (.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 的文件 -> 新建...向导并将 .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

作为创建新的 classes 的替代方法,例如示例 OpenCVWrapper。h/mm 您可以使用 Objective-C 类别来扩展现有的 Objective-C class es 具有 OpenCV 功能。比如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. 更新 Bridging-Header,通过导入我们新创建的包装器 (#import "OpenCVWrapper.h")

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

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

桥头中包含的所有 Objective-C++ classes 都可以直接从 Swift.

获得

我在 github 上有一个演示:

https://github.com/foundry/OpenCVSwiftStitch

它展示了如何使用基于 Swift 的项目中的 OpenCV 拼接器。 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