Skip to content

Instantly share code, notes, and snippets.

@SunXiaoShan
Created March 22, 2018 03:16
Show Gist options
  • Save SunXiaoShan/6111b8ccee44730e2b558e4d2ccfaa7c to your computer and use it in GitHub Desktop.
Save SunXiaoShan/6111b8ccee44730e2b558e4d2ccfaa7c to your computer and use it in GitHub Desktop.
FD
- (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