在Swift iOS中使用OpenCV
image-processing
ios
opencv
21
0

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

有没有很好的教程呢?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

我在github上有一个演示:

https://github.com/foundry/OpenCVSwiftStitch

它显示了如何在基于Swift的项目中使用OpenCV缝合器。 openCV方面并没有很多,实际上只是关于如何将各个部分组合在一起的演示。

由于Swift不会直接谈论C ++,因此它使用薄型的Objective-C ++包装器在iOS端和openCV端之间进行调解。

回答以下问题:
我可以将Swift与C ++混合使用吗?类似于Objective-C .mm文件
库到iOS 6中的CAPTURE Panorama

收藏
评论

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

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

因此,您不能直接在一个快速的项目中导入和使用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

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

作为创建新类(例如示例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

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

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

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

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号