Подтвердить что ты не робот

Использование OpenCV в Swift iOS

После добавления рамки OpenCV 2 в моем проекте xcode я попытался найти samlpes или учебники для интеграции со скоростью.

Есть ли хорошие учебники для того же?

4b9b3361

Ответ 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

  1. Обновите Bridging-Header, чтобы создать все классы Objective-C ++, которые вы создали для Swift, импортировав недавно созданные обертки (#import "OpenCVWrapper.h")

  2. Используйте свою обертку в ваших файлах Swift:

    let image = UIImage (named: "image.jpeg" ) let processingImage = OpenCVWrapper.processImageWithOpenCV(изображение)

Все классы Objective-C ++, включенные в заголовок моста, доступны непосредственно из Swift.

Ответ 2

У меня есть демо на github:

https://github.com/foundry/OpenCVSwiftStitch

В нем показано, как использовать стикер OpenCV из проекта на основе Swift. Для стороны openCV не так много, это действительно просто демонстрация того, как собрать разные части.

Поскольку Swift не будет напрямую говорить на С++, он использует тонкую оболочку Objective-C ++ для посредничества между стороной iOS и стороной openCV.

Сделано в ответ на эти вопросы:
Можно ли смешивать Swift с С++? Как и файлы Objective - C.mm

для панорамы CAPTURE в iOS 6