web-dev-qa-db-fra.com

Utiliser OpenCV dans Swift iOS

Après avoir ajouté le framework OpenCV2 à mon projet xcode, j'ai essayé de rechercher des exemples et des tutoriels pour l'intégration à Swift.

Existe-t-il de bons tutoriels pour la même chose?

50
Kaushil Ruparelia

OpenCV est un framework écrit en C++. Apple référence nous dit que

Vous ne pouvez pas importer du code C++ directement dans Swift. Au lieu de cela, créez un wrapper Objective-C ou C pour le code C++.

vous ne pouvez donc pas importer et utiliser directement OpenCV dans un projet Swift, mais ce n’est pas grave du tout parce que vous continuez à utiliser la syntaxe C++ du framework, qui est assez bien documentée tous sur le net.

Alors, comment procédez-vous?

  1. Créez une nouvelle classe Objective-C++ (.h, . Mm ) pour appeler C++ OpenCV

OpenCVWrapper.h

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

@interface OpenCVWrapper : NSObject

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

@end

OpenCVWrapper.mm (utilisez Fichier -> Nouveau ... Wizard pour Objective-C et renommez le fichier .m en .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

Au lieu de créer de nouvelles classes telles que l'exemple OpenCVWrapper.h/mm, vous pouvez utiliser les catégories Objective-C pour étendre les classes Objective-C existantes avec la fonctionnalité OpenCV. Par exemple, la catégorie 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

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

  1. Mettez à jour le Bridging-Header pour rendre toutes les classes Objective-C++ que vous avez créées disponibles Swift en important nos wrappers nouvellement créés (#import "OpenCVWrapper.h")

  2. Utilisez votre wrapper dans vos fichiers Swift:

    let image = UIImage (nommé: "image.jpeg") let traitementImage = OpenCVWrapper.processImageWithOpenCV (image)

Toutes les classes Objective-C++ incluses dans l'en-tête de pont sont disponibles directement auprès de Swift.

64
Tomas Camin

J'ai une démo sur github:

https://github.com/foundry/OpenCVSwiftStitch

Il montre comment utiliser le programme stitcher OpenCV à partir d'un projet basé sur Swift. Il n’ya pas grand-chose du côté openCV, c’est vraiment une démonstration de la façon de rassembler les différentes pièces.

En tant que Swift ne parlera pas directement le C++, il utilise un léger wrapper Objective-C++ pour faire la médiation entre le côté iOS et le côté openCV.

Fabriqué en réponse à ces questions:
Puis-je mélanger Swift avec C++? Comme les fichiers Objective - C .mm
bibliothèques du panorama CAPTURE dans iOS 6

35
foundry