所以我正在尝试使用 AVCaptureMetadataOutput 来扫描二维码。我遇到的问题是,即使我使用 rectOfInterest,扫描也可能发生在预览区域之外,请参见下图:
代码如下:
- (void)capture
{
session = [[AVCaptureSession alloc] init];
device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ( [device lockForConfiguration:NULL] == YES ) {
CGPoint point = CGPointMake(0.5,0.5);
[device setFocusPointOfInterest:point];
[device setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
[device unlockForConfiguration];
}
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device
error:&error];
if (!input)
{
NSLog(@"Error: %@", error);
return;
}
[session addInput:input];
//Add the metadata output device
output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutpututput];
output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode, AVMetadataObjectTypeCode128Code];
output.rectOfInterest = self.livevideo.bounds;
newCaptureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
newCaptureVideoPreviewLayer.frame = self.livevideo.bounds;
newCaptureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
[self.livevideo.layer insertSublayer:newCaptureVideoPreviewLayer above:self.livevideo.layer];
highlightView = [[UIView alloc] init];
highlightView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin;
highlightView.layer.borderColor = [UIColor greenColor].CGColor;
highlightView.layer.borderWidth = 3;
[self.livevideo addSubview:highlightView];
[session startRunning];
}
- (void)captureOutputAVCaptureOutput *)captureOutput
didOutputMetadataObjectsNSArray *)metadataObjects
fromConnectionAVCaptureConnection *)connection
{
AVMetadataMachineReadableCodeObject *barCodeObject;
CGRect highlightViewRect = CGRectZero;
for (AVMetadataObject *metadata in metadataObjects)
{
for (NSString *type in output.metadataObjectTypes) {
if ([metadata.type isEqualToString:type])
{
barCodeObject = (AVMetadataMachineReadableCodeObject *)[newCaptureVideoPreviewLayer transformedMetadataObjectForMetadataObjectAVMetadataMachineReadableCodeObject *)metadata];
highlightViewRect = barCodeObject.bounds;
@try {
NSString *code =[barCodeObject stringValue];
NSLog(@"Read type: %@", type);
self.barcode.text = code;
}
@catch (NSException *exception) {
NSLog(@"%@", exception.reason);
}
break;
}
}
}
highlightView.frame = highlightViewRect;
}
Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.
所以,如果二维码与矩形完全相交,就会被检测到。
关于ios - AVCaptureMetadataOutput, rectOfInterest 扫描外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20195186/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |