首页 > 解决方案 > 快速实时相机中的文本检测

问题描述

我正在使用 swift 在实时摄像头中检测文本,但帧未识别出正确的单词。当我尝试检测图像中的文本并且帧绘制在世界各地时,该应用程序运行良好。

看图片

对于实时摄像头,我所做的是创建一个捕获视频会话 并实现AVCaptureVideoDataOutputSampleBufferDelegate然后在didOutput我正在获取缓冲图像并将其转换为UIImage并检测其中的文本。但在这种情况下,相同的策略无法正常工作。

在实时相机中检查结果 此外,在开始视频会话后每次调用didOutput,我想要的是仅在用户移动他的相机或查找文本时调用一个函数。

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
            print("didOutput")
            // do stuff here
                guard let hasImage = CMSampleBufferGetImageBuffer(sampleBuffer) else {
                    print("no image")
                    return
                }
                let imageBuffer = hasImage
                let ciimage : CIImage = CIImage(cvPixelBuffer: imageBuffer)
                liveCamImage = self.convert(cmage: ciimage)
                DispatchQueue.main.async {
                     self.drawRectOnText(imagefromCam:self.liveCamImage)         
        }
    }

有什么解决办法吗?//转换函数

func convert(cmage:CIImage) -> UIImage
    {
         let context:CIContext = CIContext.init(options: nil)
         let cgImage:CGImage = context.createCGImage(cmage, from: cmage.extent)!
         let image:UIImage = UIImage.init(cgImage: cgImage)
         return image
    }

标签: swifttext-recognitionavcapturevideodataoutput

解决方案


在您的转换方法中使用以下代码:

func convert(samImageBuff:CIImage) -> UIImage{

let imageBuffer = CMSampleBufferGetImageBuffer(samImageBuff)
var ciImage: CIImage? = nil
if let imageBuffer = imageBuffer as? CVPixelBuffer {
    ciImage = CIImage(cvPixelBuffer: imageBuffer)
}
let temporaryContext = CIContext(options: nil)
var videoImage: CGImage? = nil
if let ciImage = ciImage {
    videoImage = temporaryContext.createCGImage(ciImage, from: CGRect(x: 0, y: 0, width: CVPixelBufferGetWidth(imageBuffer), height: CVPixelBufferGetHeight(imageBuffer)))
}

var image: UIImage? = nil
if let videoImage = videoImage {
    image = UIImage(cgImage: videoImage)
}
CGImageRelease(videoImage)
 return image
 }

推荐阅读