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?
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?
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
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"
)
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.
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