亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS利用CoreImage實現人臉識別詳解

2020-07-26 02:49:30
字體:
來源:轉載
供稿:網友

前言

CoreImage是Cocoa Touch中一個強大的API,也是iOS SDK中的關鍵部分,不過它經常被忽視。在本篇教程中,我會帶大家一起驗證CoreImage的人臉識別特性。在開始之前,我們先要簡單了解下CoreImage framework 組成

CoreImage framework組成

Apple 已經幫我們把image的處理分類好,來看看它的結構:

主要分為三個部分:

1、定義部分:CoreImage 和CoreImageDefines。見名思義,代表了CoreImage 這個框架和它的定義。

2、操作部分:

  • 濾鏡(CIFliter):CIFilter 產生一個CIImage。典型的,接受一到多的圖片作為輸入,經過一些過濾操作,產生指定輸出的圖片。
  • 檢測(CIDetector):CIDetector 檢測處理圖片的特性,如使用來檢測圖片中人臉的眼睛、嘴巴、等等。
  • 特征(CIFeature):CIFeature 代表由 detector處理后產生的特征。

3、圖像部分:

  • 畫布(CIContext):畫布類可被用與處理Quartz 2D 或者 OpenGL??梢杂盟鼇黻P聯CoreImage類。如濾鏡、顏色等渲染處理。
  • 顏色(CIColor): 圖片的關聯與畫布、圖片像素顏色的處理。
  • 向量(CIVector): 圖片的坐標向量等幾何方法處理。
  • 圖片(CIImage): 代表一個圖像,可代表關聯后輸出的圖像。

在了解上述基本知識后,我們開始通過創建一個工程來帶大家一步步驗證Core Image的人臉識別特性。

將要構建的應用

iOS的人臉識別從iOS 5(2011)就有了,不過一直沒怎么被關注過。人臉識別API允許開發者不僅可以檢測人臉,也可以檢測到面部的一些特殊屬性,比如說微笑或眨眼。

首先,為了了解Core Image的人臉識別技術我們會創建一個app來識別照片中的人臉并用一個方框來標記它。在第二個demo中,讓用戶拍攝一張照片,檢測其中的人臉并檢索人臉位置。這樣一來,就充分掌握了iOS中的人臉識別,并且學會如何利用這個強大卻總被忽略的API。

話不多說,開搞!

建立工程(我用的是Xcode8.0)

這里提供了初始工程,當然你也可以自己創建(主要是為了方便大家)點我下載 用Xcode打開下載后的工程,可以看到里面只有一個關聯了IBOutlet和imageView的StoryBoard。


使用CoreImage識別人臉

在開始工程中,故事板中的imageView組件與代碼中的IBOutlet已關聯,接下來要編寫實現人臉識別的代碼部分。在ViewController.swift文件中寫下如下代碼:

import UIKitimport CoreImage // 引入CoreImageclass ViewController: UIViewController { @IBOutlet weak var personPic: UIImageView! override func viewDidLoad() { super.viewDidLoad() personPic.image = UIImage(named: "face-1") // 調用detect detect() } //MARK: - 識別面部 func detect() { // 創建personciImage變量保存從故事板中的UIImageView提取圖像并將其轉換為CIImage,使用Core Image時需要用CIImage guard let personciImage = CIImage(image: personPic.image!) else {  return } // 創建accuracy變量并設為CIDetectorAccuracyHigh,可以在CIDetectorAccuracyHigh(較強的處理能力)與CIDetectorAccuracyLow(較弱的處理能力)中選擇,因為想讓準確度高一些在這里選擇CIDetectorAccuracyHigh let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh] // 這里定義了一個屬于CIDetector類的faceDetector變量,并輸入之前創建的accuracy變量 let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy) // 調用faceDetector的featuresInImage方法,識別器會找到所給圖像中的人臉,最后返回一個人臉數組 let faces = faceDetector?.features(in: personciImage) // 循環faces數組里的所有face,并將識別到的人臉強轉為CIFaceFeature類型 for face in faces as! [CIFaceFeature] {  print("Found bounds are /(face.bounds)")  // 創建名為faceBox的UIView,frame設為返回的faces.first的frame,繪制一個矩形框來標識識別到的人臉  let faceBox = UIView(frame: face.bounds)  // 設置faceBox的邊框寬度為3  faceBox.layer.borderWidth = 3  // 設置邊框顏色為紅色  faceBox.layer.borderColor = UIColor.red.cgColor  // 將背景色設為clear,意味著這個視圖沒有可見的背景  faceBox.backgroundColor = UIColor.clear  // 最后,把這個視圖添加到personPic imageView上  personPic.addSubview(faceBox)  // API不僅可以幫助你識別人臉,也可識別臉上的左右眼,我們不在圖像中標識出眼睛,只是給你展示一下CIFaceFeature的相關屬性  if face.hasLeftEyePosition {  print("Left eye bounds are /(face.leftEyePosition)")  }  if face.hasRightEyePosition {  print("Right eye bounds are /(face.rightEyePosition)")  } } }}

