Nota: actualizado para OpenCV 4.1.1, Xcode 11.1, iOS 13.1.2 y macOS Catalina 10.15.

Si quieres poder acceder a OpenCV desde Swift en iOS sólo tienes que seguir los siguientes pasos:

  1. Descarga la última versión de OpenCV para iOS.
  2. Descomprime el archivo ZIP. En su interior habrá una carpeta llamada opencv2.framework 1. Es el framework que necesitarás añadir al proyecto de Xcode.
  3. Abre la carpeta del proyecto en el que quieras añadir OpenCV. Copia la carpeta opencv2.framework junto al resto de archivos del proyecto. Debería estar en la misma carpeta que Info.plist.
  4. Abre el proyecto con Xcode.
  5. Haz clic con el nombre del proyecto, el elemento que aparece arriba del todo en el panel de la izquierda.
  6. Selecciona la ficha Build Phases y despliega la sección Link Binary with Libraries.
  7. Haz clic en el botón + dentro de dicha sección. Se abrirá un cuadro de diálogo que te permitirá seleccionar archivos.
  8. Haz clic en la lista desplegable Add Other…, después en la opción Add Files… y selecciona la carpeta opencv2.framework que se encuentra dentro de la carpeta del proyecto, el que acabas de copiar. Como resultado, opencv2.framework aparecerá en la lista asociada a Link Binary with Libraries y, además, en el panel de la izquierda, dentro de la carpeta Frameworks.

  9. Añade un nuevo archivo de tipo Cocoa Touch Class al proyecto. Llámalo OpenCVWrapper, di que es subclase de NSObject y selecciona Objective-C como lenguaje.
  10. Xcode te preguntará si quieres configurar un bridging header para Objective-C. Haz clic en Create Bridging Header.
  11. OpenCV necesita que trabajes con C++ en lugar de con C, que es la opción predeterminada. Para ello:
    • cambia el nombre del archivo OpenCVWrapper.h por OpenCVWrapper.hpp.
    • cambia el nombre del archivo OpenCVWrapper.m por OpenCVWrapper.mm.
  12. Incluye la siguiente línea en el bridging header que se acaba de crear:

    #import "OpenCVWrapper.hpp"
    
  13. Vamos a crear una función que devuelva el número de versión de OpenCV, la operación más sencilla que podemos llevar a cabo para comprobar que disponemos de OpenCV en nuestra aplicación. Para ello, añade la siguiente declaración al archivo OpenCVWrapper.hpp:

    + (NSString *)getOpenCVVersion;
    

    Su contenido completo debería ser algo así:

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface OpenCVWrapper : NSObject
    
    + (NSString *)getOpenCVVersion;
    
    @end
    
    NS_ASSUME_NONNULL_END
    
  14. Crea el método getOpenCVVersion que acabas de declarar. Para ello, añade el siguiente código al archivo OpenCVWrapper.mm:

    + (NSString *)getOpenCVVersion {
        return [NSString stringWithFormat:@"OpenCV Version %s", CV_VERSION];
    }
    

    Su contenido completo debería ser algo así:

    #import <opencv2/opencv.hpp>
    #import "OpenCVWrapper.hpp"
    
    @implementation OpenCVWrapper
    
    + (NSString *)getOpenCVVersion {
        return [NSString stringWithFormat:@"OpenCV Version %s", CV_VERSION];
    }
    
    @end
    
  15. Añade la siguiente línea al método viewDidload dentro del archivo ViewController:

    print("\(OpenCVWrapper.getOpenCVVersion())")
    

    Su contenido completo debería ser algo así:

    import UIKit
    
    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            print("\(OpenCVWrapper.getOpenCVVersion())")
        }
    }
    
  16. Ejecuta la aplicación. En el área de depuración deberías ver algo como esto:

Bola extra

Si quieres evitar los múltiples mensajes de advertencia que Xcode te mostrará relacionados con la documentación interna de OpenCV cambia la línea

#import <opencv2/opencv.hpp>

por las líneas

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdocumentation"
#import <opencv2/opencv.hpp>
#pragma clang pop

en el archivo OpenCVWrapper.mm.

Fuentes

  1. Si la memoria no me falla, antes el contenido de este archivo ZIP aparecía en Finder como un archivo, pero si estás en macOS Catalina aparece como una carpeta. La diferencia podría también venir de la manera en la que el ZIP se ha preparado, no estoy seguro.