Fooducate应用程序(左下方)显示了扫描仪的大型视频预览。扫描仪仅检测白色箭头之间明亮区域中的条形码。
我的ViewController视图(右下方)有一个显示AVCaptureVideoPreviewLayer的子视图。视频预览仅显示在那里。
如何让我的视频预览看起来像他们的,并且只在非灰色区域进行扫描?
用于
的类import UIKit
import AVFoundation
class Scanner: NSObject, AVCaptureMetadataOutputObjectsDelegate {
var device: AVCaptureDevice?
var metadata: AVCaptureMetadataOutput = AVCaptureMetadataOutput()
var cameraLayer: AVCaptureVideoPreviewLayer!
var session: AVCaptureSession = AVCaptureSession()
var videoIn: AVCaptureDeviceInput?
var queue : dispatch_queue_t
init() {
cameraLayer = AVCaptureVideoPreviewLayer(session: session)
cameraLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
queue = dispatch_queue_create("com.zombie.shopper.queue", DISPATCH_QUEUE_SERIAL)
println("scanner init")
}
func setupScanner() {
device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
if !device {
println("No video device found!")
return
}
var error: NSErrorPointer = nil
videoIn = AVCaptureDeviceInput(device: device, error: error)
if session.canAddInput(videoIn) {
session.addInput(videoIn)
}
if session.canAddOutput(metadata) {
session.addOutput(metadata)
}
metadata.setMetadataObjectsDelegate(self, queue: queue)
metadata.metadataObjectTypes = [AVMetadataObjectTypeUPCECode,
AVMetadataObjectTypeEAN13Code // UPC-A
];
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: AnyObject[]!, fromConnection connection: AVCaptureConnection!) {
if (metadataObjects.count > 0) {
println("beep: \(metadataObjects.count), start index: \(metadataObjects.startIndex)")
println("[0] = \(metadataObjects[0])")
}
}
}
以下是它如何以视觉方式布局。下面的预览视图是故事板中的IBOutlet
scanner.cameraLayer.frame = previewView.bounds
previewView.layer.addSublayer(scanner.cameraLayer)
答案 0 :(得分:2)
假设您的会话设置了以下内容:
AVCaptureSession *session = ...
...
AVCaptureMetadataOutput *output = ...
AVCaptureMetadataOutput
上有一个名为rectOfIntersect
的媒体资源。从Apple的文档中可以看出:
指定感兴趣的矩形可以提高检测性能 对于某些类型的元数据。边界不包含的元数据对象 不会返回与rectOfInterest相交的。
基本上,这将允许您自定义要检测条形码的矩形。
您可以尝试这样的事情:output.rectOfInterest = CGRectMake(x,y, 0.5, 0.5)
。这将创建一个矩形,它是预览窗口宽度的一半。默认值为(0,0,1,1)
。