2016-10-18 8 views
1

Я пытаюсь захватить область лица.Захват изображения AVMetadataFaceObject с didOutputSampleBuffer:

Вот что я делаю, в didOutputMetadataObjects: это получить AVMetadataFaceObject и обработать его в didOutputSampleBuffer

didOutputMetadataObjects показывает маркер правильно, где я считаю рыскания, крен оси

Что может быть наилучшим возможным способом, когда я получаю только площадь лица и в то же время вижу маркер лица?

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection 
{ 

    for(AVMetadataObject *metaObject in metadataObjects){ 
     if([metaObject isKindOfClass:[AVMetadataFaceObject class ]] && metaObject.type == AVMetadataObjectTypeFace){ 
      AVMetadataFaceObject * adjustedMeta = (AVMetadataFaceObject*)[self.videoLayer transformedMetadataObjectForMetadataObject:metaObject]; 
      self.metaFaceObject= adjustedMeta; 
      //Draw the face marker here 
      } 
    } 
} 

AVCaptureVideoDataOutputSampleBufferDelegate

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{ 

CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
     if(pixelBuffer){ 
      CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate); 
      CIImage *ciImage = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer options:(__bridge NSDictionary<NSString *,id> * _Nullable)(attachments)]; 
      ciImage = [ciImage imageByCroppingToRect:self.metaFaceObject.bounds]; 
      //This Image is upside down. Second thing the it does not have the face. 
      UIImage *image=[UIImage imageWithCIImage:ciImage]; 


} 
} 

ответ

0

Привет некоторое предлагает ниже:

1: добавить stillImageOutPut

lazy var stillImageOutPut: AVCaptureStillImageOutput = { 
    let imageOutPut = AVCaptureStillImageOutput.init() 
    return imageOutPut 
}() 

добавить к сессии

if session.canAddOutput(stillImageOutPut){ 
      session.addOutput(stillImageOutPut) 
} 

затем реализовать этот делегат функции

// MARK: AVCaptureMetadataOutputObjectsDelegate 

extension ZHFaceDetectorViewController: AVCaptureMetadataOutputObjectsDelegate { 
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { 
    printLog(Thread.current) 
    let metadataObject = metadataObjects.first 
    if let object = metadataObject { 
     while !hasDetectorFace { 
      if object.type == AVMetadataObject.ObjectType.face{ 
       hasDetectorFace = true 
       DispatchQueue.global().async { 
        if let stillImageConnection = self.stillImageOutPut.connection(with: AVMediaType.video){ 
         printLog(stillImageConnection) 
         printLog(connection) 
         stillImageConnection.videoOrientation = AVCaptureVideoOrientation(rawValue: UIDevice.current.orientation.rawValue)! 
         /// prepare settings 如果不设置 截取照片时屏幕会闪白 
         let settings = AVCaptureAutoExposureBracketedStillImageSettings.autoExposureSettings(exposureTargetBias: AVCaptureDevice.currentExposureTargetBias) 
         /// begin capture 
         self.stillImageOutPut.prepareToCaptureStillImageBracket(from: stillImageConnection, withSettingsArray: [settings], completionHandler: { (complete, error) in 
          if error == nil { 
           self.stillImageOutPut.captureStillImageAsynchronously(from: stillImageConnection, completionHandler: { (imageDataSampleBuffer, error) in 
            printLog(imageDataSampleBuffer) 
            printLog(error) 
            if error == nil { 
             if let sampleBuffer = imageDataSampleBuffer { 
              if let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer){ 
               if let image = UIImage(data: imageData) { 
                /// operater your image 
                printLog(image) 
               } 
              } 
             } 
            }else{ 
             printLog("something was wrong") 
            } 
           }) 
          } 
         }) 

        } 
       } 
      } 
     } 
    } 
} 

}

4 затем я получаю мое изображение log info

 Смежные вопросы

  • Нет связанных вопросов^_^