2010-10-01 85 views
1

我使用AVCaptureSession從我的iPhone 3G上捕捉視頻,我需要捕捉圖像並在顯示在我的AVCaptureVideoPreviewLayer上之前更改它。在我目前的實施中,我只是實施captureOutput:方法並在UIImageView中顯示UIImage,但由於某種原因,這不起作用。在AVCaptureVideoPreviewLayer上顯示之前需要修改圖像

任何想法?不知怎的,子類AVCaptureSession

謝謝!

回答

2

看看這個https://developer.apple.com/library/ios/#samplecode/SquareCam/Introduction/Intro.html 我認爲這樣做。 它將臉部框放到臉上。

- (void)drawFaceBoxesForFeatures:(NSArray *)features forVideoBox:(CGRect)clap orientation:(UIDeviceOrientation)orientation// videoMirrored:(const BOOL)ISVIDEOMIRRORED 
{ 
    NSArray *sublayers = [NSArray arrayWithArray:[previewLayer sublayers]]; 
    NSInteger sublayersCount = [sublayers count], currentSublayer = 0; 
    NSInteger featuresCount = [features count], currentFeature = 0; 

    [CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 

    // hide all the face layers 
    for (CALayer *layer in sublayers) { 
     if ([[layer name] isEqualToString:@"FaceLayer"]) 
      [layer setHidden:YES]; 
    } 

    if (featuresCount == 0 || !detectFaces) { 
     [CATransaction commit]; 
     return; // early bail. 
    } 

    CGSize parentFrameSize = [previewView frame].size; 
    NSString *gravity = [previewLayer videoGravity]; 
    //BOOL isMirrored = isVideoMirrored; 
#warning Deprecated 
    const BOOL isMirrored = [previewLayer isMirrored]; // deprecated 
    CGRect previewBox = [SquareCamViewController videoPreviewBoxForGravity:gravity 
                   frameSize:parentFrameSize 
                  apertureSize:clap.size]; 

    for (CIFaceFeature *ff in features) { 
     // find the correct position for the square layer within the previewLayer 
     // the feature box originates in the bottom left of the video frame. 
     // (Bottom right if mirroring is turned on) 
     CGRect faceRect = [ff bounds]; 

     // flip preview width and height 
     CGFloat temp = faceRect.size.width; 
     faceRect.size.width = faceRect.size.height; 
     faceRect.size.height = temp; 
     temp = faceRect.origin.x; 
     faceRect.origin.x = faceRect.origin.y; 
     faceRect.origin.y = temp; 
     // scale coordinates so they fit in the preview box, which may be scaled 
     CGFloat widthScaleBy = previewBox.size.width/clap.size.height; 
     CGFloat heightScaleBy = previewBox.size.height/clap.size.width; 
     faceRect.size.width *= widthScaleBy; 
     faceRect.size.height *= heightScaleBy; 
     faceRect.origin.x *= widthScaleBy; 
     faceRect.origin.y *= heightScaleBy; 

     if (isMirrored) 
      faceRect = CGRectOffset(faceRect, previewBox.origin.x + previewBox.size.width - faceRect.size.width - (faceRect.origin.x * 2), previewBox.origin.y); 
     else 
      faceRect = CGRectOffset(faceRect, previewBox.origin.x, previewBox.origin.y); 

     CALayer *featureLayer = nil; 

     // re-use an existing layer if possible 
     while (!featureLayer && (currentSublayer < sublayersCount)) { 
      CALayer *currentLayer = [sublayers objectAtIndex:currentSublayer++]; 
      if ([[currentLayer name] isEqualToString:@"FaceLayer"]) { 
       featureLayer = currentLayer; 
       [currentLayer setHidden:NO]; 
      } 
     } 

     // create a new one if necessary 
     if (!featureLayer) { 
      featureLayer = [CALayer new]; 
      [featureLayer setContents:(id)[square CGImage]]; 
      [featureLayer setName:@"FaceLayer"]; 
      [previewLayer addSublayer:featureLayer]; 
      [featureLayer release]; 
     } 
     [featureLayer setFrame:faceRect]; 

     switch (orientation) { 
      case UIDeviceOrientationPortrait: 
       [featureLayer setAffineTransform:CGAffineTransformMakeRotation(DegreesToRadians(0.))]; 
       break; 
      case UIDeviceOrientationPortraitUpsideDown: 
       [featureLayer setAffineTransform:CGAffineTransformMakeRotation(DegreesToRadians(180.))]; 
       break; 
      case UIDeviceOrientationLandscapeLeft: 
       [featureLayer setAffineTransform:CGAffineTransformMakeRotation(DegreesToRadians(90.))]; 
       break; 
      case UIDeviceOrientationLandscapeRight: 
       [featureLayer setAffineTransform:CGAffineTransformMakeRotation(DegreesToRadians(-90.))]; 
       break; 
      case UIDeviceOrientationFaceUp: 
      case UIDeviceOrientationFaceDown: 
      default: 
       break; // leave the layer in its last known orientation 
     } 
     currentFeature++; 
    } 

    [CATransaction commit]; 
} 
相關問題