如何让我的扫描仪应用程序看起来像iOS上的Fooducate?

时间:2014-08-03 01:47:30

标签: ios objective-c barcode-scanner

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)

fooducate scanner ios enter image description here

1 个答案:

答案 0 :(得分:2)

假设您的会话设置了以下内容:

AVCaptureSession *session = ...
...
AVCaptureMetadataOutput *output = ...

AVCaptureMetadataOutput上有一个名为rectOfIntersect的媒体资源。从Apple的文档中可以看出:

  

指定感兴趣的矩形可以提高检测性能   对于某些类型的元数据。边界不包含的元数据对象   不会返回与rectOfInterest相交的。

基本上,这将允许您自定义要检测条形码的矩形。

您可以尝试这样的事情:output.rectOfInterest = CGRectMake(x,y, 0.5, 0.5)。这将创建一个矩形,它是预览窗口宽度的一半。默认值为(0,0,1,1)