Puedes usar el Kit de AA para reconocer puntos de referencia conocidos en una imagen.
Antes de comenzar
- Si aún no agregaste Firebase a tu app, sigue los pasos en la guía de introducción para hacerlo.
- Incluye las bibliotecas del ML Kit en tu Podfile:
pod 'Firebase/MLVision', '6.25.0'
Después de instalar o actualizar los Pods de tu proyecto, asegúrate de abrir el proyecto de Xcode con su.xcworkspace
. - En tu app, importa Firebase:
Swift
import Firebase
Objective-C
@import Firebase;
-
Si aún no habilitaste las API basadas en la nube en tu proyecto, hazlo de la siguiente manera:
- Abre la página de API del Kit de AA de Firebase console.
-
Si todavía no has actualizado tu proyecto al plan de precios Blaze, haz clic en Actualizar para hacerlo (se te pedirá que realices la actualización únicamente si tu proyecto no está en el plan Blaze).
Solo los proyectos con un plan Blaze pueden usar las API de Cloud.
- Si las API de Cloud no están habilitadas, haz clic en Habilitar las API de Cloud.
Configura el detector de puntos de referencia
Según la configuración predeterminada, el detector de Cloud usa la versión estable del modelo y muestra hasta 10 resultados. Si quieres cambiar alguna de estas opciones de configuración, especifícala con un objeto VisionCloudDetectorOptions
como se muestra en el siguiente ejemplo:
Swift
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
Objective-C
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
En el siguiente ejemplo, pasa el objeto VisionCloudDetectorOptions
cuando crees el objeto del detector de Cloud.
Ejecuta el detector de puntos de referencia
Para reconocer puntos de referencia en una imagen, pásala como unaUIImage
o una CMSampleBufferRef
al método detect(in:)
de VisionCloudLandmarkDetector
:
- Obtén una instancia de
VisionCloudLandmarkDetector
:Swift
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
Objective-C
FIRVision *vision = [FIRVision vision]; FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector]; // Or, to change the default settings: // FIRVisionCloudLandmarkDetector *landmarkDetector = // [vision cloudLandmarkDetectorWithOptions:options];
-
Crea un objeto
VisionImage
mediante unaUIImage
oCMSampleBufferRef
.Para usar una
UIImage
, debes hacer lo siguiente:- Si es necesario, rota la imagen para que la propiedad
imageOrientation
sea.up
. - Crea un objeto
VisionImage
mediante unaUIImage
que se haya rotado adecuadamente. No especifiques los metadatos de rotación. Se debe usar el valor predeterminado.topLeft
.Swift
let image = VisionImage(image: uiImage)
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
Para usar una
CMSampleBufferRef
, debes hacer lo siguiente:-
Crea un objeto
VisionImageMetadata
que especifique la orientación de los datos de la imagen contenidos en el búferCMSampleBufferRef
.Para obtener la orientación de la imagen, haz lo siguiente:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objective-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
Luego crea el objeto de metadatos de esta manera:
Swift
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objective-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
- Crea un objeto
VisionImage
a través del objetoCMSampleBufferRef
y los metadatos de rotación:Swift
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objective-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- Si es necesario, rota la imagen para que la propiedad
-
Por último, pasa la imagen al método
detect(in:)
:Swift
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
Objective-C
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
Obtén información sobre los puntos de referencia reconocidos
Si el reconocimiento de puntos de referencia se ejecuta correctamente, se pasará un array de objetosVisionCloudLandmark
al controlador de finalización. Podrás obtener información sobre un punto de referencia reconocido en la imagen en cada objeto.
Por ejemplo:
Swift
for landmark in landmarks { let landmarkDesc = landmark.landmark let boundingPoly = landmark.frame let entityId = landmark.entityId // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for location in landmark.locations { let latitude = location.latitude let longitude = location.longitude } let confidence = landmark.confidence }
Objective-C
for (FIRVisionCloudLandmark *landmark in landmarks) { NSString *landmarkDesc = landmark.landmark; CGRect frame = landmark.frame; NSString *entityId = landmark.entityId; // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for (FIRVisionLatitudeLongitude *location in landmark.locations) { double latitude = [location.latitude doubleValue]; double longitude = [location.longitude doubleValue]; } float confidence = [landmark.confidence floatValue]; }
Próximos pasos
- Antes de implementar en producción una app que usa una API de Cloud, debes realizar algunos pasos adicionales para prevenir y mitigar el efecto del acceso no autorizado a la API.