2015-06-18 16 views

risposta

62

OpenCV è un framework scritto in C++. Apple reference ci dice che

Non è possibile importare codice C++ direttamente in Swift. Invece, crea un wrapper Objective-C o C per il codice C++.

quindi non è possibile direttamente importare e utilizzare OpenCV in un progetto veloce, ma questo in realtà non è affatto male, perché voi (bisogno) continua a utilizzare la sintassi C++ del quadro che è abbastanza ben documentato in tutta la rete .

Quindi come procedere?

  1. Creare una nuova Objective-C++ di classe (.h, .mm) per la chiamata C++ OpenCV

OpenCVWrapper.h

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

@interface OpenCVWrapper : NSObject 

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

@end 

OpenCVWrapper.mm (utilizzare il File -> Nuovo ... Wizard per Objective-C e rinominare il file .m in .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 

In alternativa alla creazione di nuove classi come l'esempio OpenCVWrapper.h/mm, è possibile utilizzare le categorie Objective-C per estendere le classi Objective-C esistenti con la funzionalità OpenCV. Per esempio categoria 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

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

  1. Aggiornare il Bridging-Header per rendere tutte le classi Objective-C++ create disponibili per Swift importando i nostri involucri appena creati (#import "OpenCVWrapper.h")

  2. Usa il tuo involucro nei file Swift:

    let image = UIImage (denominato: "image.jpeg") lasciare processedImage = OpenCVWrapper.processImageWithOpenCV (immagine)

Tutte le classi Objective-C++ incluse nell'intestazione del bridge sono disponibili direttamente da Swift.

+0

Ciao Sono nuovo di OpenCV. Per favore, dimmi cosa dovrebbe esserci nella categoria UIImage + OpenCV ?? Dovrei scaricarlo da qualche parte? – GMHSJ

+0

@GMHSJ: È l'estensione di UIImage che aiuta a convertire in e da cv :: Mat structure in UIImage.So devi crearlo nel tuo progetto. – Shrawan

+2

#include Dovrebbe essere incluso prima di tutto il resto. In caso contrario, appariranno alcuni conflitti. – Pochi

34

Ho una demo su github:

https://github.com/foundry/OpenCVSwiftStitch

Essa mostra come utilizzare la cucitrice OpenCV da un progetto Swift-based. Non c'è molto per il lato openCV, è davvero solo una dimostrazione di come mettere insieme i vari pezzi.

Poiché Swift non parla direttamente in C++, utilizza un sottile wrapper Objective-C++ per mediare tra il lato iOS e il lato openCV.

Made in risposta a queste domande:
Can I mix Swift with C++? Like the Objective - C .mm files
libraries to CAPTURE panorama in iOS 6

+0

@ Kashif, ho risposto tramite i dettagli del contatto sul tuo sito web. – foundry

+3

Questa demo (OpenCVSwiftStitch) su github è il miglior tutorial e demo pratica che ho trovato finora sull'integrazione di Swift con OpenCV. Risponde alle domande, fornisce istruzioni per l'installazione e mostra cosa mettere nell'implementazione della categoria UIImage + OpenCV. Dopo aver letto questo ho finalmente potuto andare, convertire un'immagine da UIImage in OpenCV Mat, fare un po 'di elaborazione, riconvertire e visualizzare l'immagine – Paulus

+0

@Paulus - grazie per il feedback. Sono contento che tu l'abbia trovato utile. – foundry