iOS视频捕获进阶篇

1. 前言

前面【iOS视频捕获实践篇】制作了一个简单拍照和视频录制的相机,事实上,大多数app都有扫码的功能,因此仅仅一个相机是不够的。本篇文章来对前面的相机做一个升级,对拍照界面增人脸检测与追踪的功能。

2. MetadataOutput

AVCaptureOutput有一个子类 AVCaptureMetadataOutput,它用来输出元数据。元数据简单来说就是现实一个具体的物体,比如人脸、条码、动物等,所有元数据对象都有时间、持续时间、界限和类型。下面是一个元数据的抽象类,我们需要使用其子类。

@interface AVMetadataObject : NSObject {
@property(readonly) CMTime time;
@property(readonly) CMTime duration;
@property(readonly) CGRect bounds;
@property(readonly) AVMetadataObjectType type;
@end

在使用上和AVCaptureVideoDataOutput是类似的。设置一个代理和一个派发队列。

- (void)setMetadataObjectsDelegate:(nullable id<AVCaptureMetadataOutputObjectsDelegate>)objectsDelegate queue:(nullable dispatch_queue_t)objectsCallbackQueue;

在设置完代理后,我们需要实现下面这个方法:

- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection;
// 每次回调,metadataObjects 总是返回同一类元数据,比如是AVMetadataFaceObject就不会是AVMetadataMachineReadableCodeObject
// 因此处理时需要注意

3. 人脸追踪

航向偏角(Pitch)是沿着X轴旋转;

偏航(yaw)是沿着Y轴旋转;

侧滚(roll)是沿着Z轴旋转。

对应于人头来说,pitch就是点头,yaw摇头,roll就是左右肩膀摆头。下面是笛卡尔积坐标系。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PHZWfKIO-1663297785545)(./tc_avf_pyr.png)]

@interface AVMetadataFaceObject : AVMetadataObject <NSCopying> {
@property(readonly) NSInteger faceID;
// 左右摆头
@property(readonly) BOOL hasRollAngle;
@property(readonly) CGFloat rollAngle;
// 左右摇头
@property(readonly) BOOL hasYawAngle;
@property(readonly) CGFloat yawAngle;
@end

我们实现如下代理方法:

- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
  @autoreleasepool {
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSMutableArray *aArray = [NSMutableArray arrayWithArray:self.faceLayerMaps.allValues];
            [metadataObjects enumerateObjectsUsingBlock:^(__kindof AVMetadataObject * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                AVMetadataFaceObject *faceObject = (AVMetadataFaceObject *)[self.cameraCore.videoPreviewLayer transformedMetadataObjectForMetadataObject:obj];
                NSString *identifier = [NSString stringWithFormat:@"%zd", faceObject.faceID];
                CAShapeLayer *layer = [self.codeLayerMaps objectForKey:identifier];
                
                if (identifier && !layer) {
                    layer = [CAShapeLayer layer];
                    [self.faceLayerMaps setObject:layer forKey:identifier];
                }
                if (layer && !layer.superlayer) {
                    layer.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.3].CGColor;
                    [self.view.layer addSublayer:layer];
                }
                [aArray removeObject:layer];
                layer.path = [UIBezierPath bezierPathWithRect:faceObject.bounds].CGPath;
            }];
            for (CAShapeLayer *layer in aArray) {
                [layer removeFromSuperlayer];
            }
            [aArray removeAllObjects];
            [self.view setNeedsDisplay];
        });
    };
}

4. 总结

【iOS视频捕获】到这里就结束了,由于时间关系,在细节上面没有打磨。

对于barcode识别,CIImage的detector、VisionFramework等的使用,大家可以自行搜索使用。

瑞思拜~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值