Ответ 1
OpenCV - это структура, написанная на С++. Apple ссылка сообщите нам, что
Вы не можете импортировать код С++ непосредственно в Swift. Вместо этого создайте оболочку Objective-C или C для кода С++.
так что вы не можете напрямую импортировать и использовать OpenCV в быстром проекте, но на самом деле это совсем не плохо, потому что вы (необходимость) продолжаете использовать синтаксис С++ для фреймворка, который довольно хорошо документирован по всей сети.
Итак, как вы продолжаете?
- Создайте новый класс Objective-C ++ (.h, .mm) для вызова С++ OpenCV
OpenCVWrapper.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface OpenCVWrapper : NSObject
+ (UIImage *)processImageWithOpenCV:(UIImage*)inputImage;
@end
OpenCVWrapper.mm(используйте File → New... Wizard для 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 для расширения существующих классов Objective-C с помощью функций 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
-
Обновите Bridging-Header, чтобы создать все классы Objective-C ++, которые вы создали для Swift, импортировав недавно созданные обертки (
#import "OpenCVWrapper.h"
) -
Используйте свою обертку в ваших файлах Swift:
let image = UIImage (named: "image.jpeg" ) let processingImage = OpenCVWrapper.processImageWithOpenCV(изображение)
Все классы Objective-C ++, включенные в заголовок моста, доступны непосредственно из Swift.