【发布时间】:2015-09-03 16:37:12
【问题描述】:
在我的 xcode 项目中添加 OpenCV 2 框架后,我尝试搜索与 swift 集成的示例或教程。
有什么好的教程吗?
【问题讨论】:
标签: ios swift opencv image-processing
在我的 xcode 项目中添加 OpenCV 2 框架后,我尝试搜索与 swift 集成的示例或教程。
有什么好的教程吗?
【问题讨论】:
标签: ios swift opencv image-processing
OpenCV 是一个用 C++ 编写的框架。 Apple 的 reference 告诉我们
您不能将 C++ 代码直接导入 Swift。相反,为 C++ 代码创建一个 Objective-C 或 C 包装器。
因此您不能在 swift 项目中直接导入和使用 OpenCV,但这实际上一点也不差,因为您(需要)继续使用该框架的 C++ 语法,该语法在整个网络上都有很好的记录。
那么你将如何进行?
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
通过导入我们新创建的包装器 (#import "OpenCVWrapper.h"),更新 Bridging-Header 以使您创建的所有 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 拼接器。 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
【讨论】: