Usando OpenCV en Swift iOS
image-processing (2)
OpenCV es un marco escrito en C ++. La reference de Apple nos dice que
No puede importar código C ++ directamente en Swift. En su lugar, cree un contenedor Objective-C o C para el código C ++.
por lo que no puede importar y usar OpenCV directamente en un proyecto rápido, pero en realidad esto no está nada mal porque (necesita) continuar usando la sintaxis C ++ del marco que está bastante bien documentado en toda la red.
Entonces, ¿cómo proceder?
- Cree una nueva clase Objective-C ++ (.h, .mm ) para llamar a C ++ OpenCV
OpenCVWrapper.h
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@interface OpenCVWrapper : NSObject
+ (UIImage *)processImageWithOpenCV:(UIImage*)inputImage;
@end
OpenCVWrapper.mm (use el Asistente Archivo -> Nuevo ... para Objective-C y cambie el nombre del archivo .m a .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
Como alternativa a la creación de nuevas clases, como el ejemplo OpenCVWrapper.h / mm, puede usar las categorías Objective-C para ampliar las clases Objective-C existentes con la funcionalidad OpenCV. Por ejemplo, categoría 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
Ver https://github.com/foundry/OpenCVSwiftStitch/blob/master/SwiftStitch/UIImage%2BOpenCV.mm
-
Actualice Bridging-Header para que todas las clases de Objective-C ++ que haya creado estén disponibles para Swift importando nuestros contenedores recién creados (
#import "OpenCVWrapper.h"
) -
Use su contenedor en sus archivos Swift:
let image = UIImage (llamado: "image.jpeg") let procesada Imagen = OpenCVWrapper.processImageWithOpenCV (imagen)
Todas las clases de Objective-C ++ incluidas en el encabezado del puente están disponibles directamente desde Swift.
Después de agregar el marco OpenCV 2 en mi proyecto xcode, intenté buscar samlpes o tutoriales para la integración con swift.
¿Hay algún buen tutorial para lo mismo?
Tengo una demo en github:
https://github.com/foundry/OpenCVSwiftStitch
Muestra cómo usar el agrupador OpenCV de un proyecto basado en Swift. No hay mucho en el lado de openCV, en realidad es solo una demostración de cómo juntar las diferentes piezas.
Como Swift no hablará C ++ directamente, utiliza un delgado envoltorio Objective-C ++ para mediar entre el lado de iOS y el lado de openCV.
Hecho en respuesta a estas preguntas:
¿Puedo mezclar Swift con C ++?
Como el objetivo: archivos C .mm
bibliotecas para CAPTURAR panorama en iOS 6