在Swift iOS中使用OpenCV

Kau*_*lia 50 opencv image-processing ios swift

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

有没有相同的好教程?

Tom*_*min 64

OpenCV是一个用C++编写的框架.Apple的参考资料告诉我们

您无法直接将C++代码导入Swift.相反,为C++代码创建一个Objective-C或C包装器.

所以你不能在swift项目中直接导入和使用OpenCV,但这实际上并不坏,因为你(需要)继续使用框架的C++语法,这在整个网络上都有很好的文档记录.

那你怎么办?

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

OpenCVWrapper.h

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

@interface OpenCVWrapper : NSObject

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

@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

作为创建新类(如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
Run Code Online (Sandbox Code Playgroud)

的UIImage + OpenCV.mm

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

  1. 更新桥接报头,使您通过导入新创建的包装创建提供给斯威夫特所有的Objective-C++类(#import "OpenCVWrapper.h")

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

    let image = UIImage(命名为:"image.jpeg")let processedImage = OpenCVWrapper.processImageWithOpenCV(image)

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

  • #include <opencv2/opencv.hpp>应该包括在其他所有内容之前.如果不是,则会出现一些冲突. (2认同)

fou*_*dry 35

我在github上有一个demo:

https://github.com/foundry/OpenCVSwiftStitch

它展示了如何使用基于Swift的项目中的OpenCV缝合器.openCV方面没有太多,它只是一个如何将各个部分组合在一起的演示.

由于Swift不会直接谈论C++,它使用瘦的Objective-C++包装器来调解iOS端和openCV端.

回答这些问题:
我可以将Swift与C++混合使用吗?就像Objective-C .mm文件
库到iOS 6中的CAPTURE全景图一样

  • 这个关于github的演示(OpenCVSwiftStitch)是迄今为止我在Swift与OpenCV集成方面发现的最好的教程和实用演示.它回答问题,给出安装说明并显示要放入UIImage + OpenCV类别实现的内容.读完之后我终于可以开始了,将图像从UIImage格式转换为OpenCV Mat,做一些处理,转换回来并显示图像 (3认同)
  • @Tom - 查看回购的最新更新.Swift 3.0由于更严格的类型强制要求而破裂 - 修复. (2认同)