swift - 快速实时相机中的文本检测
问题描述
我正在使用 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
}
解决方案
在您的转换方法中使用以下代码:
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
}
推荐阅读
- javascript - 从嵌套的 json 值对象中获取数组
- angular - Angular 8:将两个独立的应用程序合二为一
- python - 从低对比度图像中识别字符
- javascript - 当我在弹出窗口中输入“1 / 1”时,为什么我的 HTML 输入不显示“Cap”?
- jestjs - 为什么在 sequelize 上的超测请求之前完成了更早的运行?
- javascript - 发送电子邮件表单不起作用(按钮不执行任何操作)
- flutter - Flutter 提供程序在发布 apk 中不工作,但在调试模式下工作正常
- sql - 无法使用 PIVOT 子句为物化视图设置 ON COMMIT 刷新属性
- elasticsearch - Elasticsearch:我有一个日期字段并收到错误:'Fielddata 在默认情况下在文本字段上被禁用
- javascript - 快速排序消除重复值