TextRecognization
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