数码相机中的人脸检测有啥作用?使用人脸对焦的技巧和方法是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数码相机中的人脸检测有啥作用?使用人脸对焦的技巧和方法是啥?相关的知识,希望对你有一定的参考价值。

现如今,我们的数码相机技术已经得到了很大的改进,不再满足原先的对焦拍摄,而是可以通过人脸技术检测以及智能的场景识别,使用人脸进行对焦,可以更好地拍摄到人物的静态和动态,快门在捕捉人脸十更具人性化,可以进行瞬间的笑容拍摄,使得数码相机在配置上得到新的跟进。使用人脸对焦的方法和技巧,就是通过数码相机快速识别,让摄影者的精力集中在取景上,构成更美的图像。

数码相机中的人脸检测,可快速捕捉图像

过去,数码相机在使用的过程中,多数都是选择对焦的方式来进行拍摄,在拍摄的过程中,拍摄者需要对光线进行调节,然后选择对焦,在对应相应的人和事物上,完成对焦之后,才可快速地按下快门捕捉瞬间。但现如今,数码相机已经有了全新的进步,面部识别成为了一个新的卖点,也就是所谓的人脸对焦,优先对人脸对焦,对于拍摄有一定的帮助作用,而且在光线充足的情况下,可以更近距离地捕捉到人脸上的动态或静态的图像,方便且快捷。

笑脸快门,成为贴心的技术

不少数码相机的厂商在对快门进行设计的时候,都选择了微笑快门,这种全新的技术应用,实际上就是人脸识别,在摄像机的快门处对微笑的人脸进行识别。这种技术是在数码相机的内部增加了笑脸灵敏度的设置,可以自动地去捕捉不同人脸上不同程度的笑容,在拍摄时可以方便拍摄者去选择不同方式,在内置的设置上可以省去不少的必要设备比如三脚架、光景板等,只需轻轻将快门按下,就能得到一张丰富的人脸照片。

实现脸部识别,曝光主脸

在以往拍摄时,我们更多地需要去解决取景问题,尤其是对焦远景的时候人物会出现模糊的情况,人物与背景之间存在很大的亮度差,为了解决这个问题人脸识别技术被开发出来,在对焦系统尤其是测光系统上特地安装了AF锁,解决复杂拍摄问题,对手指和经验也是一次大解放。相机可自动识别脸部,在拍摄时将人脸当作主要的识别主体,可更好控制和曝光,针对人脸,将使用者精力全部集中在取景上,可进一步提升拍摄的速度,也能合理精准抓拍。

对焦人脸,抓拍是关键

正常情况下我们在使用相机进行人物拍摄时,自然是想要拍摄出最自然的图像,这种自然图像尤其是人脸拍摄的关键就是自然和灵动感。为了抓拍到一瞬间的人物图像,我们使用数码相机的人脸功能时要基于硬件条件和抓拍为一体,在操作时需要半按快门,然后再加上AE和AF锁,进行取景拍摄,注意抓拍的时间要在合理范围内即可。

总而言之,我们在拍摄人脸时可以使用微笑快门,这种快门技术也就是所谓的人脸识别。在使用时可以更好起到对焦作用,也能将周围景物凸显出来,方便使用者快捷拍摄 拍摄出来的人物灵动自然。

参考技术A 更好的捕捉人物,检测美化面部,使拍出地图像,达到更好的效果。现在大部分数码产品,都有定焦的功能,设置一下就好了。 参考技术B 人脸检测可以起到对焦的作用。对于非专业的拍摄人员来说是非常不错的。在拍照的时候应该半按快门,这个时候应该快速的找到脸部的焦点。也可以手动把对焦放在脸上。 参考技术C 人脸检测的作用是为了能够在拍摄的过程中让人脸更加的清晰;我觉得在拍摄的过程中可以把焦点放到人物眼睛上。 参考技术D 数码相机当中的人脸检测功能是非常关键的。使用人脸对焦的时候应该按照步骤来操作,这样才能够获得更加清晰的人像。

