Swift - 人脸检测,以及人脸打码

Swift - 人脸检测,以及人脸打码,第1张

概述1,人脸检测的实现 (1)人脸检测是指在图像中寻找符合人脸特征的区域,找到后会返回该特征的信息(比如人脸的范围、眼睛和嘴巴的位置等)。不是指人脸识别,识别出是谁的脸。 (2) Core Image框架中的的 CIDetector对象提供了对图像检测的功能。创建 CIDetector对象时使用 CIDetectorTypeFace表示检测人脸。 (3)下面通过样例演示如何进行人脸检测,同时检测完成后 1,人脸检测的实现
(1)人脸检测是指在图像中寻找符合人脸特征的区域,找到后会返回该特征的信息(比如人脸的范围、眼睛和嘴巴的位置等)。不是指人脸识别,识别出是谁的脸。 (2) Core Image框架中的的 CIDetector对象提供了对图像检测的功能。创建 CIDetector对象时使用 CIDetectorTypeFace表示检测人脸。 (3)下面通过样例演示如何进行人脸检测,同时检测完成后会用方框把人脸给标注出来。 (注意:由于方框是一个个UIVIEw添加到imageVIEw中,而人脸检测出来的位置是相对于原图的。所以方框放置的位置要考虑图片在imageVIEw里的缩放大小,x轴,y轴的偏移量)
2,给人脸打上马赛克的功能实现 (1)使用用 CIPixellate滤镜对原图先做个完全马赛克 (2)检测人脸,以人脸为中心,脸的宽度或高度为半径。做一个包含一个一个圆形区域的蒙板。
(3) CIBlenDWithMask滤镜把马赛克图、原图、蒙版图混合起来,输出即可。

3,效果图如下

4,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 @H_404_297@ 125 126 @H_949_301@ 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 import UIKit ImageIO class VIEwController : UIVIEwController { @IBOutlet weak var imageVIEw: UIImageVIEw ! //原图 lazy originalimage: UIImage = { return (named: "d1.jpg" ) }()! context: CIContext = { return CIContext (options: nil ) }() overrIDe func vIEwDIDLoad() { super .vIEwDIDLoad() } //恢复原图 @IBAction resetimg(sender: AnyObject ) { imageVIEw.image = originalimage } //检测人脸并框出 detectFace(sender: AnyObject ) { imageVIEw.image = originalimage let inputimage = CIImage (image: originalimage)! //人脸检测器 //CIDetectorAccuracyHigh:检测的精度高,但速度更慢些 detector = CIDetector (ofType: CIDetectorTypeFace , context: context, options: [ CIDetectorAccuracy : CIDetectorAccuracyHigh ]) faceFeatures: [ CIFaceFeature ]! //人脸检测需要图片方向(有元数据的话使用元数据,没有就调用featuresInImage) if orIEntation: = inputimage .propertIEs[kCGImagePropertyOrIEntation as String ] { faceFeatures = detector.featuresInImage(inputimage, options: [ CIDetectorImageOrIEntation : orIEntation]) as ! [ CIFaceFeature ] } else { faceFeatures = detector.featuresInImage(inputimage) ] } //打印所有的面部特征 print (faceFeatures) inputimageSize = inputimage.extent.size transform = CGAffinetransformIDentity CGAffinetransformScale (transform,1,-1) transform = CGAffinetransformTranslate faceFeature in faceFeatures { faceVIEwBounds = CGRectApplyAffinetransform (faceFeature.bounds,transform) // 由于检测的原图放在imageVIEw中缩放的原因,我们还要考虑缩放比例和x,y轴偏移 scale = min (imageVIEw.bounds.size.wIDth / inputimageSize.wIDth, imageVIEw.bounds.size.height / inputimageSize.height) offsetX = (imageVIEw.bounds.size.wIDth - inputimageSize.wIDth * scale) / 2 offsetY = (imageVIEw.bounds.size.height - inputimageSize.height * scale) / 2 faceVIEwBounds = CGRectApplyAffinetransform (faceVIEwBounds, CGAffinetransformMakeScale (scale,scale)) faceVIEwBounds.origin.x += offsetX faceVIEwBounds.origin.y += offsetY //每个人脸对应一个UIVIEw方框 faceVIEw = UIVIEw (frame: faceVIEwBounds) faceVIEw.layer.bordercolor = UIcolor .orangecolor(). CGcolor faceVIEw.layer.borderWIDth = 2 imageVIEw.addSubvIEw(faceVIEw) } } //检测人脸并打马赛克 detectAndPixFace(sender: ) { // 用CIPixellate滤镜对原图先做个完全马赛克 let filter = CIFilter (name: "CIPixellate" )! ( .attributes) (image: originalimage)! .setValue(inputimage,forKey: kCIInputimageKey) inputScale = max (inputimage.extent.size.wIDth,inputimage.extent.size.height) / 80 .setValue(inputScale,forKey: kCIinputScaleKey) fullPixellatedImage = .outputimage // 检测人脸,并保存在faceFeatures中 options: ) faceFeatures = detector.featuresInImage(inputimage) // 初始化蒙版图,并开始遍历检测到的所有人脸 maskImage: ! faceFeatures { (faceFeature.bounds) // 基于人脸的位置,为每一张脸都单独创建一个蒙版,所以要先计算出脸的中心点,对应为x、y轴坐标, // 再基于脸的宽度或高度给一个半径,最后用这些计算结果初始化一个CIRadialGradIEnt滤镜 centerX = faceFeature.bounds.origin.x + faceFeature.bounds.size.wIDth / 2 centerY = faceFeature.bounds.origin.y + faceFeature.bounds.size.height / 2 radius = (faceFeature.bounds.size.wIDth,faceFeature.bounds.size.height) radialGradIEnt = CIFilter "CIRadialGradIEnt" "inputRadius0" : radius, "inputRadius1" : radius + 1, "inputcolor0" CIcolor (red: 0,green: 1,blue: 0,Alpha: 1), "inputcolor1" CIVector (x: centerX,y: centerY) ])! (radialGradIEnt.attributes) // 由于CIRadialGradIEnt滤镜创建的是一张无限大小的图,所以在使用之前先对它进行裁剪 radialGradIEntOutputimage = radialGradIEnt.outputimage! .imageByCropPingToRect(inputimage.extent) if maskImage == { maskImage = radialGradIEntOutputimage { (radialGradIEntOutputimage) maskImage = "CISourceOverCompositing" "CIBlenDWithMask" )! blendFilter.setValue(fullPixellatedImage,forKey: kCIInputimageKey) blendFilter.setValue(inputimage,forKey: kCIinputBackgroundImageKey) blendFilter.setValue(maskImage,forKey: kCIinputMaskImageKey) // 输出,在界面上显示 blendOutputimage = blendFilter.outputimage blendCGImage = context.createCGImage(blendOutputimage!, fromrect: blendOutputimage!.extent) imageVIEw.image = ( CGImage : blendCGImage) } dIDReceiveMemoryWarning() { .dIDReceiveMemoryWarning() } }

原文出自: www.hangge.com 转载请保留原文链接: http://www.hangge.com/blog/cache/detail_907.html 总结

以上是内存溢出为你收集整理的Swift - 人脸检测,以及人脸打码全部内容,希望文章能够帮你解决Swift - 人脸检测,以及人脸打码所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1079142.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存