• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - AVCaptureMetadataOutput, rectOfInterest 扫描外部

[复制链接]
菜鸟教程小白 发表于 2022-12-12 16:45:34 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

所以我正在尝试使用 AVCaptureMetadataOutput 来扫描二维码。我遇到的问题是,即使我使用 rectOfInterest,扫描也可能发生在预览区域之外,请参见下图:

Scans outside

代码如下:

- (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;
}



Best Answer-推荐答案


那是documented behavior :

Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.

所以,如果二维码与矩形完全相交,就会被检测到。

关于ios - AVCaptureMetadataOutput, rectOfInterest 扫描外部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20195186/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap