谷歌人脸检测在转换为图像并尝试检测人脸时崩溃

Posted

技术标签:

【中文标题】谷歌人脸检测在转换为图像并尝试检测人脸时崩溃【英文标题】:Google Face Detection crashing when converting to image and trying to detect face 【发布时间】:2018-02-10 03:34:05 【问题描述】:

我正在创建一个带有滤镜的自定义相机。当我添加以下行时,它会崩溃而不显示任何异常。

//设置视频输出

func setupBuffer() 
    videoBuffer = AVCaptureVideoDataOutput()
    videoBuffer?.alwaysDiscardsLateVideoFrames = true
    videoBuffer?.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString): NSNumber(value: kCVPixelFormatType_32RGBA)]
    videoBuffer?.setSampleBufferDelegate(self, queue: DispatchQueue.main)
    captureSession?.addOutput(videoBuffer)



public func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) 

    if connection.videoOrientation != .portrait 
        connection.videoOrientation = .portrait
    
        guard let image = GMVUtility.sampleBufferTo32RGBA(sampleBuffer) else 
            print("No Image ????")
            return
        

    pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
    ciImage = CIImage(cvImageBuffer: pixelBuffer!, options: CMCopyDictionaryOfAttachments(kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate)as! [String : Any]?)

    CameraView.filter = CIFilter(name: "CIPhotoEffectProcess")
    CameraView.filter?.setValue(ciImage, forKey: kCIInputImageKey)
    let cgimg = CameraView.context.createCGImage(CameraView.filter!.outputImage!, from: ciImage.extent)

    DispatchQueue.main.async  
        self.preview.image = UIImage(cgImage: cgimg!)
    

但它正在崩溃 -

  guard let image = GMVUtility.sampleBufferTo32RGBA(sampleBuffer) else 
                print("No Image ????")
                return
            

当我传递从 CIImage 创建的图像时,它无法识别图像中的人脸。 完整的代码文件是https://www.dropbox.com/s/y1ewd1sh18h3ezj/CameraView.swift.zip?dl=0

【问题讨论】:

你应该设置一个异常断点来捕捉确切的错误信息。 我添加了它,但它在框架中的某个地方崩溃了。我无权访问代码。 您确定问题出在框架本身还是您调用框架的方式?尝试运行该框架的示例应用之一。 运行良好。我只是将代码复制粘贴到我的项目中 为什么要使用主队列来处理 outputsampleBuffer?? 【参考方案1】:

1) 为缓冲区创建单独的队列。

 fileprivate var videoDataOutputQueue = DispatchQueue(label: "VideoDataOutputQueue")

2) 用这个设置缓冲区

        let videoBuffer = AVCaptureVideoDataOutput()
        videoBuffer?.alwaysDiscardsLateVideoFrames = true
        videoBuffer?.videoSettings = [(kCVPixelBufferPixelFormatTypeKey as NSString): NSNumber(value: kCVPixelFormatType_32BGRA)]
        videoBuffer?.setSampleBufferDelegate(self, queue: videoDataOutputQueue ) //
        captureSession?.addOutput(videoBuffer)

【讨论】:

以上是关于谷歌人脸检测在转换为图像并尝试检测人脸时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 OpenCV JAVA 检测图像中的人脸时出错

人脸检测实战终极:使用 OpenCV 和 Python 进行人脸对齐

iOS - 将图像裁剪为检测到的面部的问题

图像人脸检测(框出人脸笑脸眼睛)

为啥 Google 的 ML 人脸检测工具包在 .process() 上崩溃

EMgucv 保存从网络摄像头检测到的多张人脸