編譯并運行app,結果應如下圖所示:


根據控制臺的輸出來看,貌似識別器識別到了人臉:

Found bounds are (314.0, 243.0, 196.0, 196.0)

當前的實現中沒有解決的問題:

  • 人臉識別是在原始圖像上進行的,由于原始圖像的分辨率比image view要高,因此需要設置image view的content mode為aspect fit(保持縱橫比的情況下縮放圖片)。為了合適的繪制矩形框,需要計算image view中人臉的實際位置與尺寸
  • 還要注意的是,CoreImage與UIView使用兩種不同的坐標系統(看下圖),因此要實現一個CoreImage坐標到UIView坐標的轉換。

UIView坐標系:


CoreImage坐標系:

現在使用下面的代碼替換detect()方法:

func detect1() { guard let personciImage = CIImage(image: personPic.image!) else { return } let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh] let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy) let faces = faceDetector?.features(in: personciImage) // 轉換坐標系 let ciImageSize = personciImage.extent.size var transform = CGAffineTransform(scaleX: 1, y: -1) transform = transform.translatedBy(x: 0, y: -ciImageSize.height) for face in faces as! [CIFaceFeature] { print("Found bounds are /(face.bounds)")  // 應用變換轉換坐標 var faceViewBounds = face.bounds.applying(transform) // 在圖像視圖中計算矩形的實際位置和大小 let viewSize = personPic.bounds.size let scale = min(viewSize.width / ciImageSize.width, viewSize.height / ciImageSize.height) let offsetX = (viewSize.width - ciImageSize.width * scale) / 2 let offsetY = (viewSize.height - ciImageSize.height * scale) / 2 faceViewBounds = faceViewBounds.applying(CGAffineTransform(scaleX: scale, y: scale)) faceViewBounds.origin.x += offsetX faceViewBounds.origin.y += offsetY let faceBox = UIView(frame: faceViewBounds) faceBox.layer.borderWidth = 3 faceBox.layer.borderColor = UIColor.red.cgColor faceBox.backgroundColor = UIColor.clear personPic.addSubview(faceBox) if face.hasLeftEyePosition {  print("Left eye bounds are /(face.leftEyePosition)") } if face.hasRightEyePosition {  print("Right eye bounds are /(face.rightEyePosition)") } }}

上述代碼中,首先使用仿射變換(AffineTransform)將Core Image坐標轉換為UIKit坐標,然后編寫了計算實際位置與矩形視圖尺寸的代碼。

再次運行app,應該會看到人的面部周圍會有一個框。OK,你已經成功使用Core Image識別出了人臉。

但是有的童鞋在使用了上面的代碼運行后可能會出現方框不存在(即沒有識別人臉)這種情況,這是由于忘記關閉Auto Layout以及Size Classes了。 選中storyBoard中的ViewController,選中view下的imageView。然后在右邊的面板中的第一個選項卡中找到use Auto Layout ,將前面的✔️去掉就可以了

經過上面的設置后我們再次運行App,就會看到圖三出現的效果了。

構建一個人臉識別的相機應用

想象一下你有一個用來照相的相機app,照完相后你想運行一下人臉識別來檢測一下是否存在人臉。若存在一些人臉,你也許想用一些標簽來對這些照片進行分類。我們不會構建一個保存照片后再處理的app,而是一個實時的相機app,因此需要整合一下UIImagePicker類,在照完相時立刻進行人臉識別。

在開始工程中已經創建好了CameraViewController類,使用如下代碼實現相機的功能:

class CameraViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { @IBOutlet var imageView: UIImageView! let imagePicker = UIImagePickerController() override func viewDidLoad() {  super.viewDidLoad()  imagePicker.delegate = self } @IBAction func takePhoto(_ sender: AnyObject) {  if !UIImagePickerController.isSourceTypeAvailable(.camera) {   return  }  imagePicker.allowsEditing = false  imagePicker.sourceType = .camera  present(imagePicker, animated: true, completion: nil) } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {  if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {   imageView.contentMode = .scaleAspectFit   imageView.image = pickedImage  }  dismiss(animated: true, completion: nil)  self.detect() } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {  dismiss(animated: true, completion: nil) }}

前面幾行設置UIImagePicker委托為當前視圖類,在didFinishPickingMediaWithInfo方法(UIImagePicker的委托方法)中設置imageView為在方法中所選擇的圖像,接著返回上一視圖調用detect函數。

還沒有實現detect函數,插入下面代碼并分析一下:

func detect() { let imageOptions = NSDictionary(object: NSNumber(value: 5) as NSNumber, forKey: CIDetectorImageOrientation as NSString) let personciImage = CIImage(cgImage: imageView.image!.cgImage!) let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh] let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy) let faces = faceDetector?.features(in: personciImage, options: imageOptions as? [String : AnyObject]) if let face = faces?.first as? CIFaceFeature {  print("found bounds are /(face.bounds)")  let alert = UIAlertController(title: "提示", message: "檢測到了人臉", preferredStyle: UIAlertControllerStyle.alert)  alert.addAction(UIAlertAction(title: "確定", style: UIAlertActionStyle.default, handler: nil))  self.present(alert, animated: true, completion: nil)  if face.hasSmile {   print("face is smiling");  }  if face.hasLeftEyePosition {   print("左眼的位置: /(face.leftEyePosition)")  }  if face.hasRightEyePosition {   print("右眼的位置: /(face.rightEyePosition)")  } } else {  let alert = UIAlertController(title: "提示", message: "未檢測到人臉", preferredStyle: UIAlertControllerStyle.alert)  alert.addAction(UIAlertAction(title: "確定", style: UIAlertActionStyle.default, handler: nil))  self.present(alert, animated: true, completion: nil) }}

這個detect()函數與之前實現的detect函數非常像,不過這次只用它來獲取圖像不做變換。當識別到人臉后顯示一個警告信息“檢測到了人臉!”,否則顯示“未檢測到人臉”。運行app測試一下:

我們已經使用到了一些CIFaceFeature的屬性與方法,比如,若想檢測人物是否微笑,可以調用.hasSmile,它會返回一個布爾值??梢苑謩e使用.hasLeftEyePosition與.hasRightEyePosition檢測是否存在左右眼。

同樣,可以調用hasMouthPosition來檢測是否存在嘴,若存在則可以使用mouthPosition屬性,如下所示:

if (face.hasMouthPosition) { print("mouth detected")}

如你所見,使用Core Image來檢測面部特征是非常簡單的。除了檢測嘴、笑容、眼睛外,也可以調用leftEyeClosed與rightEyeClosed檢測左右眼是否睜開,這里就不在貼出代碼了。

總結

在這篇教程中嘗試了CoreImage的人臉識別API與如何在一個相機app中應用它,構建了一個簡單的UIImagePicker來選取照片并檢測圖像中是否存在人物。

如你所見,Core Image的人臉識別是個強大的API!希望這篇教程能給你提供一些關于這個鮮為人知的iOS API有用的信息。

Github地址:點擊swift版地址,OC版地址下載

本地下載:點擊swift版地址,OC版地址下載

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97视频在线观看网址| 日av在线播放中文不卡| 成人亚洲综合色就1024| 国产精品自在线| 亚洲深夜福利视频| 国产视频999| 伊人伊人伊人久久| 国产欧美va欧美va香蕉在| 97超级碰碰人国产在线观看| 国产91色在线免费| 亚洲人午夜色婷婷| 国产成人精品电影久久久| 国产高清在线不卡| 欧美激情国内偷拍| 精品视频—区二区三区免费| 成人性教育视频在线观看| 一本一本久久a久久精品综合小说| 亚洲剧情一区二区| 亚洲美女又黄又爽在线观看| 国产精品∨欧美精品v日韩精品| 国产精品吊钟奶在线| 国语自产精品视频在线看抢先版图片| 日韩性生活视频| 大桥未久av一区二区三区| 精品福利在线看| 日韩激情片免费| 中文字幕9999| 久久亚洲私人国产精品va| 久久精品影视伊人网| 亚洲区一区二区| www.日韩av.com| 欧美成人精品在线视频| 97在线观看视频国产| 欧美专区国产专区| 日本亚洲欧美成人| 久久777国产线看观看精品| 欧美精品videossex88| 成人国产精品色哟哟| 欧美黑人xxxx| 亚洲国产精品专区久久| 国产精品91久久久| 日韩美女主播视频| 中国日韩欧美久久久久久久久| 91在线网站视频| 亚洲电影av在线| 国产精品高潮在线| 欧美性猛交xxxxx水多| 亚洲视频在线看| 日韩中文字幕网站| 亚洲欧美999| 欧美成人午夜免费视在线看片| 日韩小视频在线| 国产精品久久激情| 欧美另类在线观看| 中文字幕一区电影| 国产精品福利观看| 久久精品久久久久电影| 国产精品久久97| 国产91露脸中文字幕在线| 亚洲第一视频在线观看| 国产精欧美一区二区三区| 国产69精品99久久久久久宅男| 色哟哟亚洲精品一区二区| 国产日韩中文在线| 在线观看成人黄色| 97色在线观看| 欧美激情亚洲精品| 日韩在线免费视频观看| 亚洲有声小说3d| 国产香蕉97碰碰久久人人| 欧美成人中文字幕| 欧美第一淫aaasss性| 久久久久久久色| 81精品国产乱码久久久久久| 久久视频在线观看免费| 成人激情视频免费在线| 欧美专区在线视频| 亚洲va男人天堂| 国产噜噜噜噜噜久久久久久久久| 久久精品电影网站| 亚洲高清久久久久久| 亚洲精品福利资源站| 国产精品久久久久久久久久东京| 国产精品久久久久久av| 欧美激情视频在线| 国产成人福利网站| 中文亚洲视频在线| 国产精品九九九| 久热精品在线视频| 欧美夫妻性生活视频| 久久国产精品首页| 日本欧美在线视频| 国产精品看片资源| 国产精品美女免费| 色婷婷**av毛片一区| 欧美精品18videosex性欧美| 欧美成aaa人片在线观看蜜臀| 欧美激情亚洲一区| 精品福利在线视频| 国产亚洲欧美日韩精品| 国产suv精品一区二区三区88区| 国产一区私人高清影院| 欧美噜噜久久久xxx| 久久精品国产欧美亚洲人人爽| 69精品小视频| 欧美一区视频在线| 97国产在线视频| 亚洲欧美日韩在线高清直播| 日韩有码在线播放| 高清一区二区三区四区五区| 久久色精品视频| 国产精品国产三级国产专播精品人| 亚洲人成网7777777国产| 国内精品伊人久久| 69国产精品成人在线播放| 亚洲aaaaaa| 国产欧美在线播放| 国内精品久久久久久久久| 8x海外华人永久免费日韩内陆视频| 最近2019中文字幕第三页视频| 亚洲裸体xxxx| 亚洲人成网7777777国产| 亚洲一区第一页| 国内偷自视频区视频综合| 91精品成人久久| 亚洲欧美日韩精品久久| 日韩女在线观看| 亚洲国产精品视频在线观看| 国产精品久久久久91| 亚洲欧美激情在线视频| 日韩精品高清视频| 麻豆乱码国产一区二区三区| 亚洲自拍av在线| 国产欧美日韩亚洲精品| 国产国语videosex另类| 日本视频久久久| 国产欧美精品一区二区| 精品亚洲精品福利线在观看| 日本免费久久高清视频| 久久91精品国产91久久跳| xvideos亚洲人网站| 日韩在线观看免费高清完整版| 日韩精品在线免费观看| 国内精品一区二区三区四区| 91亚洲精品一区二区| 国产日本欧美在线观看| 91免费福利视频| 久青草国产97香蕉在线视频| 亚洲成年网站在线观看| 成人综合国产精品| 91po在线观看91精品国产性色| 日韩一区二区久久久| 国产精品久久久久9999| 精品日韩美女的视频高清| 亚洲欧美国产一区二区三区| 国产日韩精品一区二区| 日韩美女av在线| 亚洲一区二区三区乱码aⅴ| 欧美一级片在线播放| 动漫精品一区二区| 永久免费精品影视网站| 国产日韩欧美中文在线播放| 国产精品视频一区国模私拍| 国产69精品久久久久99|