Procesamiento de video con OpenCV en el proyecto IOS Swift

He integrado opencv en el proyecto Swift IOS usando un encabezado de puente (para conectar Swift a Objective C) y un contenedor Objective C (para conectar Objective C a C ++). Con este método, puedo pasar imágenes individuales del código Swift, analizarlas en los files C ++ y recuperarlas.

He visto que opencv proporciona el object CvVideoCamera que se puede integrar con un Objective C UIViewController.

Pero como mi UIViewController está escrito en Swift, ¿me pregunto si esto también es posible?

Esta es una actualización de mi respuesta inicial después de que tuve la oportunidad de jugar con esto yo mismo. Sí, es posible usar CvVideoCamera con un controller de vista escrito en Swift. Si solo quieres usarlo para mostrar video desde la camera en tu aplicación, es realmente fácil.

#import <opencv2/highgui/cap_ios.h> través del encabezado de puenteo. Luego, en su controller de vista:

 class ViewController: UIViewController, CvVideoCameraDelegate { ... var myCamera : CvVideoCamera! override func viewDidLoad() { ... myCamera = CvVideoCamera(parentView: imageView) myCamera.delegate = self ... } } 

El ViewController no puede conformarse con el protocolo CvVideoCameraDelegate , pero CvVideoCamera no funcionará sin un delegado, por lo que trabajamos en torno a este problema al declarar ViewController para que adopte el protocolo sin implementar ninguno de sus methods. Esto activará una advertencia del comstackdor, pero la transmisión de video de la camera se mostrará en la vista de la image.

Por supuesto, es posible que desee implementar el CvVideoCameraDelegate () de processImage() para procesar los frameworks de video antes de mostrarlos. La razón por la que no puede implementarlo en Swift es porque utiliza un tipo de C ++, Mat .

Por lo tanto, tendrá que escribir una class Objective-C ++ cuya instancia se puede configurar como delegado de la camera. El método processImage() en esa class de Objective-C ++ será llamado por CvVideoCamera y, a su vez, llamará a código en su class Swift. Aquí hay algunos ejemplos de fragments de código. En OpenCVWrapper.h :

 // Need this ifdef, so the C++ header won't confuse Swift #ifdef __cplusplus #import <opencv2/opencv.hpp> #endif // This is a forward declaration; we cannot include *-Swift.h in a header. @class ViewController; @interface CvVideoCameraWrapper : NSObject ... -(id)initWithController:(ViewController*)c andImageView:(UIImageView*)iv; ... @end 

En la implementación del contenedor, OpenCVWrapper.mm (es una class Objective-C ++, de ahí la extensión .mm):

 #import <opencv2/highgui/cap_ios.h> using namespace cv; // Class extension to adopt the delegate protocol @interface CvVideoCameraWrapper () <CvVideoCameraDelegate> { } @end @implementation CvVideoCameraWrapper { ViewController * viewController; UIImageView * imageView; CvVideoCamera * videoCamera; } -(id)initWithController:(ViewController*)c andImageView:(UIImageView*)iv { viewController = c; imageView = iv; videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView]; // ... set up the camera ... videoCamera.delegate = self; return self; } // This #ifdef ... #endif is not needed except in special situations #ifdef __cplusplus - (void)processImage:(Mat&)image { // Do some OpenCV stuff with the image ... } #endif ... @end 

Luego pones #import "OpenCVWrapper.h" en el encabezado de puenteo, y el controller de vista Swift puede verse así:

 class ViewController: UIViewController { ... var videoCameraWrapper : CvVideoCameraWrapper! override func viewDidLoad() { ... self.videoCameraWrapper = CvVideoCameraWrapper(controller:self, andImageView:imageView) ... } 

Consulte https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html sobre las declaraciones de avance y la interferencia Swift / C ++ / Objective-C. Hay mucha información en la web sobre #ifdef __cplusplus y extern "C" (si la necesitas).

En el método de delegación processImage() probablemente necesitará interactuar con alguna API OpenCV, para lo que también tendrá que escribir contenedores. Puede encontrar información sobre eso en otro lugar, por ejemplo aquí: usando OpenCV en Swift iOS