iOS 人脸识别功能

该博客介绍了如何在iOS应用中利用CoreImage框架实现人脸识别功能,通过CIDetector检测人脸并获取五官位置。对于检测到的人脸,代码示例展示了如何根据五官位置判断头部朝向并进行相应的图像旋转,以及如何处理多张人脸的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用 coreimage 可以实现人脸识别功能,并且获取到人脸面部五官的位置。

CIContext *context = [[CIContext alloc]init];

    CIImage *ciImage = [CIImage imageWithCGImage:_faceImg.CGImage];

    NSDictionary *dic = [NSDictionary dictionaryWithObject:CIDetectorAccuracy forKey:CIDetectorAccuracyHigh];

    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:dic];

    NSArray *array = [detector featuresInImage:ciImage];

    

    //  照片中只有一个人脸的人脸识别

    if (array.count ==1) {

        

        for (CIFaceFeature *feature in array) {

            NSInteger leftEye_X = feature.leftEyePosition.x;

            NSInteger leftEye_Y = feature.leftEyePosition.y;

            NSInteger rightEye_X = feature.rightEyePosition.x;

            NSInteger rightEye_Y = feature.rightEyePosition.y;

            //   NSInteger mouth_X = feature.mouthPosition.x;

            NSInteger mouth_Y = feature.mouthPosition.y;

            

            //  头为正 左眼高 右眼底  需逆时针旋转

            if (leftEye_Y > rightEye_Y && leftEye_Y > mouth_Y && leftEye_X < rightEye_X)

            {

                CGFloat height = leftEye_Y - rightEye_Y;

                CGFloat width = rightEye_X - leftEye_X;

                CGFloat rad = atan(height/width);

                self.transform = CGAffineTransformMakeRotation(-rad);

            }else if (leftEye_Y < rightEye_Y && rightEye_Y > mouth_Y && leftEye_X < rightEye_X)

            {

                CGFloat height = rightEye_Y - leftEye_Y;

                CGFloat width = rightEye_X - leftEye_X;

                CGFloat rad = atan(height/width);

                self.transform = CGAffineTransformMakeRotation(rad);

            }else if (leftEye_X >= rightEye_X && leftEye_Y >= rightEye_Y && mouth_Y > leftEye_Y) {

                CGFloat height = leftEye_Y - rightEye_Y;

                CGFloat width = leftEye_X - rightEye_X;

                CGFloat rad = atan(height/width);

                self.transform = CGAffineTransformMakeRotation(-(M_PI-rad));

            }else if (leftEye_X >= rightEye_X && rightEye_Y >= leftEye_Y && mouth_Y > leftEye_Y) {

                CGFloat height = rightEye_Y - leftEye_Y;

                CGFloat width = leftEye_X - rightEye_X;

                CGFloat rad = atan(height/width);

                self.transform = CGAffineTransformMakeRotation((M_PI - rad));

            }else{

                self.transform = CGAffineTransformMakeRotation(0);

            }

    }

        

        //  照片中有多个人脸的人脸识别 给每个人脸打上马赛克

    }else if (array.count > 1){

        

        CGSize inputImageSize = ciImage.extent.size;

        CGAffineTransform transform = CGAffineTransformIdentity;

        transform = CGAffineTransformScale(transform, 1, -1);

        transform = CGAffineTransformTranslate(transform, 0, -inputImageSize.height);

        



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值