REf : https://maniacdev.com/2011/11/tutorial-easy-face-detection-with-core-image-in-ios-5
拿可愛學妹的相片來作實驗,效果好又賞心悅目:D~
在iOS中,不必使用OpenCV,直接使用內建方法實作。
首先在專案匯入Framework:
- QuartzCore.framework
- CoreImage .framwork
接著在檔案中引入.h檔:
- #import <CoreImage/CoreImage.h>
- #import <QuartzCore/QuartzCore.h>
最後在.m中實作,所有的步驟都在程式碼中說明,同時偵測臉部、雙眼、嘴巴:
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
| /** Theme: Face Detection IDE: Xcode 5 Language: Objective C Date: 102/12/12 Author: HappyMan */ - ( void )viewDidLoad { [super viewDidLoad]; [self faceDetector]; } -( void )markFaces:(UIImageView *)facePicture { // draw a CI image with the previously loaded face detection picture CIImage* image = [CIImage imageWithCGImage:facePicture.image.CGImage]; // create a face detector - since speed is not an issue we'll use a high accuracy // detector CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]]; // create an array containing all the detected faces from the detector NSArray* features = [detector featuresInImage:image]; // we'll iterate through every detected face. CIFaceFeature provides us // with the width for the entire face, and the coordinates of each eye // and the mouth if detected. Also provided are BOOL's for the eye's and // mouth so we can check if they already exist. for (CIFaceFeature* faceFeature in features) { // get the width of the face CGFloat faceWidth = faceFeature.bounds.size.width; // create a UIView using the bounds of the face UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds]; // add a border around the newly created UIView faceView.layer.borderWidth = 3; faceView.layer.borderColor = [[UIColor redColor] CGColor]; // add the new view to create a box around the face [self.imageView addSubview:faceView]; if (faceFeature.hasLeftEyePosition) { // create a UIView with a size based on the width of the face UIView* leftEyeView = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.leftEyePosition.x-faceWidth*0.15, faceFeature.leftEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)]; // change the background color of the eye view [leftEyeView setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]]; // set the position of the leftEyeView based on the face [leftEyeView setCenter:faceFeature.leftEyePosition]; // round the corners leftEyeView.layer.cornerRadius = faceWidth*0.15; // add the view to the window [self.imageView addSubview:leftEyeView]; } if (faceFeature.hasRightEyePosition) { // create a UIView with a size based on the width of the face UIView* leftEye = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.rightEyePosition.x-faceWidth*0.15, faceFeature.rightEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)]; // change the background color of the eye view [leftEye setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]]; // set the position of the rightEyeView based on the face [leftEye setCenter:faceFeature.rightEyePosition]; // round the corners leftEye.layer.cornerRadius = faceWidth*0.15; // add the new view to the window [self.imageView addSubview:leftEye]; } if (faceFeature.hasMouthPosition) { // create a UIView with a size based on the width of the face UIView* mouth = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.mouthPosition.x-faceWidth*0.2, faceFeature.mouthPosition.y-faceWidth*0.2, faceWidth*0.4, faceWidth*0.4)]; // change the background color for the mouth to green [mouth setBackgroundColor:[[UIColor greenColor] colorWithAlphaComponent:0.3]]; // set the position of the mouthView based on the face [mouth setCenter:faceFeature.mouthPosition]; // round the corners mouth.layer.cornerRadius = faceWidth*0.2; // add the new view to the window [self.imageView addSubview:mouth]; } } } -( void )faceDetector { // Load the picture for face detection UIImageView* image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@ "HappyMan.jpg" ]]; // Draw the face detection image [self.imageView addSubview:image]; // Execute the method used to markFaces in background [self performSelectorInBackground:@selector(markFaces:) withObject:image]; // flip image on y-axis to match coordinate system used by core image [image setTransform:CGAffineTransformMakeScale(1, -1)]; // flip the entire window to make everything right side up [self.imageView setTransform:CGAffineTransformMakeScale(1, -1)]; // self.imageView.transform = CGAffineTransformMakeRotation(M_PI_2 * 2); } |
偵測到人臉,以紅色粗框標示;偵測到人眼,以藍色半透明圓形標示;偵測到嘴巴,以綠色半透明圓形標示。
執行結果: