TextRecognization

 avatar
unknown
objectivec
2 months ago
4.7 kB
4
Indexable
#import "CameraViewForSerialNumberDetection.h"

@interface CameraViewForSerialNumberDetection ()
@property (nonatomic, assign) BOOL isProcessingFrame;
@property (nonatomic, strong) dispatch_queue_t visionQueue;
@end

@implementation CameraViewForSerialNumberDetection

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blackColor];
    self.isProcessingFrame = NO;
    self.visionQueue = dispatch_queue_create("com.example.VisionQueue", DISPATCH_QUEUE_SERIAL);
    [self setupCamera];
    [self setupCloseButton];
}

// Setup the camera preview
- (void)setupCamera {
    self.session = [[AVCaptureSession alloc] init];
    self.session.sessionPreset = AVCaptureSessionPresetHigh;

    AVCaptureDevice *camera = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSError *error = nil;
    
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:camera error:&error];
    if (error) {
        NSLog(@"Error setting up camera: %@", error.localizedDescription);
        return;
    }

    [self.session addInput:input];

    AVCaptureVideoDataOutput *videoOutput = [[AVCaptureVideoDataOutput alloc] init];
    [videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];
    [self.session addOutput:videoOutput];

    self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
    self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.previewLayer.frame = self.view.bounds;
    [self.view.layer addSublayer:self.previewLayer];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        [self.session startRunning];
    });
}

// Delegate method: Processes each frame from the live camera feed
- (void)captureOutput:(AVCaptureOutput *)output
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
       fromConnection:(AVCaptureConnection *)connection {

    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
    [self recognizeTextFromImage: imageBuffer];
}

-(void) recognizeTextFromImage:(CVImageBufferRef )imageBuffer {
    
    VNImageRequestHandler *handler = [[VNImageRequestHandler alloc] initWithCVPixelBuffer:imageBuffer options:@{}];

    VNRecognizeTextRequest *textRequest = [[VNRecognizeTextRequest alloc] initWithCompletionHandler:^(VNRequest *request, NSError *error) {
        if (error) {
            NSLog(@"Text recognition error: %@", error.localizedDescription);
            return;
        }

        for (VNRecognizedTextObservation *observation in request.results) {
            VNRecognizedText *topCandidate = [[observation topCandidates:1] firstObject];
            if (topCandidate) {
                NSString *recognizedText = topCandidate.string;
                if ([self isValidSerial:recognizedText]) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self dismissViewControllerAnimated:YES completion:^{
                            [[NSNotificationCenter defaultCenter] postNotificationName:@"NotificationForScannedSerialNumber" object:recognizedText];
                        }];
                    });
                }
            }
        }
    }];
    
    textRequest.recognitionLevel = VNRequestTextRecognitionLevelAccurate;
    
    NSError *error = nil;
    [handler performRequests:@[textRequest] error:&error];

    if (error) {
        NSLog(@"Error performing text recognition: %@", error.localizedDescription);
    }
}

- (void)setupCloseButton {
    
    UIButton *closeButton = [UIButton buttonWithType:UIButtonTypeSystem];
    UIImage *closeImage = [UIImage systemImageNamed:@"xmark"];
    [closeButton setImage:closeImage forState:UIControlStateNormal];
    CGFloat buttonSize = 40;
    closeButton.frame = CGRectMake(self.previewLayer.frame.size.width - 60, 50, buttonSize, buttonSize);
    closeButton.tintColor = [UIColor whiteColor];
    closeButton.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    closeButton.layer.cornerRadius = buttonSize / 2;
    closeButton.clipsToBounds = YES;
    closeButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);
    [closeButton addTarget:self action:@selector(closeScanner) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:closeButton];
}

- (void)closeScanner {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (BOOL)isValidSerial:(NSString *)serialNumberStr {
    if ([serialNumberStr length] > 0) {
        String sn = StringFromNSString(serialNumberStr);
        sn.trim();
        try {
            SerialNumber serial(sn);
            return serial.isValid();
        } catch (...) {}
    }
    return NO;
}

@end

Editor is loading...
Leave a Comment