实时人脸检测不起作用

【中文标题】实时人脸检测不起作用【英文标题】:Real time face detection is not working 【发布时间】:2017-05-05 11:03:11 【问题描述】:

此代码没有显示在相机中检测到人脸,即使没有错误。 我希望在相机中实时检测到脸部,周围有红色的乡绅,但我认为我没有正确放置代码或者我应该在 Viewdidload 或其他地方放置一些东西?

import UIKit
import CoreImage

class ViewController: UIViewController ,UIAlertViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate  

@IBOutlet var imageView: UIImageView!
@IBAction func Moodify(_ sender: UIButton) 


    func detect() 

        guard let personciImage = CIImage(image: imageView.image!) else 
            return
        

        let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
        let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy)
        let faces = faceDetector?.features(in: personciImage)


        // For converting the Core Image Coordinates to UIView Coordinates
        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)")

            // Apply the transform to convert the coordinates
            var faceViewBounds = face.bounds.applying(transform)

            // Calculate the actual position and size of the rectangle in the image view
            let viewSize = imageView.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)
            //let faceBox = UIView(frame: face.bounds)
            faceBox.layer.borderWidth = 3
            faceBox.layer.borderColor = UIColor.red.cgColor
            faceBox.backgroundColor = UIColor.clear
            imageView.addSubview(faceBox)

            if face.hasLeftEyePosition 
                print("Left eye bounds are \(face.leftEyePosition)")
            

            if face.hasRightEyePosition 
                print("Right eye bounds are \(face.rightEyePosition)")
            
        
    

    let picker = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = true
    picker.sourceType = .camera
    picker.cameraDevice = .front
    self.present(picker, animated: true, completion:  _ in )

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [AnyHashable: Any]) 
        let chosenImage = info[UIImagePickerControllerEditedImage]
        self.imageView!.image = chosenImage as? UIImage
        picker.dismiss(animated: true, completion:  _ in )
    

     // picker.dismiss(animated: true, completion:  _ in )
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) 
        picker.dismiss(animated: true, completion:  _ in )
    


override func viewDidLoad() 

    let alert = UIAlertController(title: "Ooops!!!", message: "Camera is not connected", preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: "Connect", style: UIAlertActionStyle.default, handler: nil))
    self.present(alert, animated: true, completion: nil)

    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.



override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


【问题讨论】:

能否分享一下您从哪里获取此代码的教程? @TungFam 这里是链接:appcoda.com/face-detection-core-image 我不确定您是否以正确的方式提问,但您说“此代码未显示在相机中检测到人脸”。根据教程,它应该在图像上显示人脸,而不是在相机中实时显示。 @TungFam 但我已经对实时摄像机进行了一些编辑,您可以运行此代码。此代码仅启动相机,但不进行任何检测。 您能否告诉我,如果-detect 方法嵌套在您的事件处理程序的主体中,您希望谁触发它?为什么你在-viewDidLoad 方法的主体中放置并尝试显示一个警报控制器?等等…… 【参考方案1】:

您很可能只需要按照文档中描述的方式触发函数

我们将调用 viewDidLoad 中的检测方法。所以在方法中插入如下代码行:

override func viewDidLoad() 
   super.viewDidLoad()

   detect()

编译并运行应用程序。

编辑: 这是解决方案,而函数“检测”是作为子类方法,但在您的情况下,您使用 IBAction,它具有类似这样的不同语法。您应该尝试删除函数名 detect() 和这个括号



let picker =

这部分必须在函数内部

let picker = UIImagePickerController()
picker.delegate = self
picker.allowsEditing = true
picker.sourceType = .camera
picker.cameraDevice = .front
self.present(picker, animated: true, completion:  _ in )

对于您的情况,您也可以省略这部分。

【讨论】:

