-
-
Save SunXiaoShan/6111b8ccee44730e2b558e4d2ccfaa7c to your computer and use it in GitHub Desktop.
FD
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- (void)drawFaces:(NSArray *)features | |
forVideoBox:(CGRect)clearAperture | |
orientation:(UIDeviceOrientation)orientation { | |
NSArray *sublayers = [NSArray arrayWithArray:[self.previewLayer sublayers]]; | |
NSInteger sublayersCount = [sublayers count], currentSublayer = 0; | |
NSInteger featuresCount = [features count], currentFeature = 0; | |
[CATransaction begin]; | |
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; | |
for (CALayer *layer in sublayers) { | |
if ([[layer name] isEqualToString:FACE_LAYER]) { | |
[layer setHidden:YES]; | |
} | |
} | |
if (featuresCount == 0 || [self getBorderImage] == nil) { | |
[CATransaction commit]; | |
if ([_delegate respondsToSelector:@selector(FaceDetectionComponentIsNoDetectedFace:)]) { | |
__weak typeof(self) weakSelf = self; | |
dispatch_async(dispatch_get_main_queue(), ^{ | |
[weakSelf.delegate FaceDetectionComponentIsNoDetectedFace:weakSelf]; | |
}); | |
} | |
return; | |
} | |
CGSize parentFrameSize = [self.previewView frame].size; | |
NSString *gravity = [self.previewLayer videoGravity]; | |
BOOL isMirrored = [self.previewLayer.connection isVideoMirrored]; | |
CGRect previewBox = [FaceDetectionComponent videoPreviewBoxForGravity:gravity | |
frameSize:parentFrameSize | |
apertureSize:clearAperture.size]; | |
for (CIFaceFeature *ff in features) { | |
CGRect faceRect = [ff bounds]; | |
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; | |
CGFloat widthScaleBy = previewBox.size.width / clearAperture.size.height; | |
CGFloat heightScaleBy = previewBox.size.height / clearAperture.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; | |
while (!featureLayer && (currentSublayer < sublayersCount)) { | |
CALayer *currentLayer = [sublayers objectAtIndex:currentSublayer++]; | |
if ([[currentLayer name] isEqualToString:FACE_LAYER]) { | |
featureLayer = currentLayer; | |
[currentLayer setHidden:NO]; | |
} | |
} | |
if (featureLayer == nil) { | |
featureLayer = [[CALayer alloc] init]; | |
featureLayer.contents = (__bridge id)[self getBorderImage].CGImage; | |
[featureLayer setName:FACE_LAYER]; | |
[self.previewLayer addSublayer:featureLayer]; | |
featureLayer = nil; | |
} | |
[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]; | |
if ([_delegate respondsToSelector:@selector(FaceDetectionComponentIsDetectedFace:)]) { | |
__weak typeof(self) weakSelf = self; | |
dispatch_async(dispatch_get_main_queue(), ^{ | |
[weakSelf.delegate FaceDetectionComponentIsDetectedFace:weakSelf]; | |
}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment