Bir görüntüdeki iyi bilinen yer işaretlerini tanımak için ML Kit'i kullanabilirsiniz.
Sen başlamadan önce
- Henüz uygulamanıza Firebase'i eklemediyseniz, başlangıç kılavuzundaki adımları izleyerek bunu yapın.
- ML Kit kitaplıklarını Pod dosyanıza ekleyin:
pod 'Firebase/MLVision', '6.25.0'
Projenizin Pod'larını yükledikten veya güncelledikten sonra, Xcode projenizi.xcworkspace
kullanarak açtığınızdan emin olun. - Uygulamanızda Firebase'i içe aktarın:
Süratli
import Firebase
Amaç-C
@import Firebase;
Projeniz için Bulut tabanlı API'leri henüz etkinleştirmediyseniz, şimdi yapın:
- Firebase konsolunun ML Kit API'leri sayfasını açın.
Projenizi henüz bir Blaze fiyatlandırma planına yükseltmediyseniz, bunu yapmak için Yükselt'e tıklayın. (Yalnızca projeniz Blaze planında değilse yükseltme yapmanız istenir.)
Yalnızca Blaze düzeyindeki projeler Bulut tabanlı API'leri kullanabilir.
- Bulut tabanlı API'ler zaten etkinleştirilmemişse Bulut Tabanlı API'leri Etkinleştir 'i tıklayın.
Yer işareti dedektörünü yapılandırın
Varsayılan olarak, Bulut dedektörü modelin kararlı sürümünü kullanır ve 10 adede kadar sonuç döndürür. Bu ayarlardan herhangi birini değiştirmek isterseniz, bunları aşağıdaki örnekte olduğu gibi bir VisionCloudDetectorOptions
nesnesiyle belirtin:
Süratli
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
Amaç-C
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
Sonraki adımda, Bulut algılayıcı nesnesini oluşturduğunuzda VisionCloudDetectorOptions
nesnesini iletin.
Yer işareti dedektörünü çalıştırın
Bir görüntüdeki yer işaretlerini tanımak için görüntüyüUIImage
veya CMSampleBufferRef
olarak VisionCloudLandmarkDetector
'ın detect(in:)
yöntemine iletin:-
VisionCloudLandmarkDetector
örneğini alın:Süratli
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
Amaç-C
FIRVision *vision = [FIRVision vision]; FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector]; // Or, to change the default settings: // FIRVisionCloudLandmarkDetector *landmarkDetector = // [vision cloudLandmarkDetectorWithOptions:options];
Bir
UIImage
veya birCMSampleBufferRef
kullanarak birVisionImage
nesnesi oluşturun.Bir
UIImage
kullanmak için:- Gerekirse görüntüyü,
imageOrientation
özelliği.up
olacak şekilde döndürün. - Doğru döndürülmüş
UIImage
kullanarak birVisionImage
nesnesi oluşturun. Herhangi bir döndürme meta verisi belirtmeyin; varsayılan değer olan.topLeft
kullanılmalıdır.Süratli
let image = VisionImage(image: uiImage)
Amaç-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
Bir
CMSampleBufferRef
kullanmak için:CMSampleBufferRef
arabelleğinde bulunan görüntü verilerinin yönünü belirten birVisionImageMetadata
nesnesi oluşturun.Görüntü yönünü almak için:
Süratli
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 } }
Amaç-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; } }
Ardından, meta veri nesnesini oluşturun:
Süratli
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Amaç-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];
-
CMSampleBufferRef
nesnesini ve döndürme meta verilerini kullanarak birVisionImage
nesnesi oluşturun:Süratli
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Amaç-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- Gerekirse görüntüyü,
- Ardından, görüntüyü
detect(in:)
yöntemine iletin:Süratli
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
Amaç-C
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
Tanınan yer işaretleri hakkında bilgi alın
Yer işareti tanıma başarılı olursa, tamamlama işleyicisine bir diziVisionCloudLandmark
nesnesi iletilecektir. Her nesneden, görüntüde tanınan bir yer işareti hakkında bilgi alabilirsiniz.Örneğin:
Süratli
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 }
Amaç-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]; }
Sonraki adımlar
- Cloud API kullanan bir uygulamayı üretime dağıtmadan önce , yetkisiz API erişiminin etkisini önlemek ve azaltmak için bazı ek adımlar atmalısınız.