@Solangi 您使用的 SWIFT 版本是什么?在旧版本之前需要使用 self.detect() 我正在使用 Swift 3 @Solangi 看起来像个谜。我已经做了 7 年的 iOS 开发,但从未遇到过这种情况。我的意思是你做了一个子类,然后子类有一个方法,而从子类调用该方法时无法识别。 那么我应该怎么做,你会建议我做点什么吗? 感谢您的努力,但我仍然收到此错误 Use of unresolved identifier "detect" error 您能否用您在答案中编写的代码更新我的问题。【参考方案2】:

查看您的代码后,您甚至没有在拍完照片后致电detect()。我尝试按如下所述对其进行修复,但是,detect() 将返回我在Face Detection with Camera 中描述的零面。

lazy var picker: UIImagePickerController = 
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = true
    picker.sourceType = .camera
    picker.cameraDevice = .front
    return picker
()

@IBOutlet var imageView: UIImageView!
override func viewDidLoad() 
    super.viewDidLoad()
    imageView.contentMode = .scaleAspectFit


@IBAction func TakePhoto(_ sender: Any) 
    self.present(picker, animated: true, completion: nil)


// MARK: - UIImagePickerControllerDelegate
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
    if let chosenImage = info[UIImagePickerControllerOriginalImage] as? UIImage 
        self.imageView!.image = chosenImage
        // Got the image from camera, the imageView.image is not nil, so it's time for facial detection
        detect()
        picker.dismiss(animated: true, completion: nil)
    



func imagePickerControllerDidCancel(_ picker: UIImagePickerController) 
    picker.dismiss(animated: true, completion: nil)


// MARK: - Face Detection

func detect() 

    guard let personciImage = CIImage(image: imageView.image!) else 
        return
    

    let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
    let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy)
    let faces = faceDetector?.features(in: personciImage)


    // For converting the Core Image Coordinates to UIView Coordinates
    let ciImageSize = personciImage.extent.size
    var transform = CGAffineTransform(scaleX: 1, y: -1)
    transform = transform.translatedBy(x: 0, y: -ciImageSize.height)
    print("faces.count = \(faces?.count)")

    for face in faces as! [CIFaceFeature] 

        print("Found bounds are \(face.bounds)")

        // Apply the transform to convert the coordinates
        var faceViewBounds = face.bounds.applying(transform)

        // Calculate the actual position and size of the rectangle in the image view
        let viewSize = imageView.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)
        //let faceBox = UIView(frame: face.bounds)
        faceBox.layer.borderWidth = 3
        faceBox.layer.borderColor = UIColor.red.cgColor
        faceBox.backgroundColor = UIColor.clear
        imageView.addSubview(faceBox)

        if face.hasLeftEyePosition 
            print("Left eye bounds are \(face.leftEyePosition)")
        

        if face.hasRightEyePosition 
            print("Right eye bounds are \(face.rightEyePosition)")
        
    

【讨论】:

它还没有检测到!而且我还尝试在 viewdidload 中提及detect(),但它给出了错误致命错误展开可选当你更新答案时你会更新我的问题代码中的更改吗? viewDidLoad()中调用detect()会崩溃,因为开头没有设置imageView.image 你的按钮(Moodify)是干什么用的?就我而言,它只是一个按钮,用于显示用于快照的 pickerView。我拍照后,代理iimagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 会跑,然后detect() 是的,Moodify 是我的按钮 我把它放在here

以上是关于数码相机中的人脸检测有啥作用?使用人脸对焦的技巧和方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 视角下人脸检测和人脸跟踪有啥区别

实时人脸检测不起作用

在我的相机应用程序中的前后摄像头和人脸检测之间切换的按钮

Android中的人脸检测?

在实时人脸检测 Android 中的 Live CameraPreview 上围绕人脸绘制矩形

使用opencv和覆盆子相机模块进行人脸检测的最佳算法是啥