Saltar al contenido

Usando OpenCV en Swift iOS

Solución:

OpenCV es un marco escrito en C ++. La referencia de Apple nos dice que

No puede importar código C ++ directamente a 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 esto en realidad 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?

  1. 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 (utilice Archivo -> Nuevo … Asistente 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 utilizar 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

  1. Actualice Bridging-Header para que todas las clases de Objective-C ++ que creó estén disponibles para Swift importando nuestros contenedores recién creados (#import "OpenCVWrapper.h")

  2. Use su contenedor en sus archivos Swift:

    let image = UIImage(named: "image.jpeg")
    let processedImage = OpenCVWrapper.processImageWithOpenCV(image)
    

Todas las clases de Objective-C ++ incluidas en el encabezado del puente están disponibles directamente en Swift.

Tengo una demostración en github:

https://github.com/foundry/OpenCVSwiftStitch

Muestra cómo usar el ensamblador 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 unir las distintas piezas.

Como Swift no habla directamente sobre C ++, utiliza una envoltura delgada de 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 los archivos Objective – C .mm
bibliotecas para CAPTURAR panorama en iOS 6

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *